Pandas(十)--窗口函数和聚合函数

目录

窗口函数

rolling()

expanding()

ewm()

聚合函数

整体聚合

任意一列聚合

多列数据聚合

单列应用多个函数

不同列应用多个函数

不同列应用不同函数


窗口函数

为了能更好地处理数值型数据,Pandas 提供了几种窗口函数,比如移动函数(rolling)、扩展函数(expanding)和指数加权函数(ewm)。

窗口是一种形象化的叫法,这些函数在执行操作时,就如同窗口一样在数据区间上移动。

主要讲解如何在 DataFrame 和 Series 对象上应用窗口函数。

rolling()

rolling() 又称移动窗口函数,它可以与 mean、count、sum、median、std 等聚合函数一起使用。Pandas 为移动窗口函数定义了专门的方法聚合方法,如 rolling_mean()、rolling_count()、rolling_sum() 等。其语法格式如下:

rolling(window=n, min_periods=None, center=False)

常用参数说明如下:

参数名称 说明
window 默认值为 1,表示窗口的大小,也就是观测值的数量,
min_periods 表示窗口的最小观察值,默认与 window 的参数值相等。
center 是否把中间值做为窗口标准,默认值为 False。

构造DataFrame对象

import pandas as pd
import numpy as np
#生成时间序列
df = pd.DataFrame(np.random.randn(8, 4),index = pd.date_range('12/1/2020', periods=8),columns = ['A', 'B', 'C', 'D'])
print(df)

输出结果:
                   A         B         C         D
2020-12-01  0.979684  0.086780  1.201120 -0.545255
2020-12-02  0.395876  0.926613 -0.307856 -0.358531
2020-12-03 -0.414606 -2.196341  0.917219  0.662177
2020-12-04  0.163956  1.559444 -0.974325  1.585396
2020-12-05 -1.416682 -0.254854  1.341096 -0.550767
2020-12-06 -1.494325 -0.314532 -0.238630 -0.515445

下面看一组示例:

#每3个数求求一次均值
print(df.rolling(window=3).mean())

输出结果:
                   A         B         C         D
2020-12-01       NaN       NaN       NaN       NaN
2020-12-02       NaN       NaN       NaN       NaN
2020-12-03  0.320318 -0.394316  0.603494 -0.080536
2020-12-04  0.048409  0.096572 -0.121654  0.629681
2020-12-05 -0.555777 -0.297250  0.427997  0.565602
2020-12-06 -0.915683  0.330019  0.042714  0.173061

window=3表示是每一列中依次紧邻的每 3 个数求一次均值。当不满足 3 个数时,所求值均为 NaN 值,因此前两列的值为 NaN,直到第三行值才满足要求 window =3。

求均值的公式如下所示:

(index1+index2+index3)/3

expanding()

expanding() 又叫扩展窗口函数,扩展是指由序列的第一个元素开始,逐个向后计算元素的聚合值。下面示例,min_periods = n表示向后移动 n 个值计求一次平均值:

print (df.expanding(min_periods=3).mean())

输出结果:
                   A         B         C         D
2020-12-01       NaN       NaN       NaN       NaN
2020-12-02       NaN       NaN       NaN       NaN
2020-12-03  0.320318 -0.394316  0.603494 -0.080536
2020-12-04  0.281227  0.094124  0.209040  0.335947
2020-12-05 -0.058354  0.024329  0.435451  0.158604
2020-12-06 -0.297683 -0.032148  0.323104  0.046262

设置 min_periods=3,表示至少 3 个数求一次均值,计算方式为 (index0+index1+index2)/3,而 index3 的计算方式是 (index0+index1+index2+index3)/3,依次类推。

ewm()

ewm(全称 Exponentially Weighted Moving)表示指数加权移动。ewn() 函数先会对序列元素做指数加权运算,其次计算加权后的均值。该函数通过指定 com、span 或者 halflife 参数来实现指数加权移动。示例如下:

#设置com=0.5,先加权再求均值
print(df.ewm(com=0.5).mean())

输出结果:
                   A         B         C         D
