【问题标题】:Get mean of last N weekdays for pandas dataframe获取熊猫数据框最近 N 个工作日的平均值
【发布时间】:2014-10-30 22:08:49
【问题描述】:

假设我的数据是每日计数,并将 DateTimeIndex 列作为其索引。有没有办法获得过去 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()(不传递具有for循环的函数?因为n是变量)或某种形式的groupby?例如,在每个工作日求所有数据的平均值的方法是:

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

【问题讨论】:

标签: python pandas time-series


【解决方案1】:

我认为您正在寻找滚动应用(在这种情况下是滚动平均值)?请参阅文档: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))

【讨论】:

    【解决方案2】:

    使用 Pandas 1.4.1 版,joris 提供的解决方案似乎已经过时(“模块 'pandas' 没有属性 'rolling_mean'”)。同样可以使用

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

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 2019-04-16
      • 2021-08-20
      • 2020-08-09
      • 2018-05-15
      • 1970-01-01
      • 2018-12-20
      • 2021-03-10
      • 2023-04-07
      相关资源
      最近更新 更多