设置center=True后Pandas Rolling mean未按预期显示缺失值求助
居中年度滚动窗口计算的问题分析与解决
问题背景
需要对月度时间序列计算居中年度滚动均值,要求首尾因窗口无法覆盖完整12个月数据时返回NaN,预期效果如下:
foo month 2016-08-01 NaN 2016-09-01 NaN 2016-10-01 NaN 2016-11-01 NaN 2016-12-01 NaN 2017-01-01 =mean(2016-08-01 to 2017-07-01) 2017-02-01 =mean(2016-09-01 to 2017-08-01)
测试数据前20行:
test.head(20) Out[39]: foo month 2016-08-01 -0.105854 2016-09-01 -0.120718 2016-10-01 -0.129150 2016-11-01 -0.114559 2016-12-01 -0.135669 2017-01-01 -0.140636 2017-02-01 -0.094412 2017-03-01 -0.139349 2017-04-01 -0.099603 2017-05-01 -0.076229 2017-06-01 -0.098049 2017-07-01 -0.108535 2017-08-01 -0.037598 2017-09-01 -0.181011 2017-10-01 -0.121715 2017-11-01 -0.089486 2017-12-01 -0.132886 2018-01-01 -0.063460 2018-02-01 -0.111066 2018-03-01 -0.130275
执行test.rolling('365D', min_periods=3, center=True).mean()后,首尾未返回预期的NaN,结果不符合需求。
原因分析
- 时间偏移窗口逻辑:
rolling('365D', center=True)会为每个时间点生成一个以该点为中心、前后各约182天的时间范围窗口。对于2016-08-01这类早期数据,窗口内包含后续已存在的5个数据(2016-08至2016-12),满足min_periods=3的要求,因此直接计算了均值,而非返回NaN。 - 需求匹配偏差:核心需求是仅当窗口覆盖完整12个月数据时才计算均值,但当前
min_periods=3的设置允许窗口内有3个及以上数据就返回结果;同时时间偏移窗口(365D)无法严格匹配“12个月度周期”(不同月份天数不同,365D可能包含11或13个自然月)。
解决方案
针对月度规则时间序列,推荐使用固定周期窗口替代时间偏移窗口,同时设置min_periods=12确保只有完整12个月数据时才计算:
# 居中滚动12个月均值,要求窗口内必须有12个完整数据 test_rolling = test.rolling(window=12, center=True, min_periods=12).mean()
执行后结果示例:
foo month 2016-08-01 NaN 2016-09-01 NaN 2016-10-01 NaN 2016-11-01 NaN 2016-12-01 NaN 2017-01-01 NaN # 窗口仅包含6个数据,不足12个 2017-02-01 NaN # 窗口包含7个数据,不足12个 ... 2017-07-01 -0.112138 # 窗口覆盖2016-08至2017-07,共12个数据 2017-08-01 -0.111067 # 窗口覆盖2016-09至2017-08,共12个数据 ...
若坚持使用时间偏移窗口,需将min_periods设为12,确保窗口内至少包含12个月度数据:
# 时间偏移窗口版本,要求窗口内至少12个数据 test_rolling = test.rolling('365D', center=True, min_periods=12).mean()
内容的提问来源于stack exchange,提问作者FooBar
相关产品推荐
相关产品推荐

