熊猫滚动表示具有GroupBy和Sort

时间:2018-11-01 17:51:26

标签: python pandas group-by

我有一个看起来像这样的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上,该模型预测要在一年10的月份a中设置1个产品2018的单位。 / p>

我正在尝试通过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排序,然后取下两个月平均值的平均值?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我会对乔希的解决方案有些小心。如果要按主题分组,则不能使用那样的滚动功能,因为它将跨主题滚动(即,最终将需要从主题A和B花费平均一个月的时间,而不是提供您可能更喜欢的null )。

另一种方法是拆分数据框并单独运行滚动(我注意到您希望在数据框的末尾使用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