Pandas rolling函数整数窗口初始NaN,偏移窗口却无?如何自动返回NaN?
Pandas rolling时间窗口初始值非NaN的解决办法
当使用Pandas的rolling函数时,传入整数窗口参数(如3),在数据量未达到窗口大小前,结果会返回NaN;但传入等效的时间偏移参数(如'3D')时,却会直接计算当前已有数据的总和,不会返回NaN,示例如下:
import pandas as pd import numpy as np df = pd.DataFrame(index=pd.date_range('1/1/2020','1/31/2020',freq='D'),data={'A':np.arange(1,32,1)}) df['intWindow'] = df['A'].rolling(3).sum() df['offsetWindow'] = df['A'].rolling('3D').sum() print(df.head())
输出结果:
A intWindow offsetWindow 2020-01-01 1 NaN 1.0 2020-01-02 2 NaN 3.0 2020-01-03 3 6.0 6.0 2020-01-04 4 9.0 9.0 2020-01-05 5 12.0 12.0
差异原因
这不是计算不准确,而是两种窗口的逻辑不同:
- 整数窗口是固定观测数量的窗口:必须凑够指定数量的样本才会计算,不足则返回
NaN。 - 时间偏移窗口是基于时间范围的窗口:只要当前时间往前推偏移量范围内存在数据,就会计算这些数据的聚合值,不管数据数量多少。
解决方案:使用min_periods参数
Pandas没有直接让时间窗口返回初始NaN的开关,但可以通过min_periods参数实现需求。将min_periods设置为时间窗口对应的预期样本数量(比如每日频率下,'3D'对应3个样本),这样只有当窗口内至少有指定数量的数据时才会计算,否则返回NaN:
df['offsetWindow_fixed'] = df['A'].rolling('3D', min_periods=3).sum() print(df.head())
输出结果:
A intWindow offsetWindow offsetWindow_fixed 2020-01-01 1 NaN 1.0 NaN 2020-01-02 2 NaN 3.0 NaN 2020-01-03 3 6.0 6.0 6.0 2020-01-04 4 9.0 9.0 9.0 2020-01-05 5 12.0 12.0 12.0
如果你的时间序列频率不固定,无法提前确定预期样本数,可以先通过整数窗口标记非NaN的位置,再将时间窗口对应位置外的值设为NaN,不过这种场景下min_periods依然是更简洁的选择。
内容的提问来源于stack exchange,提问作者etotheipi
相关产品推荐
相关产品推荐

