python numpy实现rolling滚动案例


Posted in Python onJune 08, 2020

相比较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
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 相关文章推荐
Python EOL while scanning string literal问题解决方法
Sep 18 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
详解Python中 sys.argv[]的用法简明解释
Dec 20 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 Python
快速了解Python相对导入
Jan 12 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
python装饰器代码深入讲解
Mar 01 Python
Python如何向SQLServer存储二进制图片
Jun 08 #Python
python求numpy中array按列非零元素的平均值案例
Jun 08 #Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 #Python
使用Python FastAPI构建Web服务的实现
Jun 08 #Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 #Python
给ubuntu18安装python3.7的详细教程
Jun 08 #Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
Jun 08 #Python
You might like
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
php探针不显示内存解决方法
2019/09/17 PHP
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
理解JavaScript原型链
2016/10/25 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
python发送邮件脚本
2018/05/22 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
JAVA软件工程师测试题
2014/07/25 面试题
2015毕业实习推荐信
2015/03/23 职场文书
2015年新农合工作总结
2015/03/30 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL