我有30多年的股票数据。我想做的是用rolling_apply().计算股票在一年中是涨是跌。
频率为1天,窗为252,min_period为2天。
由于大量的数据,我试图避免一个for循环,因为它大大减慢了执行速度,熊猫似乎是最好的选择。
这里是样本数据的图像。

例如,我想要实现的是,在输入日期(如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,那么它就应该转到其他日期,并做同样的事情。
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 发布于 2015-12-29 11:09:28
这就是你想做的吗?
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'] = shttps://stackoverflow.com/questions/34506717
复制相似问题