Analyse de données en Python: une note sur line_profiler

line_profiler est utile

J'ai entendu dire que les courts discours et les jupes sont meilleurs.

Même dans l'analyse des données, je veux faire autant d'expériences que possible, donc Les travaux répétitifs de routine tels que le prétraitement doivent être aussi courts que possible.

Je pense que le profilage est utile dans de tels cas.

Récemment, j'ai décidé de traiter des données de plusieurs dizaines de Go ~ en privé.

À travers ce travail, sur le traitement parallèle, le profilage, etc. J'ai fait une petite découverte, alors j'aimerais pouvoir la partager.

Le premier est la découverte lors du profilage avec line_profiler.

Beaucoup de gens ont écrit sur line_profiler, donc s'il vous plaît vérifier. C'est un super projet.

Profil du processus d'agrégation de données

À propos des données

Je ne peux pas vous montrer les données qui ont été réellement utilisées. .. .. Nous allons procéder avec des exemples de données, qui ont une structure similaire à ces données.

In [1]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100000 entries, 0 to 99999
Data columns (total 3 columns):
key      100000 non-null int64
data1    100000 non-null int64
data2    100000 non-null int64
dtypes: int64(3)
memory usage: 3.1 MB
In [2]: df.head()
Out[2]: 
    key  data1  data2
0  1800   4153    159
1  5568   6852     45
2   432   7598    418
3  4254   9412    931
4  3634   8204    872

Le nombre réel de données est de dizaines de millions de lignes, Puisqu'il s'agit ici d'exemples de données, il est réduit à 100 000 lignes.

Traitement d'agrégation

Le code suivant a été agrégé (il est redondant en raison du profilage ligne par ligne).

def proc1():
    chunker = pd.read_csv('./data/testdata.csv', chunksize=10000)

    li = []
    for df in chunker:
        #Changer le nom de la colonne
        df.rename(columns={'data': 'value1', 'data2': 'value2'}, inplace=True)
        #Agréger pour chaque clé et prendre le total de value1
        li.append(df.groupby('key')['value1'].sum())

    g = pd.concat(li, axis=1)
    return g.sum(axis=1)

C'est un supplément sur le code.

  1. Puisque les données ne tiennent pas dans la mémoire, elles sont divisées par «taille de bloc» et lues.
  2. Le nom de colonne des données d'origine est difficile à utiliser, c'est pourquoi je l'ai changé en un nom facile à utiliser.
  3. Dans cette agrégation, nous ne parlerons pas de «valeur2».

Utilisez line_profiler

Cette fois, il est utilisé dans le notebook ipython.

%load_ext line_profiler

Vous pouvez y accéder avec la commande magique % lprun. Utilisons ceci pour mesurer le proc1 ci-dessus.

In [3]: %load_ext line_profiler

In [4]: %lprun -f proc1 proc1()
Timer unit: 1e-06 s

Total time: 0.060401 s
File: <ipython-input-105-0457ade3b36e>
Function: proc1 at line 1

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     1                                           def proc1():
     2         1         1785   1785.0      3.0      chunker = pd.read_csv('./data/coltest.csv', chunksize=100000)
     3                                           
     4         1            2      2.0      0.0      li = []
     5         2        49155  24577.5     81.4      for df in chunker:
     6         1         1932   1932.0      3.2          df.rename(columns={'data': 'value1', 'data2': 'value2'}, inplace=True)
     7         1         4303   4303.0      7.1          li.append(df.groupby('key')['value1'].sum())
     8                                           
     9         1         2723   2723.0      4.5      g = pd.concat(li, axis=1)
    10         1          501    501.0      0.8      return g.sum(axis=1)

Recherchez les goulots d'étranglement

Jusqu'à ce que j'exécute line_profiler, c'était comme" Je me demande si le chargement dans le partage de fichiers est lent ". C'est lent, mais il y a d'autres parties qui prennent beaucoup de temps.

a. La partie de «df.rename ...» prend environ la moitié du processus d'agrégation de «groupby» en termes de% de temps (pourcentage de l'ensemble).

b. Si vous n'utilisez pas la colonne «valeur2», vous ne devez pas non plus la lire en utilisant l'option «utilitaires» de «read_csv».

à la fin

Je pensais que cela prendrait plus de temps que prévu pour traiter «renommer». Je pense que le "line_profiler" qui a fait une telle découverte est très bon.

Ensuite, je voudrais écrire un mémo de travail sur le traitement parallèle d'ipython.

Recommended Posts

Analyse de données en Python: une note sur line_profiler
Environnement enregistré pour l'analyse des données avec Python
Une note sur [python] __debug__
Python: une note sur les classes 1 "Résumé"
Remarque à propos de get_scorer de sklearn
Une note sur mock (bibliothèque fictive Python)
Analyse de données python
Analyse de données avec python 2
Présentation de l'analyse de données python
Un mémo que j'ai écrit un tri de fusion en Python
Écrire une note sur la version python de python virtualenv
Notes de programme simples Pub / Sub en Python
Pensez à créer un environnement Python 3 dans un environnement Mac
Une note sur __call__
Modèle d'analyse de données Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Une note sur le sous-processus
Une note sur mprotect (2)
Analyse d'association en Python
À propos de __all__ en python
Analyse de données avec Python
Histoire de l'analyse de données par apprentissage automatique
Analyse de régression avec Python
Créer un bot de collecte de données en Python à l'aide de Selenium
Recevez des données de dictionnaire à partir de programmes Python avec AppleScript
Note de lecture: Introduction à l'analyse de données avec Python
Choses à noter lors de l'initialisation d'une liste en Python
Liste du code Python utilisé dans l'analyse de Big Data
Jusqu'à ce que vous insériez des données dans une feuille de calcul en Python
Un mémorandum sur la mise en œuvre des recommandations en Python
Prendre une capture d'écran en Python
Mon conteneur d'analyse de données python
Gérer les données ambiantes en Python
Créer une fonction en Python
Créer un dictionnaire en Python
Python pour l'analyse des données Chapitre 4
Afficher les données UTM-30LX en Python
Analyse des contraintes symétriques axiales avec Python
Une note sur KornShell (ksh)
Notes d'apprentissage sur l'analyse des données Python
Mémorandum sur la corrélation [Python]
Créer un bookmarklet en Python
Une note sur TensorFlow Introduction
Python pour l'analyse des données Chapitre 2
Un mémorandum sur le simulacre de Python
Analyse de régression simple avec Python
Dessinez un cœur en Python
Analyse de données à l'aide de pandas python
À propos de "for _ in range ():" de python
Python pour l'analyse des données Chapitre 3
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Publication d'une bibliothèque qui masque les données de caractères dans les images Python
Une histoire sur la façon de spécifier un chemin relatif en python.
Une note quand j'ai touché l'API de reconnaissance faciale de Microsoft avec Python
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Créer un environnement d'analyse de données python sur Mac (El Capitan)
[Note] Importation de fichiers dans le répertoire parent en Python
<Python> Construisez un serveur dédié pour l'analyse des données Jupyter Notebook