【问题标题】:Pandas Rolling mean with GroupBy and Sort使用 GroupBy 和 Sort 的 Pandas 滚动平均值
【发布时间】:2019-09-17 15:40:02
【问题描述】:

我有一个如下所示的 DataFrame:

f_period f_year f_month subject month year value
20140102 2014   1      a        1     2018 10
20140109 2014   1      a        1     2018 12
20140116 2014   1      a        1     2018 8
20140202 2014   2      a        1     2018 20
20140209 2014   2      a        1     2018 15
20140102 2014   1      b        1     2018 10
20140109 2014   1      b        1     2018 12
20140116 2014   1      b        1     2018 8
20140202 2014   2      b        1     2018 20
20140209 2014   2      b        1     2018 15

f_period 是对 SKU(subject 列)进行预测的日期。 monthyear 列是进行预测的时期。例如,第一行表示在 01/02/2018 上,模型预测在月份 1 的年份 2018 中设置 10 产品单位 a

我正在尝试通过subjectmonth 为 2 f_months 创建滚动平均预测。 DataFrame 应如下所示:

f_period f_year f_month subject month year value mnthly_avg rolling_2_avg
20140102 2014   1      a        1     2018 10    10         13
20140109 2014   1      a        1     2018 12    10         13
20140116 2014   1      a        1     2018 8     10         13
20140202 2014   2      a        1     2018 20    17.5       null
20140209 2014   2      a        1     2018 15    17.5       null
20140102 2014   1      b        1     2018 10    10         13
20140109 2014   1      b        1     2018 12    10         13
20140116 2014   1      b        1     2018 8     10         13
20140202 2014   2      b        1     2018 20    17.5       null
20140209 2014   2      b        1     2018 15    17.5       null

我尝试过的事情:

我能够通过以下方式获得mnthly_avg

data_df['monthly_avg'] = data_df.groupby(['f_month', 'f_year', 'year', 'month', 'period', 'subject']).\
        value.transform('mean')

我尝试获取rolling_2_avg

rolling_monthly_df = data_df[['f_year', 'f_month', 'subject', 'month', 'year', 'value', 'f_period']].\
            groupby(['f_year', 'f_month', 'subject', 'month', 'year']).value.mean().reset_index()

rolling_monthly_df['rolling_2_avg'] = rolling_monthly_df.groupby(['subject', 'month']).\
            value.rolling(2).mean().reset_index(drop=True)

这给了我一个意想不到的输出。我不明白它是如何计算 rolling_2_avg 的值的

如何按subjectmonth 分组,然后按f_month 排序,然后取接下来两个月的平均值?

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    除非我有误解,否则它似乎比你所做的更简单。这个呢?

    grp = pd.DataFrame(df.groupby(['subject', 'month', 'f_month'])['value'].sum())
    grp['rolling'] = grp.rolling(window=2).mean()
    grp
    

    输出:

                              value rolling
    subject     month   f_month         
    a              1    1       30  NaN
                   2            35  32.5
    b              1    1       30  32.5
                   2            35  32.5
    

    【讨论】:

    • 我刚刚切换了f_monthmonth。那成功了。你说的对!我把它弄复杂了。
    • 我要补充一点,您实际上还应该在分组之前按日期排序以避免出现问题:df.sort_values(by='f_period').groupby(['subject', 'month', 'f_month'])['value'].sum().to_frame()。另外,to_frame() 是从系列转换为数据框的更简单方法
    【解决方案2】:

    我会小心 Josh 的解决方案。如果您想按主题分组,则不能使用这样的滚动功能,因为它会跨主题滚动(即,它最终会从主题 A 和 B 中取一个月的平均值,而不是给出您可能更喜欢的 null )。

    另一种方法是拆分数据帧并单独运行滚动(我注意到您希望在数据帧末尾使用空值,而您可能希望在前后对数据帧进行排序):

    for unique_subject in df['subject'].unique():
        df_subject = df[df['subject'] == unique_subject]
        df_subject['rolling'] = df_subject['value'].rolling(window=2).mean()
        print(df_subject) # just to print, you may wanna concatenate these
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2014-01-26
      • 2021-10-20
      相关资源
      最近更新 更多