pandas-窗口函数rolling
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