熊猫滚动均值与 GroupBy 和 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)制成。的month和year列是该预测被做了周期。例如,第一行表示 on 01/02/2018,该模型预测要在year of year 中设置10产品单位。a12018


我正在尝试通过subject, by monthfor 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


我如何GROUP BYsubject和month再排序f_month,然后取平均值未来两月的平均水平?


三国纷争
浏览 157回答 2
2回答

沧海一幻觉

除非我误解了它似乎比你所做的更简单。那这个呢?grp = pd.DataFrame(df.groupby(['subject', 'month', 'f_month'])['value'].sum())grp['rolling'] = grp.rolling(window=2).mean()grp输出:                          value rollingsubject     month   f_month         a              1    1       30  NaN               2            35  32.5b              1    1       30  32.5               2            35  32.5

月关宝盒

我对乔希的解决方案会有点小心。如果您想按主题分组,则不能使用这样的滚动功能,因为它会跨主题滚动(即它最终会从主题 A 和 B 中取一个月的平均值,而不是给出您可能更喜欢的空值)。另一种方法是拆分数据帧并单独运行滚动(我注意到您希望在数据帧末尾获得空值,而您可能希望在前后对数据帧进行排序):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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python