如何以一天

时间:2015-12-29 07:45:29

标签: python pandas

我有超过30年的股票数据。我想要做的是使用 rolling_apply() 计算一年内股票是涨还是跌。

频率为一天,窗口为252, min_period 为2天。

由于大量的数据试图避免for循环,因为它会大大减慢执行速度,而pandas似乎是最好的选择。

这里是样本数据的图像。

the data enter image description here 我想要实现的是例如在输入日期,例如2015-12-22之后,滚动功能应该计算从2015-12-22到2014-12-22的年份是否值open_price(在2015-12-2) - close_price(2014-12-22)增加或减少,然后将值从2014-12-22返回到2013-12-22一直到1997年。然后做同样的事情2015-12-23,一直到2015-12-31。

返回的价值应该是股票上涨的年数。例如,给出第一个日期,例如2015-12-22,开盘价为 663.xx 并且在2014-12-22收盘价 660.00 ,股价上涨因此增加了一个反击。然后,如果股票从2014-12-22上升到2013-12-22,它应该增加计数器直到达到数据的最后一年,即如果有30年并且它上升了14值,则返回14日期然后它应滚动到其他日期并执行相同的操作。

import pandas as pd
import numpy  as np

Data = pd.io.parsers.read_csv( "amzn.csv" ) # Reading data from the csv

def append_date( Data ):                    # Appending year mont and day column
    data = Data
    data['date'] = pd.to_datetime( data.Date )
    data['year'], data['month'], data['day'] = data['date'].dt.year, \
                                               data['date'].dt.month, \
                                               data['date'].dt.day
    num_of_yrs   = np.size( np.where( ( np.unique( data['year'].values ))))
    data.ix[:,0] = pd.to_datetime( data.ix[:,0] )
    del data['date']
    return data, num_of_yrs

Data_datetime, num_of_years= a ppend_date( Data )

        Date        Open        High         Low       Close   Volume  \
     0 2015-12-23  666.500000  666.599976  656.630005  663.700012  2714900   
     1 2015-12-22  666.830017  668.489990  659.260010  663.150024  2664000   
     2 2015-12-21  668.500000  669.900024  658.929993  664.510010  3197500   
     3 2015-12-18  668.650024  676.840027  664.130005  664.140015  6765900   
     4 2015-12-17  680.000000  682.500000  670.650024  670.650024  3663500   

   Adj Close  year  month  day  
0  663.700012  2015     12   23  
1  663.150024  2015     12   22  
2  664.510010  2015     12   21  
3  664.140015  2015     12   18  
4  670.650024  2015     12   17  

1 个答案:

答案 0 :(得分:0)

这是你想要做的吗?

import pandas as pd

def up_over_period(s):
    """Check if most recent value in Series is greater than the earliest.
    """
    return s[0] > s[-1]

#Reading data from the csv
df = pd.read_csv("amzn.csv")

period = 253

df['UpOnYear'] = pd.rolling_apply(
    df['Close'], 
    window=period, 
    func=up_over_period, 
    )

在回复评论时编辑

s = pd.rolling_apply(
    df['Close'], 
    window=period, 
    func=up_over_period, 
    ).shift(-period + 1)[::-1]

s = (s.groupby((s != s.shift()).cumsum()).cumsum() / (period - 1)).apply(math.ceil)

df['ConsecPeriodsUp'] = s