pandas滑动窗口学习笔记(shift, diff, pct_change)

 更新时间:2024年03月20日 11:42:30   作者:风雪云侠  
pandas中有3类窗口,分别是滑动窗口rolling 、扩张窗口expanding以及指数加权窗口ewm,下面就来详细的介绍一下这三种的用法,感兴趣的可以了解一下

窗口对象

pandas 中有3类窗口,分别是滑动窗口 rolling 、扩张窗口 expanding 以及指数加权窗口 ewm 。

滑窗对象

要使用滑窗函数,就必须先要对一个序列使用 .rolling 得到滑窗对象,其最重要的参数为窗口大小 window 。

In [95]: s = pd.Series([1,2,3,4,5])

In [96]: roller = s.rolling(window = 3)

In [97]: roller
Out[97]: Rolling [window=3,center=False,axis=0]

在得到了滑窗对象后,能够使用相应的聚合函数进行计算,需要注意的是窗口包含当前行所在的元素,例如在第四个位置进行均值运算时,应当计算(2+3+4)/3,而不是(1+2+3)/3

In [98]: roller.mean()
Out[98]: 
0    NaN
1    NaN
2    2.0
3    3.0
4    4.0
dtype: float64

In [99]: roller.sum()
Out[99]: 
0     NaN
1     NaN
2     6.0
3     9.0
4    12.0
dtype: float64

对于滑动相关系数或滑动协方差的计算,可以如下写出:

In [100]: s2 = pd.Series([1,2,6,16,30])

In [101]: roller.cov(s2)
Out[101]: 
0     NaN
1     NaN
2     2.5
3     7.0
4    12.0
dtype: float64

In [102]: roller.corr(s2)
Out[102]: 
0         NaN
1         NaN
2    0.944911
3    0.970725
4    0.995402
dtype: float64

此外,还支持使用 apply 传入自定义函数,其传入值是对应窗口的 Series ,例如上述的均值函数可以等效表示:

In [103]: roller.apply(lambda x:x.mean())
Out[103]: 
0    NaN
1    NaN
2    2.0
3    3.0
4    4.0
dtype: float64

shift, diff, pct_change 是一组类滑窗函数,它们的公共参数为 periods=n ,默认为1,这里的 n 可以为负,表示反方向的类似操作。

函数说明
shift取向前第 n 个元素的值
diff与向前第 n 个元素做差(与 Numpy 中不同,后者表示 n 阶差分)
pct_change与向前第 n 个元素相比计算增长率
In [104]: s = pd.Series([1,3,6,10,15])

In [105]: s.shift(2)
Out[105]: 
0    NaN
1    NaN
2    1.0
3    3.0
4    6.0
dtype: float64

In [106]: s.diff(3)
Out[106]: 
0     NaN
1     NaN
2     NaN
3     9.0
4    12.0
dtype: float64

In [107]: s.pct_change()
Out[107]: 
0         NaN
1    2.000000
2    1.000000
3    0.666667
4    0.500000
dtype: float64

In [108]: s.shift(-1)
Out[108]: 
0     3.0
1     6.0
2    10.0
3    15.0
4     NaN
dtype: float64

In [109]: s.diff(-2)
Out[109]: 
0   -5.0
1   -7.0
2   -9.0
3    NaN
4    NaN
dtype: float64

将其视作类滑窗函数的原因是,它们的功能可以用窗口大小为 n+1 的 rolling 方法等价代替

In [110]: s.rolling(3).apply(lambda x:list(x)[0]) # s.shift(2)
Out[110]: 
0    NaN
1    NaN
2    1.0
3    3.0
4    6.0
dtype: float64

In [111]: s.rolling(4).apply(lambda x:list(x)[-1]-list(x)[0]) # s.diff(3)
Out[111]: 
0     NaN
1     NaN
2     NaN
3     9.0
4    12.0
dtype: float64

In [112]: def my_pct(x):
   .....:     L = list(x)
   .....:     return L[-1]/L[0]-1
   .....: 

In [113]: s.rolling(2).apply(my_pct) # s.pct_change()
Out[113]: 
0         NaN
1    2.000000
2    1.000000
3    0.666667
4    0.500000
dtype: float64

扩张窗口

扩张窗口又称累计窗口,可以理解为一个动态长度的窗口,其窗口的大小就是从序列开始处到具体操作的对应位置,其使用的聚合函数会作用于这些逐步扩张的窗口上。具体地说,设序列为a1, a2, a3, a4,则其每个位置对应的窗口即[a1]、[a1, a2]、[a1, a2, a3]、[a1, a2, a3, a4]。

