如何用Pandas实现回溯30天+前瞻3天的Leading and Trailing滚动平均?
Pandas实现回溯+前瞻滚动平均的简洁方法
Pandas完全具备简洁语法来实现回溯(Trailing)和前瞻(Leading)的滚动平均计算,针对你提到的「回溯30天、前瞻3天」的需求,用rolling结合shift就能快速实现,无需复杂逻辑。
核心实现思路
你需要的是对每个数据点,计算自身、过去30天内、未来3天内所有有效数据的均值(当回溯数据不足时,仅用现有可用数据,如示例中2022-04-01的情况)。
代码示例
假设你的数据已按日期排序,数据框为df,日期列是date,数值列是value:
- 先确保日期作为索引且排序:
df = df.sort_values('date').set_index('date')
- 计算回溯30天+前瞻3天的滚动平均:
# 窗口大小:回溯30天+当前+前瞻3天 = 34个数据点 window_size = 30 + 1 + 3 df['rolling_avg'] = df['value'].rolling(window=window_size, min_periods=1).mean().shift(-3)
代码解释
rolling(window=34):创建包含34个连续数据的滑动窗口min_periods=1:强制即使窗口内数据不足(如开头日期无足够回溯数据),也计算现有数据的均值,匹配你示例中的逻辑shift(-3):将窗口计算结果向前偏移3位,让原本对应「前瞻第3天」的均值对齐到当前数据行,正好对应当前行的回溯30天+前瞻3天的均值
处理缺失日期的场景
如果你的数据存在日历天缺失(比如周末无数据),需要严格按日历范围计算而非数据行数,可以用时间差作为窗口参数:
# 33天 = 30天回溯 + 3天前瞻的日历范围 df['rolling_avg'] = df['value'].rolling(window='33D', min_periods=1).mean().shift(-3)
内容的提问来源于stack exchange,提问作者tkansara
相关产品推荐
相关产品推荐

