Pandas 窗口函数

Pandas 窗口函数,为了处理数字数据,Pandas提供了几种窗口函数,如移动窗口函数(rolling()),扩展窗口函数(expanding()),指数加权滑动(ewm()),并可以在其上调用适合的统计函数,如总和,均值,中位数,方差,协方差,相关性等。

下来学习如何在DataFrame对象上应用如上提及的每种方法。

移动窗口函数

.rolling()函数又叫移动窗口函数,此函数可以应用于一系列数据,指定参数window=n,并在其上调用适合的统计函数。

rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
参数 说明
window 可选参数,表示时间窗的大小,注意有两种形式(int 或 offset)。如果使用 int,则数值表示计算统计量的观测值的数量即向前几个数据,如果是offset类型,表示时间窗的大小。
min_periods 每个窗口最少包含的观测值数量,小于这个值的窗口结果为NaN,值可以是int,默认None,offset情况下,默认为1。
center 把窗口的标签设置为居中。布尔型,默认False,居右
win_type 窗口的类型,截取窗的各种函数,字符串类型,默认为None。
on 可选参数,对于dataframe而言,指定要计算滚动窗口的列,值为列名。
axis int、字符串,默认为0,即对列进行计算
closed 定义区间的开闭,支持int类型的window。对于offset类型默认是左开右闭,默认为right,可以根据情况指定为left、both等。

为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。移动窗口就是窗口向一端滑行,默认是从右往左,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行。给个例子好理解一点:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2020', periods=10),
columns = ['A', 'B', 'C', 'D'])
print(df)
print (df.rolling(window=3).mean())

执行上面示例代码,得到以下结果 –

                   A         B         C         D
2020-01-01 -1.160008  0.976778 -0.234892  1.109955
2020-01-02  0.023449  0.310927  0.155567  0.051014
2020-01-03 -0.924405  0.400850  0.206513 -0.781276
2020-01-04 -0.669129 -0.203804 -1.427282  1.705977
2020-01-05 -1.711718  1.022483 -0.097551  0.018054
2020-01-06  0.737950 -0.394482 -0.271456 -1.368231
2020-01-07  1.508734  2.828110  0.894308 -0.815353
2020-01-08 -1.142051 -0.352189 -0.947432 -0.808080
2020-01-09  0.154371  2.026923 -1.040451  1.188535
2020-01-10 -0.196685 -0.475484  1.028807 -0.840684
                   A         B         C         D
2020-01-01       NaN       NaN       NaN       NaN
2020-01-02       NaN       NaN       NaN       NaN
2020-01-03 -0.686988  0.562852  0.042396  0.126564
2020-01-04 -0.523362  0.169324 -0.355067  0.325239
2020-01-05 -1.101751  0.406509 -0.439440  0.314252
2020-01-06 -0.547632  0.141399 -0.598763  0.118600
2020-01-07  0.178322  1.152037  0.175100 -0.721843
2020-01-08  0.368211  0.693813 -0.108193 -0.997221
2020-01-09  0.173685  1.500948 -0.364525 -0.144966
2020-01-10 -0.394788  0.399750 -0.319692 -0.153410

首先我们设置的窗口window=3,也就是3个数取一个均值。index0, index1 为NaN,是因为它们前面都不够3个数,等到index2 的时候,它的值计算方式为(index0+index1+index2)/3,index3 的值就是(index1+index2+index3)/3,第n个元素的值将是nn-1n-2元素的平均值。

如下图所示:
Pandas 窗口函数

扩展窗口函数

.expanding()又叫扩展窗口函数,此函数可以应用于一系列数据。 指定min_periods = n参数并在其上调用适当的统计函数。

.rolling()函数参数用法相同,不同的是,其不是固定窗口长度,其长度是不断的扩大的。expanding()函数,类似cumsum()函数的累计求和,其优势在于还可以进行更多的聚类计算;

expanding(min_periods=1, center=False, axis=0)
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
      index = pd.date_range('1/1/2018', periods=10),
      columns = ['A', 'B', 'C', 'D'])
print (df.expanding(min_periods=3).mean())

执行上面示例代码得到以下结果 –

                   A         B         C         D
