Pandas Rolling mean with GroupBy and Sort



我有一个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上,模型预测在2018年的1月份设置产品a10单位。

我试图通过subject、通过month为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排序,然后取下两个月平均值的平均值?

除非我误解了,否则它似乎比您所做的更简单。这个怎么样?

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

我会对Josh的解决方案稍微小心一点。如果你想按科目分组,你不能使用这样的滚动函数,因为它会在科目之间滚动(即,它最终需要科目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

最新更新