我有超过30年的股票数据。我想要做的是使用 rolling_apply()
计算一年内股票是涨还是跌。
频率为一天,窗口为252, min_period
为2天。
由于大量的数据试图避免for循环,因为它会大大减慢执行速度,而pandas似乎是最好的选择。
这里是样本数据的图像。
the data
我想要实现的是例如在输入日期,例如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
答案 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