2018-01-01  1.107803 -0.261542  0.346434  0.693195
2018-01-02 -1.914368  0.922915 -0.014170 -0.572633
2018-01-03  0.730590  0.515617 -0.747214  0.476524
2018-01-04  0.116862 -0.126795 -1.378964  0.178569
2018-01-05  0.371491 -0.994784 -1.701958  0.362190
2018-01-06  0.560983  0.092622 -1.243782  1.761126
2018-01-07  0.692285 -1.327181  0.027380 -0.875274
2018-01-08 -1.062106 -0.978839  2.750161 -0.376303
2018-01-09  0.659295 -0.076581  1.182860 -0.647006
2018-01-10 -0.329384 -0.334479 -0.995101  3.161144
                   A         B         C         D
2018-01-01       NaN       NaN       NaN       NaN
2018-01-02       NaN       NaN       NaN       NaN
2018-01-03 -0.025325  0.392330 -0.138317  0.199029
2018-01-04  0.010222  0.262549 -0.448479  0.193914
2018-01-05  0.082476  0.011082 -0.699174  0.227569
2018-01-06  0.162227  0.024672 -0.789942  0.483162
2018-01-07  0.237949 -0.168450 -0.673182  0.289100
2018-01-08  0.075442 -0.269748 -0.245264  0.205924
2018-01-09  0.140315 -0.248285 -0.086584  0.111154
2018-01-10  0.093345 -0.256905 -0.177435  0.416153

首先我们设置min_periods=3,也就是至少3个数取一个均值。index0, index1 为NaN,是因为它们前面都不够3个数,等到index2 的时候,它的值计算方式为(index0+index1+index2)/3,index3 的值就是(index0+index1+index2+index3)/3,第n个元素的值将是nn-1n-2…’1’这n个元素的平均值。

指数加权滑动函数

ewm()可应用于系列数据,指定comspanhalflife参数,并在其上调用适当的统计函数。该函数表示指数加权滑动,使用场景较少,本文仅做简单介绍。

ewm(com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, axis=0):
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2019', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print(df)
print(df.ewm(com=0.5).mean())

执行上面示例函数,得到以下结果 –

                   A         B         C         D
2019-01-01  0.204464 -0.263618  0.978768  0.258114
2019-01-02 -0.895890 -0.173322  0.747604 -1.717901
2019-01-03  2.244489  1.258563  0.335039 -0.572676
2019-01-04  1.336047 -0.950610  0.302612  1.344492
2019-01-05 -0.178505  0.698280 -1.216229  0.200680
2019-01-06  0.829401 -1.216952 -1.237694  1.499472
2019-01-07  1.340073 -0.439806  0.526794  2.056384
2019-01-08 -0.373016  0.750296  0.961150 -0.044647
2019-01-09  0.081844 -0.178490  2.343283  0.234418
2019-01-10  0.027862 -0.421088  1.365971 -0.955364
                   A         B         C         D
2019-01-01  0.204464 -0.263618  0.978768  0.258114
2019-01-02 -0.620801 -0.195896  0.805395 -1.223897
2019-01-03  1.362861  0.811037  0.479764 -0.773052
2019-01-04  1.344762 -0.378074  0.360187  0.656290
2019-01-05  0.325054  0.342460 -0.695100  0.351295
2019-01-06  0.661747 -0.698576 -1.057326  1.117798
2019-01-07  1.114172 -0.525984 -0.000763  1.743808
2019-01-08  0.122562  0.324999  0.640610  0.551323
2019-01-09  0.095415 -0.010677  1.775783  0.340043
2019-01-10  0.050379 -0.284289  1.502570 -0.523576

窗口函数主要用于通过平滑曲线来以图形方式查找数据内的趋势。如果日常数据中有很多变化,并且有很多数据点可用,那么采样和绘图就是一种方法,应用窗口计算并在结果上绘制图形是另一种方法。 通过这些方法,可以平滑曲线或趋势。

补充内容

.rolling()函数的衍生用法

函数 说明
rolling_count() 计算各个窗口中非NA观测值的数量
rolling_sum() 计算各个移动窗口中的元素之和
rolling_mean() 计算各个移动窗口中元素的均值
rolling_median() 计算各个移动窗口中元素的中位数
rolling_var() 计算各个移动窗口中元素的方差
rolling_std() 计算各个移动窗口中元素的标准差
rolling_min() 计算各个移动窗口中元素的最小值
rolling_max() 计算各个移动窗口中元素的最大值
rolling_corr() 计算各个移动窗口中元素的相关系数
rolling_corr_pairwise() 计算各个移动窗口中配对数据的相关系数
rolling_cov() 计算各个移动窗口中元素的的协方差
rolling_quantile() 计算各个移动窗口中元素的分位数

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程