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
个元素的值将是n
,n-1
和n-2
元素的平均值。
如下图所示:
扩展窗口函数
.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
个元素的值将是n
,n-1
,n-2
…’1’这n
个元素的平均值。
指数加权滑动函数
ewm()
可应用于系列数据,指定com
,span
,halflife
参数,并在其上调用适当的统计函数。该函数表示指数加权滑动,使用场景较少,本文仅做简单介绍。
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() |
计算各个移动窗口中元素的分位数 |