In [114]: s = pd.Series([1, 3, 6, 10])

In [115]: s.expanding().mean()
Out[115]: 
0    1.000000
1    2.000000
2    3.333333
3    5.000000
dtype: float64

cummax, cumsum 函数是典型的类扩张窗口函数,请使用 expanding 对象依次实现它们。

s = pd.Series([1, 3, 6, 10])

#cumsum
s.expanding().sum()

0    1.000000
1    2.000000
2    3.333333
3    5.000000
dtype: float64

#cummax
s.expanding().max()

0     1.0
1     3.0
2     6.0
3    10.0
dtype: float64

指数加权窗口

作为扩张窗口的 ewm 窗口
在扩张窗口中,用户可以使用各类函数进行历史的累计指标统计,但这些内置的统计函数往往把窗口中的所有元素赋予了同样的权重。事实上,可以给出不同的权重来赋给窗口中的元素,指数加权窗口就是这样一种特殊的扩张窗口。
其中,最重要的参数是 alpha,它决定了默认情况下的窗口权重为
wi​=(1−α)i,i∈{0,1,2,...,t},其中i=t 表示当前元素, i=0 表示序列的第一个元素。

从权重公式可以看出,离开当前值越远则权重越小,若记原序列为 x ,更新后的当前元素为 yt ,此时通过加权公式归一化后可知:

对于 Series 而言,可以用 ewm 对象如下计算指数平滑后的序列:

In [118]: np.random.seed(0)

In [119]: s = pd.Series(np.random.randint(-1,2,30).cumsum())

In [120]: s.head()
Out[120]: 
0   -1
1   -1
2   -2
3   -2
4   -2
dtype: int32

In [121]: s.ewm(alpha=0.2).mean().head()
Out[121]: 
0   -1.000000
1   -1.000000
2   -1.409836
3   -1.609756
4   -1.725845
dtype: float64

到此这篇关于pandas滑动窗口学习笔记(shift, diff, pct_change)的文章就介绍到这了,更多相关pandas滑动窗口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Python+Opencv实战之人脸追踪详解

    Python+Opencv实战之人脸追踪详解

    人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息。本文将展示OpenCV Python实现人脸追踪的示例代码,需要的可以参考一下
    2021-11-11
  • 用python 绘制茎叶图和复合饼图

    用python 绘制茎叶图和复合饼图

    这篇文章主要介绍了用python 绘制茎叶图和复合饼图,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-02-02
  • Python算法思想集结深入理解动态规划

    Python算法思想集结深入理解动态规划

    这篇文章主要为大家介绍了Python算法思想集结深入理解动态规划详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • python tkinter控件treeview的数据列表显示的实现示例

    python tkinter控件treeview的数据列表显示的实现示例

    本文主要介绍了python tkinter控件treeview的数据列表显示的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 利用Python读取微信朋友圈的多种方法总结

    利用Python读取微信朋友圈的多种方法总结

    这篇文章主要给大家介绍了关于如何利用Python读取微信朋友圈的多种方法,对于一个新手来说如果单独的去爬取朋友圈的话,难度会非常大,可以借鉴这篇文章的内容,需要的朋友可以参考下
    2021-08-08
  • Python内省与反射巧妙运用示例

    Python内省与反射巧妙运用示例

    这篇文章主要为大家介绍了Python内省与反射巧妙运用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • python连接读写操作redis的完整代码实例

    python连接读写操作redis的完整代码实例

    这篇文章主要介绍了python连接读写操作redis的完整代码实例,包括redis连接与读写操作,redis-sentinel哨兵模式下Python操作redis,redis-cluster(集群)模式下Python操作redis,需要的朋友可以参考下
    2023-01-01
  • Python编程mac下使用pycharm小技巧

    Python编程mac下使用pycharm小技巧

    这篇文章主要介绍了Python编程中在mac下使用pycharm的一些小技巧,建议正在使用Pycharm的同学们可以收藏阅读,可以节省你的编程时间
    2021-09-09
  • Python爬虫信息输入及页面的切换方法

    Python爬虫信息输入及页面的切换方法

    今天小编就为大家分享一篇Python爬虫信息输入及页面的切换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python ftfy库处理金融方面文件编码错误实例详解

    python ftfy库处理金融方面文件编码错误实例详解

    这篇文章主要为大家介绍了使用python ftfy库处理金融方面文件编码错误实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论