You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pandas中创建支持自定义偏移重叠窗口的滑动均值列

实现方案

我们可以通过组合rolling和shift方法实现自定义偏移的滑动窗口计算,核心逻辑是通过两个参数灵活控制窗口相对于当前行的覆盖范围:

  • left_size:当前行向前包含的行数(不含当前行)
  • right_size:当前行向后包含的行数(不含当前行)
    窗口总大小 = left_size + 1 + right_size,完全可以满足任意偏移组合的需求,同时支持访问未来数据。

通用实现代码

import pandas as pd
import numpy as np
from random import randint

# 生成测试数据,和原有逻辑一致
np.random.seed(42) # 固定随机种子方便复现结果
data = [randint(0, 9) for p in range(0, 20)]
time = np.arange(0,20,1)
df = pd.DataFrame(list(zip(time, data)), columns=['time', 'data'])

def sliding_window_mean(series, left_size, right_size):
    window_total = left_size + 1 + right_size
    # 先计算滚动均值,再通过shift把结果对齐到当前行
    return series.rolling(window_total, min_periods=window_total).mean().shift(-right_size)

# 需求1:窗口大小5,当前行前2个、后2个(left_size=2,right_size=2)
df['mean_before2_after2'] = sliding_window_mean(df['data'], left_size=2, right_size=2)

# 需求2:窗口大小5,当前行前1个、后3个(left_size=1,right_size=3)
df['mean_before1_after3'] = sliding_window_mean(df['data'], left_size=1, right_size=3)

print(df)

补充说明

  • 窗口覆盖不到的首尾行会默认返回NaN,如果需要填充边缘值,可以在rolling方法中调整min_periods参数,比如设置min_periods=1就会用窗口内可用的数值计算均值,不会返回空值。
  • 如果仅需要窗口居中的场景,直接用df['data'].rolling(5, center=True).mean()也可以实现前2后2的效果,但该方法不支持自定义偏移,通用度低于上述方案。

实现原理

pandas默认rolling(n)的计算结果会对齐到窗口的最后一个索引,比如窗口大小为5时,前4行因为凑不够5个数据返回空,第4行(索引从0开始)的结果是索引0-4的均值。我们通过shift(-right_size)把结果向上移动对应行数,就能让窗口结果对齐到目标当前行位置,自然就可以访问到未来的数据。

内容的提问来源于stack exchange,提问作者connor449

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:06:04