首页 > 解决方案 > pandas.DataFrame.rolling() 与基于时间的窗口的有效使用

问题描述

我需要在一些稀疏的日期时间索引 DataFrame 的滚动窗口上应用一个函数(行之间的时间间隔是不同的)。窗口大小由偏移量指定:

def value_diff(x):
    return (x[-1] - x[0]) / x[0] * 100

diff = df['value'].rolling(window='10min').apply(value_diff)

我需要结果的第一个值基于至少 10 分钟的数据。

不幸的是,该rolling()函数的 min_periods 参数不接受偏移量,只接受点的数量,并且我无法为其指定固定值,因为一个窗口中的元素数量会有所不同。

运行此代码后,我得到一个 Series 对象,该对象value_diff()从 DataFrame 列的最开始应用函数的结果开始,而窗口仅包含 1 个元素,然后是 2 个元素,3 个元素等等。

我可以跑步diff = duff.truncate(before=diff.index[0] + timedelta(minutes=10), copy=False),但如果对我来说感觉有些低效。有没有办法避免在开始时将滚动功能应用于不完整的窗口,然后截断不可靠的数据,而无需完全重写rolling()

标签: pythonpandastime-series

解决方案


我认为您必须重建丢失的时间戳才能应用具有固定长度的滚动函数,例如:

# build an irregular ts
series = pd.Series(np.ones(60))
series.index = pd.date_range(datetime(2010, 1, 1, 13, 0), periods=60, freq='1min')
series = series.sample(20, random_state=33).sort_index()

# reconstruct the series with every timestamp and apply a rolling function
series = series.reindex(pd.date_range(datetime(2010, 1, 1, 13, 0), periods=60, freq='1min'), fill_value=0)
series.rolling(10).sum() # 10 min function

推荐阅读