Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 分析:拆分汇总记录_Python_Pandas_Analytics - Fatal编程技术网

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中,我认为这是可以做到的,因为RDD
flatMap
可以从单个元素中返回多个元素

谢谢,
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