Python 分析:拆分汇总记录
考虑出版公司员工活动的以下假设会计记录:Python 分析:拆分汇总记录,python,pandas,analytics,Python,Pandas,Analytics,考虑出版公司员工活动的以下假设会计记录: Name Activity Begin-date End-date --------------------------------------------------------- Hasan Proofreading 2015-01-27 2015-02-09 Susan Writing 2015-02-01 2015-02-15
Name Activity Begin-date End-date
---------------------------------------------------------
Hasan Proofreading 2015-01-27 2015-02-09
Susan Writing 2015-02-01 2015-02-15
Peter Editing 2015-01-01 2015-02-21
Paul Editing 2015-01-24 2015-01-30
Stefan Proofreading 2015-01-08 2015-01-08
...
这些表示每个人正在进行的活动,包括开始和结束日期(包括日期)。假设这家公司的执行官想知道每个月有多少人在不同的活动中度过。所需的报告可能如下所示:
Month Activity Man-hours
----------------------------------------
2015-01 Proofreading 720
2015-01 Editing 1283
2015-01 Writing 473
2015-02 Proofreading 1101
2015-02 Editing 893
2015-02 Writing 573
...
假设使用python Pandas分析框架,我们是否可以(主要)依靠Pandas的API,而不是进行低级的“逐点”编程?这个查询的问题是,每个记录的“开始”和“结束”时间可能跨越几个月(而不仅仅是一个月),因此这些记录需要“拆分”或“分解”为多个记录(每个记录覆盖一个月的时间),然后我们可以使用通常的“groupby&sum”聚合来进行最终缩减
由于从未接受过SQL或数据库方面的正式培训,我不知道在数据分析中是否有这样的概念,所以我不知道正确的名称。在Spark中,我认为这是可以做到的,因为RDDflatMap
可以从单个元素中返回多个元素
谢谢,
Wirawan首先,在每个开始日期和结束日期之间的每一天创建一个密集的长数据帧。为此,Pandas拥有从两个日期生成日期索引的
pd.date\u范围
。假设人们在周末工作,让我们使用一个工作日频率,但您可以使用任何对您的案例有用的频率
在这个范围内,我们使用堆栈
和一些索引重置来重新格式化。它导致:
df =(df.set_index(['name', 'activity'])
.apply(lambda r : pd.Series(pd.date_range(r['begindate'],r['enddate'], freq='B')),
axis=1)
.stack()
.rename('date')
.reset_index(level=-1, drop=True)
.reset_index())
Out[73]:
name activity date
0 Hasan Proofreading 2015-01-27
1 Hasan Proofreading 2015-01-28
2 Hasan Proofreading 2015-01-29
3 Hasan Proofreading 2015-01-30
4 Hasan Proofreading 2015-02-02
.. ... ... ...
10 Susan Writing 2015-02-02
11 Susan Writing 2015-02-03
.. ... ... ...
现在你可以做你的每月汇总。将日期转换为月周期,并根据其分组:
df.groupby(['activity',df.date.dt.to_period('M')]).size()
Out[97]:
activity date
Editing 2015-01 27
2015-02 15
Proofreading 2015-01 5
2015-02 6
Writing 2015-02 10