【发布时间】:2018-07-26 08:40:49
【问题描述】:
我想在 pandas 中使用滚动时间窗口作为前瞻性窗口。我该怎么做?
import pandas as pd
data = pd.DataFrame({'t': ['2017-02-02 15:00:01',
'2017-02-02 15:00:02',
'2017-02-02 15:01:00',
'2017-02-02 15:03:05',
'2017-02-02 15:08:00'],
'value': [1, 2, 3, 14, 5]})
data['t'] = data['t'].apply(pd.to_datetime)
data = data.set_index('t')
backward_max = data.rolling('300s').max() # yields [1, 2, 3, 14, 14]
forward_max = '???' # should yield [14, 14, 14, 14, 5]
问题是由于观察之间的时间差异不相等,我不能简单地将结果从向后看的窗口转移。
我可以计算反向顺序的假时间戳并使用向后时间窗口,这可以从 here 导出,但我几乎可以肯定还有一种更优雅的方法。
编辑:将所有时间戳更改为同一天,并提供以下解决方法代码,尽管它并不优雅。
data2 = data.reset_index()
data2['t2'] = max(data2['t']) - (data2['t'] - min(data2['t']))
data2 = data2.set_index('t2').sort_index()
forward_max = np.flip(data2.rolling('300s')['value'].max().values, axis=0)
【问题讨论】:
-
为什么最后一个是 5 ?而不是 14 ?
-
点的值为 [1, 2, 3, 14, 5]。一个从最后一点开始的前视窗只包含那个点,所以最大值就是最后一点的值,即5。
-
基于时间的窗口移动(或向后滚动)绝对是 pandas 中缺少的功能。假时间戳是我能够有效地做到这一点的唯一方法(对于通用的非等间距数据)。