Supposons que j'ai les séries chronologiques suivantes:
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
Je voudrais faire un décompte de chaque catégorie (valeur/facteur unique dans la série chronologique) par semaine et par an.
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
...
Comment cela peut-il être réalisé en utilisant Python pandas?
Il peut être plus simple de transformer votre série en DataFrame et d'utiliser la fonctionnalité groupby
de Pandas (si vous avez déjà un DataFrame, passez directement à l'ajout d'une autre colonne ci-dessous).
Si votre série s'appelle s
, transformez-la en un DataFrame comme ceci:
>>> 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
...
Ajoutez maintenant une autre colonne pour la semaine et l'année (une façon consiste à utiliser apply
et à générer une chaîne de numéros de semaine/année):
>>> 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
...
Enfin, groupez par 'Week/Year'
Et 'Category'
Et agrégez avec size()
pour obtenir les nombres. Pour les données de votre question, cela produit ce qui suit:
>>> 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
Pour être un peu plus clair, vous n'avez pas besoin de créer d'abord une nouvelle colonne appelée 'week_num'.
df.groupby(by=lambda x: "%d/%d" % (x.week(), x.year())).Category.value_counts()
La fonction by appellera automatiquement chaque objet d'horodatage de l'index pour les convertir en semaine et en année, puis les regroupera par semaine et par année.
Convertissez votre colonne TimeStamp en numéro de semaine, puis regroupez ce numéro de semaine et value_count
la variable catégorielle comme ceci:
df.groupby('week_num').Category.value_counts()
Où j'ai supposé qu'une nouvelle colonne week_num
a été créé à partir de la colonne TimeStamp.