Python 熊猫:如何计算一个变量在过去几天内的滚动和,但仅在给定的时间?
我有一个如下的数据帧Python 熊猫:如何计算一个变量在过去几天内的滚动和,但仅在给定的时间?,python,pandas,Python,Pandas,我有一个如下的数据帧 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:
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的和的变量
- 过去5天(不包括当前观察结果)
- 仅考虑与当前观测时间完全相同的观测值
换言之:
在索引2000-01-01 00:00:00
,df['rolling\u sum\u same\u hour']
包含数据中过去5天00:00:00
观察到的X值的总和(当然不包括2000-01-01
)李>
在索引2000-01-01 00:01:00
,df['rolling\u sum\u same\u hour']
包含过去5天内00:00:01
观察到的X的总和,依此类推李>
直观的想法是,日内价格具有日内季节性,我想通过这种方式消除它
我尝试使用df['rolling\u sum\u same\u hour']=df.at\u time(df.index.minute)。rolling(window=5.sum()
没有成功。
有什么想法吗
非常感谢 看看群比的力量吧
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将对列起作用-它现在对时间组起作用),然后应用您想要的函数 IIUC,您要做的是执行滚动求和,但仅对按一天中完全相同的时间分组的观测值执行。这可以通过以下方式完成:
df.X.groupby([df.index.hour, df.index.minute]).apply(lambda g: g.rolling(window=5).sum())
(请注意,您的问题在5到10个句点之间交替出现。)例如:
In [43]: df.X.groupby([df.index.hour, df.index.minute]).apply(lambda g: g.rolling(window=5).sum()).tail()
Out[43]:
2000-02-04 17:15:00 -2.135887
2000-02-04 17:16:00 -3.056707
2000-02-04 17:17:00 0.813798
2000-02-04 17:18:00 -1.092548
2000-02-04 17:19:00 -0.997104
Freq: T, Name: X, dtype: float64
您可以尝试布尔索引:df['rolling\u sum\u same\u hour']=df[df.index.hour==16]。rolling(window=10.sum()
。你可以让过滤器任意细化,以计算分钟、秒等,但它确实会变得冗长……mehIt不清楚。对于小时之间的行(例如:00:00
和01:00
-['00:01','00:02','00:02','00:59']
),您希望在rolling\u sum\u same\u hour
列中有哪些值?@Noobie:更不用说我对您的建议没有问题了!嗨,伙计们,很抱歉我说的模棱两可。要点如下:对于数据中的每一行A,保留与当前观察A同时发生的过去n天的观察结果。我认为问题现在更清楚了。再次感谢你的帮助!谢谢@starfox,但我需要原始数据框中包含rollingsum列@Noobie:它应该和我刚做的编辑一样简单,除非我疯了,否则看起来很不错,也许除了我不应该考虑当前的观察之外。x.rolling(10).shift(1).sum()
是否可以排除总和中的当前OB?更明确一点,如果忽略shift()
,2000-01-01到2000-01-10的滚动总和将出现在该2000-01-10。包括shift()
,1月1日至1月10日的滚动总和将出现在索引2000-01-11中。