pandas-窗口函数rolling

发布时间 2023-12-10 01:22:03作者: 贝壳里的星海

pandas-窗口函数rolling

滚动计算(Rolling Calculation)是一种数据处理技术,它在时间序列数据或数据框中执行基于滑动窗口的计算。

通常用于计算移动平均、滚动标准差、滚动相关系数等统计指标。

窗口函数rolling

DataFrame.rolling(window, 
                  min_periods=None, 
                  center=False, 
                  win_type=None, 
                  on=None, 
                  axis=0, 
                  closed=None)
                  
window:		# 表示时间窗口的大小;可省略不写。两种形式:int和offset。
min_periods:# 每个窗口内最少包含的观测值的数量,如果小于这个值的窗口,则结果为NA。值可以是int,默认None。
center: 	 # 把窗口的标签设置为居中。布尔类型,默认False,向右对齐。
win_type:	# 窗口的类型。截取窗的各种函数。字符串类型,默认为None。
on:		# 可选参数;对于dataframe而言,指定要计算滚动窗口的列,值可以是dataframe中的列名。
axis:	# int或者字符串;如果是0或者index,则按照行进行计算,如果是1或者columns,则按照列进行计算。默认是0

配合方法

一般在使用了移动窗口函数rolling之后,我们需要配合使用相关的统计函数

方法 描述
count() 统计非空数量
sum() 求和
mean() 求均值
median() 求中位数
min() 最小值
max() 最大值
std() 求标准差
var() 有偏方差
skew() 偏度
kurt() 峰度
quantile() 求四分位数
apply() apply函数使用
cov() 无偏方差
corr() 相关系数
rolling_obj = df['column_name'].rolling(window=window_size)
其中:

- df['column_name'] 是数据框列的选择,表示我们要在哪个列上执行滚动计算。
- window_size 是窗口的大小,用于定义滚动窗口的大小。

常用参数

rolling方法还支持其他参数,包括:

- min_periods:指定每个窗口最小的非NaN值数量,用于处理边界效应。
- center:     指示计算值的位置是窗口的中心还是右边缘。
- win_type:   用于指定窗口类型,如矩形窗口或指数加权窗口。
import pandas as pd 

df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],'data':[0,5,10,5,10,15,10,15,20]})
print(df)
#   key  data
# 0   A     0
# 1   B     5
# 2   C    10
# 3   A     5
# 4   B    10
# 5   C    15
# 6   A    10
# 7   B    15
# 8   C    20

df["roll"] = df['data'].rolling(3).sum()   # 求和
print(df)

#   key  data  roll
# 0   A     0   NaN
# 1   B     5   NaN
# 2   C    10  15.0
# 3   A     5  20.0
# 4   B    10  25.0
# 5   C    15  30.0
# 6   A    10  35.0
# 7   B    15  40.0
# 8   C    20  45.0

开始的两个元素为NaN,这是因为rolling(3)表示从当前位置往上筛选,总共筛选3个元素

添加一个min_periods=1,这个参数表示窗口的最小观测值,

即:窗口里面元素的最小数量,默认它是和窗口的长度相等的。我们窗口长度为3,但指定了min_periods为1,则不会有NaN

center参数,默认为False。我们知道rolling(3)表示从当前元素往上筛选,加上本身总共筛选3个。但如果是将center指定为True的话,那么是以当前元素为中心,从两个方向上进行筛选。比如rolling(3, center=True),那么会往上选一个、往下选一个,再加上本身总共是3个

扩展窗口函数expanding

expanding() 扩展窗口函数,扩展是指由序列的第一个元素开始,逐个向后计算元素的聚合值。

没有window参数。不固定窗口大小,实现累计计算,即不断扩展。

import pandas as pd 

df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],'data':[0,5,10,5,10,15,10,15,20]})
print(df)
#   key  data
# 0   A     0
# 1   B     5
# 2   C    10
# 3   A     5
# 4   B    10
# 5   C    15
# 6   A    10
# 7   B    15
# 8   C    20

df["expanding"] = df['data'].expanding().sum()   # 求和
print(df)
#   key  data  expanding
# 0   A     0        0.0
# 1   B     5        5.0
# 2   C    10       15.0
# 3   A     5       20.0
# 4   B    10       30.0
# 5   C    15       45.0
# 6   A    10       55.0
# 7   B    15       70.0
# 8   C    20       90.0
import pandas as pd
df = pd.DataFrame({'A': ['a', 'b', 'a', 'b', 'a'], 'B': range(5)})

df=df.groupby('A').expanding().sum()
print(df)

#        B
# A       
# a 0  0.0
#   2  2.0
#   4  6.0
# b 1  1.0
#   3  4.0

每隔n行分组并求和

import  pandas as pd

d = pd.DataFrame(list(zip(list(range(1,10)), list(range(11,20)))), columns=['a', 'b'])
print(d)
#    a   b
# 0  1  11
# 1  2  12
# 2  3  13
# 3  4  14
# 4  5  15
# 5  6  16
# 6  7  17
# 7  8  18
# 8  9  19

d=d.assign(c=d.groupby(d.index//3)['b'].transform('sum'))
 
print(d)
#    a   b   c
# 0  1  11  36
# 1  2  12  36
# 2  3  13  36
# 3  4  14  45
# 4  5  15  45
# 5  6  16  45
# 6  7  17  54
# 7  8  18  54
# 8  9  19  54

参考资料

https://pandas.pydata.org/docs/user_guide/window.html#rolling-window 官网

https://www.cnblogs.com/traditional/p/13776180.html 动画详解

https://juejin.cn/post/7302255044879745062

https://zhuanlan.zhihu.com/p/620376722?utm_id=0

https://blog.csdn.net/qq_39065491/article/details/131186611