pandas-13滚动计算

521 阅读4分钟

pandas-窗口函数rolling

[TOC]

滚动计算(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

参考资料

pandas.pydata.org/docs/user_g… 官网

www.cnblogs.com/traditional… 动画详解

juejin.cn/post/730225…

zhuanlan.zhihu.com/p/620376722…

blog.csdn.net/qq_39065491…