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程序员面试题 你必须提前准备!
Jan 16 Python
flask中使用蓝图将路由分开写在不同文件实例解析
Jan 19 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 Python
python3.6+selenium实现操作Frame中的页面元素
Jul 16 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
python3中使用__slots__限定实例属性操作分析
Feb 14 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
django有哪些好处和优点
Sep 01 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
Python基于Faker假数据构造库
Nov 30 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抽象类 介绍
2012/06/13 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
Using the TextRange Object
2006/10/14 Javascript
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
Vue性能优化的方法
2020/07/30 Javascript
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
班长岗位职责
2013/11/10 职场文书
司机个人年终总结
2015/03/03 职场文书
毕业论文答辩开场白
2015/05/27 职场文书
同学会感言
2015/07/30 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python