私が次の時系列を持っているとしましょう:
Timestamp Category
2014-10-16 15:05:17 Facebook
2014-10-16 14:56:37 Vimeo
2014-10-16 14:25:16 Facebook
2014-10-16 14:15:32 Facebook
2014-10-16 13:41:01 Facebook
2014-10-16 12:50:30 Orkut
2014-10-16 12:28:54 Facebook
2014-10-16 12:26:56 Facebook
2014-10-16 12:25:12 Facebook
...
2014-10-08 15:52:49 Youtube
2014-10-08 15:04:50 Youtube
2014-10-08 15:03:48 Vimeo
2014-10-08 15:02:27 Youtube
2014-10-08 15:01:56 DailyMotion
2014-10-08 13:27:28 Facebook
2014-10-08 13:01:08 Vimeo
2014-10-08 12:52:06 Facebook
2014-10-08 12:43:27 Facebook
Name: summary, Length: 600
週と年ごとに各カテゴリ(時系列の一意の値/要素)をカウントしたいと思います。
Example:
Week/Year Category Count
1/2014 Facebook 12
1/2014 Google 5
1/2014 Youtube 2
...
2/2014 Facebook 2
2/2014 Google 5
2/2014 Youtube 20
...
Python pandasを使用してこれをどのように実現できますか?
SeriesをDataFrameに変換し、Pandasのgroupby
機能を使用するのが最も簡単な場合があります(すでにDataFrameをお持ちの場合は、スキップして以下の別の列を追加してください)。
シリーズがs
と呼ばれている場合は、次のようにDataFrameに変換します。
_>>> df = pd.DataFrame({'Timestamp': s.index, 'Category': s.values})
>>> df
Category Timestamp
0 Facebook 2014-10-16 15:05:17
1 Vimeo 2014-10-16 14:56:37
2 Facebook 2014-10-16 14:25:16
...
_
次に、週と年の別の列を追加します(apply
を使用して、週/年の数値の文字列を生成する方法があります)。
_>>> df['Week/Year'] = df['Timestamp'].apply(lambda x: "%d/%d" % (x.week, x.year))
>>> df
Timestamp Category Week/Year
0 2014-10-16 15:05:17 Facebook 42/2014
1 2014-10-16 14:56:37 Vimeo 42/2014
2 2014-10-16 14:25:16 Facebook 42/2014
...
_
最後に、_'Week/Year'
_および_'Category'
_でグループ化し、size()
で集計してカウントを取得します。あなたの質問のデータについて、これは以下を生成します:
_>>> df.groupby(['Week/Year', 'Category']).size()
Week/Year Category
41/2014 DailyMotion 1
Facebook 3
Vimeo 2
Youtube 3
42/2014 Facebook 7
Orkut 1
Vimeo 1
_
もう少し明確にするために、最初に「week_num」という新しい列を作成する必要はありません。
df.groupby(by=lambda x: "%d/%d" % (x.week(), x.year())).Category.value_counts()
関数byは、インデックスの各タイムスタンプオブジェクトを自動的に呼び出して週と年に変換し、週と年でグループ化します。
TimeStamp列を週番号に変換し、その週番号とvalue_count
カテゴリ変数を次のようにグループ化します。
df.groupby('week_num').Category.value_counts()
新しい列week_num
がTimeStamp列から作成されたと想定しています。