python numpy实现rolling滚动案例

作者:brucewong0516 时间:2023-08-24 17:12:45 

相比较pandas,numpy并没有很直接的rolling方法,但是numpy 有一个技巧可以让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中,DataFrame和Seies都有一个针对滚动窗口的函数,叫做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为窗口的最右侧,向左侧取,默认为False,要注意的是,当为True时,如果窗口长度为奇数,则中心位置很好确定,就是最中间的位置,但是如果长度为偶数,则默认中心位置为中间偏右的那一个位置;win_type参数表示不同的窗口类型,可以通过这个参数给窗口成员赋予不同的权重,默认为等权重;on参数表示指定对某一列进行rolling,而不是默认的对index进行rolling,要注意的是,当指定on参数时,指定的列必须是时间序列,不然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
01
12
23
35

df.rolling(3,min_periods=2).sum()
    a
0NaN
13.0
26.0
310.0

df.rolling(4,min_periods=2,center=True).sum()
    a
03.0
16.0
211.0
310.0

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

从以上可以看出,rolling的窗口可以向前取值,向两边取值,但是没有向后取值,实际上只需要把原序列倒序排列后再向前取值就可以实现向后取值。下面我们再讲一下expanding函数,其为DataFrame.expanding(min_periods=1, center=False, axis=0),其中参数的意义和rolling一样,只是其不是固定窗口长度,其长度是不断的扩大的。

来源:https://blog.csdn.net/brucewong0516/article/details/84840469

标签:python,numpy,rolling,滚动
0
投稿

猜你喜欢

  • 求英文字母或数字或下划线或汉字的js正则表达式

    2009-08-04 17:59:00
  • 宝塔部署django项目的实现步骤(图文教程)

    2021-09-01 00:25:27
  • Python FTP操作类代码分享

    2022-09-07 17:59:23
  • Python OpenCV图像颜色变换示例

    2023-07-30 06:05:00
  • 学以致用驳ASP低能论

    2007-08-22 14:47:00
  • ASP.NET连接 Access数据库的几种方法

    2024-01-25 15:31:09
  • django框架F&Q 聚合与分组操作示例

    2021-05-21 02:13:56
  • Python绘制三角函数图(sin\\cos\\tan)并标注特定范围的例子

    2021-06-17 17:53:29
  • asp无限级分类加js收缩伸展功能代码

    2009-12-08 12:25:00
  • Python中Subprocess的不同函数解析

    2022-03-10 05:23:00
  • 小看了setTimeout()

    2009-12-04 12:44:00
  • 文档对象模型DOM通俗讲解

    2024-05-13 09:36:55
  • 浅析Go设计模式之Facade(外观)模式

    2023-07-16 19:23:08
  • 详解Golang实现http重定向https的方式

    2024-05-09 09:47:02
  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    2024-05-22 10:30:50
  • asp如何将RGB颜色转化成到16进制的?

    2009-11-26 20:41:00
  • linux mysql 报错:MYSQL:The server quit without updating PID file

    2024-01-22 08:40:47
  • 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法分享

    2024-01-16 17:28:39
  • SQL Server实现分布式数据库系统的终极目标

    2010-08-05 14:57:00
  • 基于Python创建可定制的HTTP服务器

    2023-08-09 22:46:09
  • asp之家 网络编程 m.aspxhome.com