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

如何在Python中为pandas.rolling实现步幅(stride)功能?

Pandas实现带间隔的滚动窗口求和(窗口步长1,窗口内元素间隔固定)

问题场景

需要实现一种特殊的滚动窗口计算:窗口每次移动1步,但窗口内的元素不是连续的,而是按固定间隔从原数据中选取。例如窗口大小为3、间隔为3时,第6行的窗口包含第6、3、0行的元素,第7行包含第7、4、1行的元素,以此类推。

实现方法

方法1:手动移位求和(简单直观)

对于固定的窗口大小和间隔,直接通过shift()方法将数据移位对应步数后求和,再对前窗口大小×间隔 -1行填充NaN即可:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({'value': range(10)})

# 参数定义
window_size = 3
stride = 3

# 生成移位后的序列并求和
sum_series = sum(df['value'].shift(i * stride) for i in range(window_size))

# 前 window_size*stride -1 行设为缺失值
sum_series.iloc[:window_size * stride - 1] = pd.NA

print(sum_series)

输出:

0     <NA>
1     <NA>
2     <NA>
3     <NA>
4     <NA>
5     <NA>
6       9.0
7      12.0
8      15.0
9      18.0
dtype: float64

方法2:Numpy滑动窗口优化(高效处理大数据)

当数据量较大或需要灵活调整参数时,用Numpy的索引操作可以提升效率:

import pandas as pd
import numpy as np

df = pd.DataFrame({'value': range(10)})
window_size = 3
stride = 3

values = df['value'].values
min_valid_idx = window_size * stride - 1

# 生成所有有效索引对应的窗口元素并求和
valid_indices = np.arange(min_valid_idx, len(df))
result_values = [values[i - np.arange(window_size)*stride].sum() for i in valid_indices]

# 构建完整结果序列
full_result = pd.Series(pd.NA, index=df.index)
full_result.loc[valid_indices] = result_values

print(full_result)

方法3:封装自定义函数(复用性强)

如果需要多次使用该逻辑,可以封装成通用函数,支持不同的窗口大小和间隔:

import pandas as pd
import numpy as np

def strided_rolling_sum(series, window_size, stride):
    min_valid_idx = window_size * stride - 1
    result = pd.Series(pd.NA, index=series.index)
    
    if len(series) <= min_valid_idx:
        return result
    
    values = series.values
    for i in range(min_valid_idx, len(series)):
        window_elements = values[i - np.arange(window_size)*stride]
        result.iloc[i] = window_elements.sum()
    
    return result

# 调用示例
df = pd.DataFrame({'value': range(10)})
print(strided_rolling_sum(df['value'], window_size=3, stride=3))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:41:56