获取pandas DataFrame中最近N个工作日的均值

7 投票
2 回答
2773 浏览
提问于 2025-04-20 02:42

假设我的数据是每天的计数,并且它的索引是一个日期时间索引列。有没有办法计算过去n个工作日的平均值?比如说,如果今天是8月15日的星期天,我想要得到(8月8日的星期天,8月1日的星期天,...)这些日期的计数平均值。

我昨天才开始用pandas,所以这是我用蛮力写出来的代码。

# df is a dataframe with an DateTimeIndex
# brute force for count last n weekdays, wherelnwd = last n weekdays
def lnwd(n=1):
    lnwd, tmp = df.shift(7), df.shift(7) # count last weekday
    for i in xrange(n-1):
        tmp = tmp.shift(7)
        lnwd += tmp
    lnwd = lnwd/n  # average
    return lnwd

难道就没有一行代码能搞定吗?有没有办法使用apply()(不需要传递一个带有循环的函数,因为n是可变的)或者某种形式的groupby?比如说,找出每个工作日所有数据的平均值的方法是:

df.groupby(lambda x: x.dayofweek).mean() # mean of each MTWHFSS

2 个回答

1

在使用Pandas 1.4.1版本时,joris提供的解决方案似乎已经过时了(提示“模块'pandas'没有'rolling_mean'这个属性”)。其实可以用以下方法来实现同样的效果:

s.groupby(s.index.weekday).transform(lambda x: pd.Series.rolling(x, window=n).mean())
5

我觉得你是在寻找一种滚动计算(在这个例子中是滚动平均值)?你可以查看这个文档:http://pandas.pydata.org/pandas-docs/stable/computation.html#moving-rolling-statistics-moments。不过,如果你想要对每个工作日单独进行计算,可以通过把rolling_mean和用groupby按工作日分组结合起来实现。

这样应该能得到类似下面的结果(假设有一个序列s):

s.groupby(s.index.weekday).transform(lambda x: pd.rolling_mean(x, window=n))

撰写回答