使用Pandas计算滚动向前平均值的技术求助
嘿,这个需求其实很好解决,我来给你拆解清楚~
首先得说清楚:你想计算的「未来10到15天的平均值」,本质上是对每一行来说,取它之后第10个到第15个数据点(一共6个值)的平均值对吧?你之前尝试的df.rolling(-10,-15)行不通,是因为Pandas的rolling()函数不支持直接传入负的范围参数——它的窗口参数要么是整数(指定连续元素个数),要么是时间字符串(针对时间索引),没法直接用负索引来定义未来窗口。
而你提到的回溯场景df.rolling(15,10).mean()能运行,估计是你用了窗口大小+最小周期的参数组合,但这个逻辑没法直接套到未来窗口上。不过我们可以换个思路,用shift()和rolling()组合来实现,非常直观:
核心思路
把数据向前偏移10位,让当前行对应「未来第10天」的数据,然后对偏移后的数据计算连续6个元素的滚动平均值——这样得到的结果,正好就是原数据中当前行的「未来10到15天」的平均值。
具体代码(针对整数索引)
假设你的DataFrame是df,目标列是value(如果是整列操作就去掉列名):
# 计算未来10到15天的平均值(包含第10和第15天,共6个数据点) future_10_15_mean = df['value'].shift(-10).rolling(window=6).mean()
举个小例子验证:如果df['value']是[0,1,2,...,20],那第0行的未来10-15天值是10,11,12,13,14,15,平均值是12.5,用上面的代码计算出来的第0行结果正好是12.5,完全正确。
如果是时间索引的情况
如果你的索引是datetime类型,用时间偏移和时间窗口会更准确(自动处理缺失日期):
import pandas as pd # 向前偏移10天,然后计算连续6天的滚动平均 future_10_15_mean = df['value'].shift(-pd.Timedelta(days=10)).rolling(window='6D').mean()
补充说明
如果你想要的是「未来10天之后到15天之前」(不包含第10天),那只需要把偏移量改成-11,窗口大小改成5即可,逻辑是一样的。
这样操作比先算回溯平均再移位要更直接,而且结果完全符合你的需求~
内容的提问来源于stack exchange,提问作者top bantz

