Python 分为3个月的聚合期和转换期
问题 我有一个数据框架,包含许多地区及其各自的销售单位、执行的访问量和每月的平均访问时间。并非所有地区的起始日期都相同 我的桌子看起来像这样:Python 分为3个月的聚合期和转换期,python,pandas,Python,Pandas,问题 我有一个数据框架,包含许多地区及其各自的销售单位、执行的访问量和每月的平均访问时间。并非所有地区的起始日期都相同 我的桌子看起来像这样: 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.
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
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个月的频率汇总不同地区的月度数据
因此,如果我们以区域_1为例,我希望得到的最终结果如下:
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
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_班次栏中,我看到了与第一个可用月份相比的班次
当然,在上面的表格中,你只能看到区域_1,但我想得到所有组的结果
更多背景
因此,我希望对每个组的数据进行汇总,不仅是业务年度季度的数据,而且是在每个迭代的3个月频率上,向前移动一个月,直到我到达最后一个月
我的代码如下所示,但这将从每个区域的开始日期开始的月份进行分组,我真的不知道如何将开始月份逐月移动并迭代到最后一个月:
grp = joined.groupby(['Region', pd.Grouper(key="Date", freq='3M')]).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"})
以区域_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
编辑:
增加了一个更好的可视化我想得到什么
在下面的图片中,你可以明白我的意思。到目前为止,绿色部分就是我所拥有的。我想做一个粉红色的部分循环,但我不知道怎么做
你能帮我得到想要的结果吗
提前非常感谢 我不是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
嗨,跑出去。非常感谢您的评论。不幸的是,你的解决方案不是我想要的。我不能清楚地解释我想得到什么是我的错误。为了更清晰,我在我的原始帖子底部添加了一张图片,以便更好地理解我想要实现的目标。希望这会更容易理解!非常感谢。有人能帮我解决这个问题吗?我想帮你买。我还不太清楚你在找什么。您能否提供一个清晰的示例结果表/数据框架,以便我知道您想要实现什么?例如,在我看来,表中的+3个月轮班与绿色列相同。我不明白。此外,区域1的结果表重复了第5:6行中第3:4行的相同数据,这也令人困惑。如果你能清楚你的预期结果,我们可以再看一看。再次感谢你的意图。所以,你的解决方案是我想要实现的第一步。基本上,您的解决方案基于3个月的窗口聚合数据,然后将其向后移动两个月。这将是我迈出的第一步。我的下一步是删除区域_1的2018.01.01月(好像不存在),然后再次执行相同的(3个窗口,-2个班次)流程。然后,再次删除2018.02.01数据,并再次重复(3个窗口,-2个班次)过程。区域2的情况也一样,仅区域2的起始日期为2017.04.01。因此,基本上我希望进行分组,然后删除第一个数据行并重复整个过程(从第二个月开始,因为我删除了第一个月)。这种方式更容易理解吗?