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基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
python3+PyQt5实现柱状图
Apr 24 Python
Tesserocr库的正确安装方式
Oct 19 Python
python 返回列表中某个值的索引方法
Nov 07 Python
Python使用sklearn实现的各种回归算法示例
Jul 04 Python
python经典趣味24点游戏程序设计
Jul 26 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
Python logging日志库空间不足问题解决
Sep 14 Python
python实现简单的tcp 文件下载
Sep 16 Python
利用Pycharm连接服务器的全过程记录
Jul 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 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
图片懒加载imgLazyLoading.js使用详解
2020/09/15 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
python3 与python2 异常处理的区别与联系
2016/06/19 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
在django中自定义字段Field详解
2019/12/03 Python
Python 寻找局部最高点的实现
2019/12/05 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
小区物业门卫岗位职责
2014/04/10 职场文书
地球一小时宣传标语
2014/06/24 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
2016年元旦寄语
2015/08/17 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android