2020-12-01  0.979684  0.086780  1.201120 -0.545255
2020-12-02  0.541828  0.716655  0.069388 -0.405212
2020-12-03 -0.120319 -1.300034  0.656348  0.333750
2020-12-04  0.071567  0.630114 -0.444356  1.178611
2020-12-05 -0.924699  0.037697  0.750864  0.020928
2020-12-06 -1.304971 -0.197445  0.090295 -0.337145

在数据分析的过程中,使用窗口函数能够提升数据的准确性,并且使数据曲线的变化趋势更加平滑,从而让数据分析变得更加准确、可靠。

聚合函数

窗口函数可以与聚合函数一起使用,聚合函数指的是对一组数据求总和、最大值、最小值以及平均值的操作,本节重点讲解聚合函数的应用。

首先创建一个 DataFrame 对象,然后对聚合函数进行应用。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 4),index = pd.date_range('12/14/2020', periods=5),columns = ['A', 'B', 'C', 'D'])
print (df)

输出结果:
                   A         B         C         D
2020-12-14  0.048891  1.087771 -0.873560  1.072785
2020-12-15  0.666132  0.702750 -0.675465  0.548518
2020-12-16  0.137360  0.191279  0.194926  0.002948
2020-12-17  2.113041 -1.219807  0.837043  0.435430
2020-12-18  0.880739 -0.330941 -1.753314 -0.401238

整体聚合

可以把一个聚合函数传递给 DataFrame,示例如下:

#窗口大小为3,min_periods 最小观测值为1, 得到Rolling对象
r = df.rolling(window=3,min_periods=1)
#使用 aggregate()聚合操作
print(r.aggregate(np.sum))

输出结果:
                   A         B         C         D
2020-12-14  0.048891  1.087771 -0.873560  1.072785
2020-12-15  0.715023  1.790522 -1.549025  1.621303
2020-12-16  0.852383  1.981801 -1.354099  1.624251
2020-12-17  2.916533 -0.325777  0.356504  0.986897
2020-12-18  3.131140 -1.359468 -0.721345  0.037141

任意一列聚合

#窗口大小为3,min_periods 最小观测值为1
r = df.rolling(window=3, min_periods=1)
#对 A 列聚合
print(r['A'].aggregate(np.sum))

输出结果:
2020-12-14    0.048891
2020-12-15    0.715023
2020-12-16    0.852383
2020-12-17    2.916533
2020-12-18    3.131140
Freq: D, Name: A, dtype: float64

多列数据聚合

#窗口大小为3,min_periods 最小观测值为1
r = df.rolling(window=3, min_periods=1)
#对 A/B 两列聚合
print(r['A','B'].aggregate(np.sum))

输出结果:
                   A         B
2020-12-14  0.048891  1.087771
2020-12-15  0.715023  1.790522
2020-12-16  0.852383  1.981801
2020-12-17  2.916533 -0.325777
2020-12-18  3.131140 -1.359468

单列应用多个函数

#窗口大小为3,min_periods 最小观测值为1
r = df.rolling(window=3, min_periods=1)
#对 A/B 两列聚合
print(r['A'].aggregate([np.sum, np.mean]))

输出结果:
                 sum      mean
2020-12-14  0.048891  0.048891
2020-12-15  0.715023  0.357511
2020-12-16  0.852383  0.284128
2020-12-17  2.916533  0.972178
2020-12-18  3.131140  1.043713

不同列应用多个函数

r = df.rolling(window=3, min_periods=1)
print( r['A','B'].aggregate([np.sum, np.mean]))

输出结果:
                   A                   B
                 sum      mean       sum      mean
2020-12-14  0.048891  0.048891  1.087771  1.087771
2020-12-15  0.715023  0.357511  1.790522  0.895261
2020-12-16  0.852383  0.284128  1.981801  0.660600
2020-12-17  2.916533  0.972178 -0.325777 -0.108592
2020-12-18  3.131140  1.043713 -1.359468 -0.453156

不同列应用不同函数

r = df.rolling(window=3, min_periods=1)
print(r.aggregate({'A': np.sum,'B': np.mean}))

输出结果:
                   A         B
2020-12-14  0.048891  1.087771
2020-12-15  0.715023  0.895261
2020-12-16  0.852383  0.660600
2020-12-17  2.916533 -0.108592
2020-12-18  3.131140 -0.453156

你可能感兴趣的:(数据分析,pandas,数据分析)