如何在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
相关产品推荐
相关产品推荐

