Pandas数据分析20——pandas窗口计算

 参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》


pandas的出生就是为了处理金融数据的,所以在处理时间序列问题上很强。时间序列简单的滑动窗口计算在pandas里面有很便捷的用法。

Pandas 窗口函数,为了处理数字数据,Pandas 提供几种窗口函数,如移动窗口函数(rolling()),扩展窗口函数(expanding()),指数加权滑动(ewm()), 同时可在基基础上调用适合的统计函数,如求和、中位数、均值、协方差、方差、相关性等。

下面来了解一下用法,还是先导入包

import numpy as np 
import pandas as pd

滑动窗口

#创建 Rolling 对象后,可以对对象进行计算操作。

s = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2020', periods=100))
s

s.rolling(3).sum()

#Rolling 支持的统计方法 r.agg r.apply r.count r.exclusions r.max r.median r.name r.skew r.sum r.aggregate r.corr r.cov r.kurt r.mean r.min r.quantile r.std r.var


#窗口的类型 win_type

#将win_type 传递给.rolling 会生成一个通用的滚动窗口计算,该计算将根据 win_type进行加权。 win_type 参数支持以下类型: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (needs beta) gaussian (needs std) general_gaussian (needs power, width) slepian (needs width) exponential (needs tau).


例如

ser=pd.Series(range(10))
ser.rolling(window=5, win_type='triang').mean()
ser.rolling(window=5, win_type='gaussian').mean(std=0.1)
# 以下相同
ser.rolling(window=5, win_type='boxcar').mean()
ser.rolling(window=5).mean()

 


移动窗口计算

生成案例随机数

df = pd.DataFrame(np.random.randn(100, 4),index=pd.date_range('1/1/2020', periods=100),columns=['A', 'B', 'C', 'D'])
df.head()

df.rolling(2).mean() #两天一个窗口,计算平均数

df.rolling('4D').std() #四天一个窗口,计算方差

#只对A列进行计算
df.rolling('2D')['A'].mean()
df.A.rolling('2D').mean() #同上

 #指定窗口类型,汉明窗口

df.rolling(2,win_type='hamming').mean()

 


使用函数

df.rolling(2).agg({'A':sum,'B': np.std})  #不同列使用不同的方法计算

df.A.rolling(3).agg({'A_sum':sum,'A_std': np.std})  #同一列使用不同方法

 #apply() 函数接受一个额外的 func 参数,并执行通用滚动计算。 func 参数应该是一个从 ndarray 输入生成单个值的函数。 
#假设我们要滚动计算平均绝对偏差:


def mad(x):
    return np.fabs(x - x.mean()).mean()
df.rolling(window=3).apply(mad, raw=True)

df.A.rolling(2).apply(lambda x: abs(sum(x)+1)) #窗口求和加一再求绝对值


#秩函数 rank()
#pandas 1.4+ 版本支持窗口内的排序,它给给每个数据给出它在窗口中的序号,还可以指定序号赋于的方法:
 

s = pd.Series([1, 4, 2, 3, 5, 3])
s.rolling(3).rank()

s.rolling(3).rank(method="max")


扩展窗口

生成案例数据

s=pd.Series(range(1,8))
s

s.expanding(2).sum()  

s.expanding(2).mean()

 

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阡之尘埃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值