如何基于2个日历月滚动窗口计算DataFrame的均值与标准差
基于日历月的滚动均值与标准差计算
原始数据生成代码
import pandas as pd data = {'A': list(range(250)), 'B': list(range(251,501))} dates = pd.date_range('2023-01-17', periods=250, freq='D') df = pd.DataFrame(data, index=dates)
需求说明
- 计算基于2个日历月的滚动均值,预期输出格式如下:
A B 2023-02-28 21.0 272.0 2023-03-31 44.0 295.0 2023-04-30 73.0 324.0 … 2023-08-31 222.5 473.5
- 同时计算基于2个日历月的滚动标准差,预期输出格式如下:
A B 2023-02-28 12.556 12.556 2023-03-31 17.175 17.175 2023-04-30 17.175 17.175 … 2023-08-31 15.732 15.732
- 需支持DataFrame任意列存在NaN值的情况
解决方案
计算滚动均值
使用rolling指定时间窗口为2个日历月,再提取每个月末的计算结果:
# 计算2个日历月滚动均值,仅保留月末数据 rolling_mean = df.rolling(window='2M', closed='right').mean().resample('M').last()
计算滚动标准差
同理,替换为std()方法计算标准差:
# 计算2个日历月滚动标准差,仅保留月末数据 rolling_std = df.rolling(window='2M', closed='right').std().resample('M').last()
参数说明
window='2M':指定滚动窗口的时间跨度为2个日历月,自动适配不同月份的天数差异closed='right':窗口包含当前日期,即计算到当前日期为止的过去2个月内所有数据的统计量resample('M').last():筛选出每个月最后一天的计算结果,匹配预期输出的格式- NaN处理:默认
skipna=True,计算时会自动忽略列中的NaN值;若需要保留NaN(即窗口内存在NaN时结果为NaN),可在mean()/std()中设置skipna=False
验证示例结果
以2023-02-28的均值为例:
- 窗口覆盖2023-12-28至2023-02-28,但原始数据从2023-01-17开始,实际计算范围为2023-01-17至2023-02-28
- A列数值为0~42,均值为
(0+42)/2=21.0,与示例完全匹配
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

