2017-01-20 9 views
2

は出版社のスタッフ・活動のために、次の仮想的な会計帳簿を考えてみましょう:分析:スプリット・要約レコードの

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のパンダの分析フレームワークを、私たちはこの頼って(主に)パンダのAPI、というよりも低いレベルをやって、 『ビットごとの』プログラミングを行うことができますか?このクエリの問題は、各レコードの "開始"と "終了"時間が数か月(1か月だけではない)にまたがることができるため、これらのレコードを複数に分割する必要があるそれぞれが1ヶ月の期間をカバーしている場合)、通常の「groupby & sum」集計を使用して最終的な削減を行うことができます。

SQLやデータベースで正式に訓練されたことは一度もありませんが、データアナリティクスにこのような概念があるかどうかはわかりません。そのため、わかりません。 Sparkでは、RDD flatMapは1つの要素から複数の要素を返すことができるため、これを行うことができます。

おかげで、 Wirawan

答えて

0

まず、日と終了日を始めるそれぞれの間に毎日を密に長いデータフレームを作成します。そうするために、パンダはpd.date_rangeを持っていて、2つの日付からDatetimeIndexを生成します。人々が週末に仕事をすると仮定すると、営業日の頻度を使用してみましょう。ただし、あなたのケースで役に立つ頻度を使用することができます。

この範囲からは、stackで少し再フォーマットし、インデックスをリセットします。

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