web-dev-qa-db-fra.com

Fréquence de comptage des valeurs par date en utilisant pandas

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?

22
jcborges

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
20
Alex Riley

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.

3
Leon

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.

2
cwharland