Python NumPy实现Rolling滚动窗口计算详解

Ruby
Ruby
发布时间:2026-10-14| 5人浏览过
原创

本文介绍如何在Python中使用NumPy实现类似Pandas的rolling滚动窗口功能。通过调整数组形状和步幅,利用NumPy底层C代码执行高效循环。文章详细解析了滚动窗口的参数设置、计算方法及与Pandas rolling函数的区别,并提供具体代码示例,帮助开发者在时间序列数据分析中灵活应用滚动计算。

NumPy实现Rolling滚动窗口的方法

与Pandas不同,NumPy没有直接提供rolling方法,但可以通过一种技巧让NumPy在C代码内部执行此类循环操作。

该技巧的核心在于添加一个与窗口大小相同的额外维度,并设置适当的步幅。


import numpy as np
data = np.arange(20)
def rolling_window(a, window):
  shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
  strides = a.strides + (a.strides[-1],)
  return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

rolling_window(data,10)
Out[12]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
    [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
    [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
    [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
    [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
    [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
    [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
    [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])

np.mean(rolling_window(data,10))
Out[13]: 9.5

np.mean(rolling_window(data,10),-1)
Out[14]: array([ 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5])

Pandas中Rolling与Expanding函数解析

补充知识:了解Pandas中的rolling函数和expanding函数。

在数据分析,尤其是时间序列分析中,常需对序列进行固定长度窗口的滚动计算,如计算移动均线。任何从时序生成新时序的需求,通常都涉及窗口滚动。Pandas中,DataFrame和Series均提供rolling()函数,其参数包括:DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)。

参数window可为正整数或offset(时间区间长度),用于设定窗口长度;min_periods指定窗口内所需的最小观测值,若窗口成员数少于该值,计算结果返回NaN。例如,min_periods设为3而窗口仅有两个成员时,对应位置返回空值;center参数设为True时,以当前label为中心向两侧取值,False(默认)则以当前label为窗口最右侧向左取值。需注意,当center为True且窗口长度为偶数时,默认中心位置为中间偏右;win_type参数用于指定窗口类型及成员权重,默认为等权重;on参数指定对特定列进行rolling操作而非默认对index操作,且指定列必须为时间序列,否则rolling函数失效。

以下示例中,窗口长度为3,min_periods设为2。首个元素为NaN,因第一个窗口仅含一个值1,不满足min_periods=2的要求,故返回空值;从第二个元素开始才有非空值,这体现了min_periods的作用。当center设为True且窗口长度为偶数4时,如窗口[a,b,c,d],中心值为偏右的c,此时第1个窗口覆盖元素为1和2,和为3。


import pandas as pd
import numpy as np
df=pd.DataFrame([1,2,3,5],columns=['a'])
df
	a
0	1
1	2
2	3
3	5
 
df.rolling(3,min_periods=2).sum()
     a
0	NaN
1	3.0
2	6.0
3	10.0
 
df.rolling(4,min_periods=2,center=True).sum()
     a
0	3.0
1	6.0
2	11.0
3	10.0

rolling函数返回window对象或rolling子类,可通过调用mean(),sum(),std(),count()等方法计算窗口值,或通过apply(func)自定义函数计算特定值,具体参考文档。

由上可知,rolling窗口可向前或向两侧取值,但无法直接向后取值。实际上,只需将原序列倒序排列后再向前取值即可实现向后取值。此外,介绍expanding函数,其定义为DataFrame.expanding(min_periods=1, center=False, axis=0),参数意义与rolling相同,但窗口长度不断扩展而非固定。

以上关于Python NumPy实现rolling滚动案例的内容分享完毕,希望能提供参考,并感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。