神剑山庄资源网 Design By www.hcban.com

相比较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,numpy,rolling滚动

神剑山庄资源网 Design By www.hcban.com
神剑山庄资源网 免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
神剑山庄资源网 Design By www.hcban.com

评论“python numpy实现rolling滚动案例”

暂无python numpy实现rolling滚动案例的评论...

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。