带滚动面具的 pandas 滚动平均值/不包括参赛项目 [英] pandas rolling average with a rolling mask / excluding entries

查看:0
本文介绍了带滚动面具的 pandas 滚动平均值/不包括参赛项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 pandas 数据帧,时间索引如下

import pandas as pd
import numpy as np

idx = pd.date_range(start='2000',end='2001')
df = pd.DataFrame(np.random.normal(size=(len(idx),2)),index=idx)

如下所示:

                   0            1
2000-01-01  0.565524    0.355548
2000-01-02  -0.234161   0.888384

我想计算一个像

这样的滚动平均值
df_avg = df.rolling(60).mean()
但始终排除对应于(比方说)+-2天之前10天的条目。换句话说,对于每个日期,df_avg应该包含前60个条目的平均值(带有EWM或平坦的指数),但不包括从t-48到t-52的条目。我想我应该做一种滚动面具,但我不知道怎么做。我也可以尝试计算两个不同的平均值,并以差的形式获得结果,但它看起来很脏,我想知道是否有更好的方法来推广到其他非线性计算...

非常感谢!

推荐答案

您可以使用apply自定义您的函数:

# select indexes you want to average over
avg_idx = [idx for idx in range(60) if idx not in range(8, 13)]

# do rolling computation, calculating average only on the specified indexes
df_avg = df.rolling(60).apply(lambda x: x[avg_idx].mean())

Apply中的xDataFrame将始终有60行,因此您可以基于此指定位置索引,因为您知道第一个条目(0)是t-60

我不完全确定您的排除逻辑,但您可以根据您的情况轻松修改我的解决方案。

这篇关于带滚动面具的 pandas 滚动平均值/不包括参赛项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