[PYTHON] Exemple de traitement efficace des données avec PANDAS

en premier

PANDAS est la meilleure bibliothèque de traitement de données pour les scientifiques de données, mais il faut veiller à éviter les pièges de performances lors du traitement de millions de lignes de données. Cette fois, je voudrais vous présenter quelques techniques que j'ai apprises dans mon travail.

DataFrame Puisque PANDAS est une structure de données orientée colonnes, nous sommes capables de traiter chaque colonne. Il est recommandé de créer un DataFrame au format" 1 enregistrement 1 ligne ", et de définir toutes les valeurs mesurables (humidité, prix, coordonnées, etc.) pour chaque colonne de chaque colonne.

Cependant, dans une énorme quantité de traitement de données, si un traitement en boucle pour chaque ligne est effectué, les performances seront considérablement réduites. Dans cet article, je voudrais présenter une manière intelligente d'ajouter des données en tenant compte des performances.

Commencez par créer un exemple de tableau.

data = {'Team': ['Tiger', 'Tiger', 'Rabbit', 'Rabbit', 'Cat',
   'Cat', 'Cat', 'Cat', 'Tiger', 'Human', 'Human', 'Tiger'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df= pd.DataFrame(data)
print(team_dashboard)
'''
      Team  Rank  Year  Points
0    Tiger     1  2014     876
1    Tiger     2  2015     789
2   Rabbit     2  2014     863
3   Rabbit     3  2015     673
4      Cat     3  2014     741
5      Cat     4  2015     812
6      Cat     1  2016     756
7      Cat     1  2017     788
8    Tiger     2  2016     694
9    Human     4  2014     701
10   Human     1  2015     804
11   Tiger     2  2017     690
'''

print(df.columns) #Obtenir le libellé de la colonne
'''
Index(['Team', 'Rank', 'Year', 'Points'], dtype='object')
'''

print(df.index) #Obtenir l'index des lignes
'''
RangeIndex(start=0, stop=12, step=1)
'''

Le DataFrame a une liste spéciale appelée index. Dans l'exemple ci-dessus, les éléments représentant chaque colonne sont étiquetés comme "['Team', 'Rank', 'Year', 'Points']` et 0, 1, 2, 3, ... sur le côté gauche. A un index de ligne qui représente chaque ligne.

groupby() groupby est utilisé lorsque vous souhaitez collecter des données avec la même valeur et effectuer des opérations communes pour chaque groupe. Bien qu'il soit devenu un standard dans le traitement des données, groupby est assez difficile au début car il a des utilisations diverses. Jetons un œil à un exemple. Si vous mettez le nom de la colonne dans la méthode groupby (), elle renvoie l'objet `` GroupBy```.


#1 niveau
df_g = df.groupby(by=['Team'])
print(df_g.groups)
'''
{'Cat': Int64Index([4, 5, 6, 7], dtype='int64'),
 'Human': Int64Index([9, 10], dtype='int64'),
 'Rabbit': Int64Index([2, 3], dtype='int64'),
 'Tiger': Int64Index([0, 1, 8, 11], dtype='int64')}
'''

#2 étiquettes (pluriel)
df_g = df.groupby(by=['Team', 'Year'])
print(df_g.groups)
'''
{('Cat', 2014): Int64Index([4], dtype='int64'),
 ('Cat', 2015): Int64Index([5], dtype='int64'),
 ('Cat', 2016): Int64Index([6], dtype='int64'),
 ('Cat', 2017): Int64Index([7], dtype='int64'),
 ('Human', 2014): Int64Index([9], dtype='int64'),
 ('Human', 2015): Int64Index([10], dtype='int64'),
 ('Rabbit', 2014): Int64Index([2], dtype='int64'),
 ('Rabbit', 2015): Int64Index([3], dtype='int64'),
 ('Tiger', 2014): Int64Index([0], dtype='int64'),
 ('Tiger', 2015): Int64Index([1], dtype='int64'),
 ('Tiger', 2016): Int64Index([8], dtype='int64'),
 ('Tiger', 2017): Int64Index([11], dtype='int64')}
'''

De cette façon, vous pouvez voir quelle colonne est dans quel groupe sous la forme de {étiquette de colonne: [étiquette de ligne, étiquette de ligne, ...]}. Chaque étiquette contient une liste d'index de ligne de données que possède la même étiquette.

Au fait, pour obtenir les données du groupe, passez la clé de groupe à get_group ().

df_oneGroup = df_g.get_group('Rabbit')
print(df_oneGroup)
'''
     Team  Rank  Year  Points
2  Rabbit     2  2014     863
3  Rabbit     3  2015     673
'''

df_oneGroup = df_g.get_group(('Cat', 2014))
print(df_oneGroup)
'''
  Team  Rank  Year  Points
4  Cat     3  2014     741
'''

Eh bien, en fait, get_group () n'est pas beaucoup utilisé sauf pour le débogage, mais l'objet GroupBy vous permet d'effectuer diverses opérations pour chaque groupe. Par exemple, appelez la méthode mean () pour faire la moyenne du classement et des points annuels de chaque équipe. De nombreuses autres méthodes sont fournies, telles que sum () et mode (). Au fait, ʻas_index = False` réinitialise l'étiquette de groupe par défaut à [0, 1, 2, ..., n].

df_mean = team_dashboard.groupby(by=['Team', 'Year']).mean()
print(df_mean)
'''
              Rank  Points
Team   Year              
Cat    2014     3     741
       2015     4     812
       2016     1     756
       2017     1     788
Human  2014     4     701
       2015     1     804
Rabbit 2014     2     863
       2015     3     673
Tiger  2014     1     876
       2015     2     789
       2016     2     694
       2017     2     690
'''

df_mean = team_dashboard.groupby(by=['Team', 'Year'], as_index=False).mean()
print(df_mean)
'''
      Team  Year  Rank  Points
0      Cat  2014     3     741
1      Cat  2015     4     812
2      Cat  2016     1     756
3      Cat  2017     1     788
4    Human  2014     4     701
5    Human  2015     1     804
6   Rabbit  2014     2     863
7   Rabbit  2015     3     673
8    Tiger  2014     1     876
9    Tiger  2015     2     789
10   Tiger  2016     2     694
11   Tiger  2017     2     690
'''

Renvoie plusieurs lignes pour chaque groupe en utilisant ʻagg () `

Comme le précédent GroupBy.mean (), vous pouvez obtenir la valeur numérique de chaque groupe, mais si vous voulez obtenir la valeur numérique de chaque groupe séparément, utilisez ʻagg () (Agrégation). Les fonctions utilisées pour l'agrégation peuvent être appelées avec des chaînes, des méthodes numpy, des fonctions personnalisées et des expressions lambda. Pour utiliser ʻagg () , définissez-le dansdict ()et passez-le comme suit.

'''
  location   col1  col2  col3  col4
0        a   True     2     1     4
1        a  False     6     2     6
2        b   True     7     6     3
3        b   True     3     3     4
4        b  False     8     4     6
5        c   True     9    57     8
6        d  False     1    74     9
'''
func_dict = {'col1': lambda x: x.any(),         #Confirmation de l'état manquant
             'col2': np.mean,                   #moyenne
             'col3': np.sum,                    #total
             'col4': lambda S: S.mode()[0]}     #Valeur la plus fréquente
df_agg = df.groupby('location').agg(func_dict).reset_index()
print(df_agg)
'''
  location   col1  col2  col3  col4
0        a   True     4     3     4
1        b   True     6    13     3
2        c   True     9    57     8
3        d  False     1    74     9
'''

Convertissez des variables catégorielles en nombres à des valeurs limites arbitraires en utilisant cut ()

Présentation de cut (), qui catégorise les données en fonction de la valeur limite spécifiée. Par exemple, il est facile de diviser l'ensemble des données en cinq catégories telles que «minuit, matin, midi, après-midi et nuit».

prods = pd.DataFrame({'hour':range(0, 24)})
b = [0, 6, 11, 12, 17, 24]
l = ['Minuit', 'un m.','le midi', 'après midi', 'Nuit']
prods['period'] = pd.cut(prods['hour'], bins=b, labels=l, include_lowest=True)
print(prods)

'''
    hour   period
0 0 minuit
1 1 minuit
2 2 minuit
3 3 minuit
4 4 minuit
5 5 minuit
6 6 minuit
7 7 heures du matin
8 8 h
9 9 heures
10 10 h
11 11 heures
12 12 heures
13 13 heures
14 14 h
15 15 h
16 16 h
17 17 h
18 18 nuit
19 19 nuit
20 20 nuit
21 21 nuit
22 22 nuit
23 23 nuit
'''

Regrouper et traiter les données de séries chronologiques en utilisant resample ()

Cette fois, disons "calculer le nombre cumulé de cas par heure". Je pense que je vais essayer d'utiliser pd.cumsum () ici, alors créez une colonne num_ride_1h à l'avance et donnez-lui" 1 ". Ensuite, après avoir groupé par resample () dans la colonne d'horodatage toutes les heures, chaque groupe peut être complété en appelant la méthode cumsum ().

df_raw= make_classification(n_samples, n_features+1)
df_raw['timestamp'] = random_datetimes_or_dates(start, end, n=n_samples)
df_raw['num_ride_1h'] = 1
print(df_raw)
'''
       var_0     var_1     var_2  class           timestamp  num_ride_1h
0   1.062513 -0.056001  0.761312      0 2020-09-21 00:01:57            1
1  -2.272391  1.307474 -1.276716      0 2020-09-21 00:14:49            1
2  -1.470793  1.245910 -0.708071      2 2020-09-21 00:17:46            1
3  -1.827838  1.365970 -0.933938      0 2020-09-21 00:25:13            1
4  -1.115794 -0.045542 -0.830372      0 2020-09-21 00:31:45            1
..       ...       ...       ...    ...                 ...          ...
95  0.247010  0.903812  0.448323      0 2020-09-21 23:29:25            1
96 -0.665399  1.861112  0.063642      1 2020-09-21 23:32:51            1
97  0.875282  0.028704  0.649306      2 2020-09-21 23:36:21            1
98  2.159065 -1.155290  1.238786      0 2020-09-21 23:37:23            1
99  1.739777 -1.775147  0.748372      2 2020-09-21 23:56:04            1
'''

df_raw['num_ride_1h'] = df_raw.resample('1H', on='timestamp')['num_ride_1h'].cumsum()

'''
       var_0     var_1     var_2  class           timestamp  num_ride_1h
0  -1.331170 -0.274703  0.809738      1 2020-10-11 00:10:54            1
1  -1.373495 -1.067991  1.738302      1 2020-10-11 00:14:24            2
2  -1.471448  0.216404  0.296618      0 2020-10-11 00:43:29            3
3  -2.282394 -1.528916  2.605747      1 2020-10-11 00:48:52            4
4   0.162427  0.524188 -0.663437      2 2020-10-11 00:51:23            5
..       ...       ...       ...    ...                 ...          ...
95  1.197076  0.274294 -0.759543      1 2020-10-11 22:23:50            3
96 -0.459688  0.646523 -0.573518      0 2020-10-11 23:00:20            1
97  0.212496  0.773962 -0.969428      2 2020-10-11 23:11:43            2
98  1.578519  0.496655 -1.156869      1 2020-10-11 23:14:31            3
99  1.318311 -0.324909 -0.114971      0 2020-10-11 23:46:46            4

'''

Vous pouvez également utiliser pd.Grouper (). Les deux peuvent produire le même résultat.

df_raw['num_ride_1h'] = df_raw.groupby(pd.Grouper(key='timestamp', freq='1h'))['num_ride_1h'].cumsum()

finalement

Il y a plusieurs autres exemples que je voudrais présenter, mais cette fois, je voudrais terminer ici. Si j'ai la prochaine opportunité, je présenterai le traitement des données centré sur les données de séries chronologiques.

** [Quand Co., Ltd.] ** Quand Co., Ltd., où je travaille, travaille sur des mises à niveau de l'industrie locale. S'il vous plaît, jetez un oeil. http://quando.jp/

Recommended Posts

Exemple de traitement efficace des données avec PANDAS
Conseils de traitement des données avec Pandas
Traitement des ensembles de données avec des pandas (1)
Visualisation des données avec les pandas
Manipulation des données avec les Pandas!
Mélangez les données avec les pandas
[Pandas] Principes de base du traitement des données de date à l'aide de dt
Traitement parallèle avec Parallel de scikit-learn
Traiter les données csv avec python (traitement du comptage à l'aide de pandas)
Remarques sur la gestion de grandes quantités de données avec python + pandas
Une collection de méthodes utilisées lors de l'agrégation de données avec des pandas
100 traitement du langage knock-91: Préparation des données d'analogie
Essayez de convertir en données ordonnées avec les pandas
Dessin avec Matrix-Reinventor of Python Image Processing-
Pandas: un exemple très simple de DataFrame.rolling ()
Gérez les structures de données 3D avec les pandas
Meilleures pratiques pour manipuler les données avec les pandas
J'ai 0 ans d'expérience en programmation et je défie le traitement des données avec python
Essayez d'agréger les données de musique doujin avec des pandas
Convertissez les données avec la forme (nombre de données, 1) en (nombre de données,) avec numpy.
Fonctionnement automatique de Chrome avec Python + Sélénium + pandas
Lire les données csv Python avec Pandas ⇒ Graphique avec Matplotlib
Dessinez un graphique en traitant avec Pandas groupby
lecture de données pandas
Utiliser des décorateurs pour empêcher la ré-exécution du traitement des données
Implémentez "Data Visualization Design # 3" avec pandas et matplotlib
Exemple d'obtention d'un jeton d'accès de mastodonte avec code_autorisation
Visualisez de manière interactive les données avec Treasure Data, Pandas et Jupyter.
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Sortie CSV des données d'impulsion avec Raspberry Pi (sortie CSV)
Voir les détails des données de séries chronologiques dans Remotte
Traitement asynchrone avec Arduino (traitement des demandes de traitement de Linux de manière asynchrone)
Regroupez les valeurs VIP de Smash Bra avec les pandas
Transformez les données de vacances en une trame de données avec les pandas
Acquisition automatique des données de cours des actions avec docker-compose
Pratique de création d'une plateforme d'analyse de données avec BigQuery et Cloud DataFlow (traitement de données)
Principes de base de Pandas pour les débutants ② Présentation des données de saisie
Un mémorandum de méthode souvent utilisé lors de l'analyse de données avec des pandas (pour les débutants)
Exemple d'implémentation simple d'un type d'augmentation de données
Exemple de lecture et d'écriture de CSV avec Python
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Exemple d'implémentation d'un système de traitement LISP simple (version Python)
Analyse des données financières par pandas et leur visualisation (2)
Traitement pleine largeur et demi-largeur des données CSV en Python
Obtenez des données Amazon RDS (PostgreSQL) à l'aide de SQL avec pandas
Analyse des données financières par pandas et leur visualisation (1)
Comment convertir des données détenues horizontalement en données détenues verticalement avec des pandas
Soyez prudent lors de la lecture de données avec des pandas (spécifiez dtype)
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
Construction d'un environnement d'analyse de données avec Python (notebook IPython + Pandas)
Vue d'ensemble et astuces de Seaborn avec visualisation de données statistiques
Défiez l'analyse des composants principaux des données textuelles avec Python
Comment extraire des données qui ne manquent pas de valeur nan avec des pandas
Comment générer un CSV d'en-tête multiligne avec des pandas
Vérification des performances du prétraitement des données dans le traitement du langage naturel
Récapitulatif des méthodes Pandas utilisées lors de l'extraction de données [Python]
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage