假设我的数据是每日计数,并将DateTimeIndex列作为其索引。有没有办法获得过去n个工作日的平均值?例如,如果日期是8月15日星期日,我希望得到统计数据(星期日8月8日,星期日8月1日,......)。
我昨天开始使用大熊猫,所以这就是我所强迫的。
# 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()
(不传递具有for循环的函数?因为n
是可变的)或某种形式的groupby
?例如,在每个工作日查找所有数据平均值的方法是:
df.groupby(lambda x: x.dayofweek).mean() # mean of each MTWHFSS
答案 0 :(得分:4)
我认为你正在寻找滚动申请(在这种情况下滚动均值)?请参阅文档: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))
答案 1 :(得分:0)
使用 Pandas 1.4.1 版,joris 提供的解决方案似乎已经过时(“模块 'pandas' 没有属性 'rolling_mean'”)。使用
可以实现相同的目的s.groupby(s.index.weekday).transform(lambda x: pd.Series.rolling(x, window=n).mean())