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())
执行上面示例代码,得到以下结果 –
首先我们设置的窗口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())
执行上面示例代码得到以下结果 –
首先我们设置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())
执行上面示例函数,得到以下结果 –
窗口函数主要用于通过平滑曲线来以图形方式查找数据内的趋势。如果日常数据中有很多变化,并且有很多数据点可用,那么采样和绘图就是一种方法,应用窗口计算并在结果上绘制图形是另一种方法。 通过这些方法,可以平滑曲线或趋势。
补充内容
.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() |
计算各个移动窗口中元素的分位数 |
评论前必须登录!
注册