问题
我有一个数据框,其中包含许多地区及其销售的单位,进行的访问以及每月的平均访问时间。并非所有地区都有相同的开始日期。
所以我的桌子看起来像这样:
Region Month Visits Average_minutes Units_sold
Region_1 2018.01.01 12 2.22 120
Region_1 2018.02.01 10 2.02 108
Region_2 2017.04.01 4 1.8 60
Region_2 2017.05.01 4 1.6 56
Region_2 2017.06.01 3 1.5 58
Region_1 2018.03.01 11 2.1 103
Region_3 2018.04.01 3 2.22 20
Region_3 2018.05.01 2 2 22
Region_2 2017.07.01 6 1.7 61
Region_1 2018.04.01 14 2.1 125
Region_3 2018.06.01 3 2.3 21
Region_3 2018.07.01 3 2.4 19
Region_1 2018.05.01 10 2.12 116
Region_2 2017.08.01 3 2.1 55
我希望通过向前移动一个月,以3个月的频率汇总不同地区的每月数据。
因此,如果以Region_1为例,我希望得到的最终结果是这样的:
Region Date Visits Average_minutes Units_sold 3M_shift
Region_1 2018.01.01 33 2.11 331 0
Region_1 2018.04.01 24 2.11 241 0
Region_1 2018.02.01 35 2.07 336 1
Region_1 2018.05.01 10 2.12 116 1
Region_1 2018.02.01 35 2.07 336 2
Region_1 2018.05.01 10 2.12 116 2
如您所见,日期现在包含3个月频率的开始日期,并且在3M_shift列中,我看到了与第一个可用月份相比的变化。
当然,在上表中,您只能看到Region_1,但我希望所有组都得到此结果。
更多背景
因此,我希望每个组的数据不仅可以汇总业务年度季度,还可以将每个迭代的3个月频次向前移动一个月,直到得出最后一个月为止。
我的代码看起来像这样,但是这将每个区域的开始日期之后的月份进行了分组,我真的不知道如何将开始月份移动一个并迭代到最后一个月份:
grp = joined.groupby(['Region', pd.Grouper(key="Date", freq='3M')]).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"})
例如,对于Region_1,我得到以下结果:
Region Date Visits Average_minutes Units_sold
Region_1 2018.01.01 33 2.11 331
Region_1 2018.04.01 24 2.11 241
编辑: 添加了我想要得到的更好的可视化效果。
在下面的图片中,您可以看到我的意思。到目前为止,绿色部分是我所拥有的。我想为粉红色的部分做一个循环,但是我不知道该怎么做。
能否请您帮我获得理想的结果?
非常感谢您!
答案 0 :(得分:1)
我不确定您要寻找的内容是100%,但是按照我的解释,这可能会有所帮助吗?
首先对地区和月份进行排序。
df = df.sort_values(['Region', 'Month'])
设置多重索引。
df = df.set_index(['Region', 'Month'])
然后将区域分组,并应用滚动窗口进行汇总并将其移回两个周期。
df = df.groupby(level='Region').apply(lambda x: x.rolling(window=3).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"}).shift(-2))
结果是:
Visits Average_minutes Units_sold
Region Month
Region_1 2018.01.01 33.0 2.113333 331.0
2018.02.01 35.0 2.073333 336.0
2018.03.01 35.0 2.106667 344.0
2018.04.01 NaN NaN NaN
2018.05.01 NaN NaN NaN
Region_2 2017.04.01 11.0 1.633333 174.0
2017.05.01 13.0 1.600000 175.0
2017.06.01 12.0 1.766667 174.0
2017.07.01 NaN NaN NaN
2017.08.01 NaN NaN NaN
Region_3 2018.04.01 8.0 2.173333 63.0
2018.05.01 8.0 2.233333 62.0
2018.06.01 NaN NaN NaN
2018.07.01 NaN NaN NaN