获取pandas DataFrame中最近N个工作日的均值
假设我的数据是每天的计数,并且它的索引是一个日期时间索引列。有没有办法计算过去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))