我有一个数据框如下
df = pd.DataFrame({ 'X' : np.random.randn(50000)}, index=pd.date_range('1/1/2000', periods=50000, freq='T'))
df.head(10)
Out[37]:
X
2000-01-01 00:00:00 -0.699565
2000-01-01 00:01:00 -0.646129
2000-01-01 00:02:00 1.339314
2000-01-01 00:03:00 0.559563
2000-01-01 00:04:00 1.529063
2000-01-01 00:05:00 0.131740
2000-01-01 00:06:00 1.282263
2000-01-01 00:07:00 -1.003991
2000-01-01 00:08:00 -1.594918
2000-01-01 00:09:00 -0.775230
我想创建一个包含X {/ p>的sum
的变量
换句话说:
2000-01-01 00:00:00
,df['rolling_sum_same_hour']
包含数据中过去5天内00:00:00
处观察到的X值的总和(当然不包括2000-01-01
)。 2000-01-01 00:01:00
,df['rolling_sum_same_hour']
包含过去5天内在00:00:01
观察到的X的总和,依此类推。 直观的想法是盘中价格具有盘中季节性,我想以这种方式摆脱它。
我尝试使用df['rolling_sum_same_hour']=df.at_time(df.index.minute).rolling(window=5).sum()
没有成功。 有什么想法吗?
非常感谢!
答案 0 :(得分:3)
看到groupby
的力量!
df = # as you defined above
df['rolling_sum_by_time'] = df.groupby(df.index.time)['X'].apply(lambda x: x.shift(1).rolling(10).sum())
它是吞下那里的大药丸,但我们按时间分组(如python datetime.time),然后获取我们关心的列(否则apply将在列上工作 - 它现在适用于时间-groups),然后应用你想要的功能!
答案 1 :(得分:2)
IIUC,您想要的是执行滚动总和,但仅限于按照完全相同的时间分组的观察结果。这可以通过
来完成isOpen
(请注意,您的问题会在5到10个句点之间交替出现。)例如:
df.X.groupby([df.index.hour, df.index.minute]).apply(lambda g: g.rolling(window=5).sum())