Datenanalyse in Python: Ein Hinweis zu line_profiler

line_profiler ist nützlich

Ich habe gehört, dass kurze Reden und Röcke besser sind.

Selbst in der Datenanalyse möchte ich so viele Experimente wie möglich durchführen Routinemäßige Wiederholungsarbeiten wie die Vorbehandlung sollten so kurz wie möglich sein.

Ich denke, dass die Profilerstellung in solchen Fällen nützlich ist.

Vor kurzem habe ich beschlossen, Daten mit einer Größe von mehreren zehn GB privat zu verarbeiten.

Durch diese Arbeit geht es um Parallelverarbeitung, Profilerstellung usw. Ich habe eine kleine Entdeckung gemacht, also wünschte ich, ich könnte sie teilen.

Das erste ist die Entdeckung beim Profiling mit line_profiler.

Viele Leute haben über line_profiler geschrieben. Es ist ein großartiges Projekt.

Profilieren Sie den Datenaggregationsprozess

Über Daten

Ich kann Ihnen die tatsächlich verwendeten Daten nicht zeigen. .. .. Wir werden mit Beispieldaten fortfahren, die eine ähnliche Struktur wie diese Daten haben.

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

Die tatsächliche Anzahl der Daten beträgt zig Millionen Zeilen. Da es sich hier um Beispieldaten handelt, werden sie auf 100.000 Zeilen gelöscht.

Aggregationsverarbeitung

Der folgende Code wurde aggregiert (er ist aufgrund der zeilenweisen Profilerstellung redundant).

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

    li = []
    for df in chunker:
        #Spaltennamen ändern
        df.rename(columns={'data': 'value1', 'data2': 'value2'}, inplace=True)
        #Aggregieren Sie für jeden Schlüssel und nehmen Sie den Gesamtwert1
        li.append(df.groupby('key')['value1'].sum())

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

Es ist eine Ergänzung zum Code.

  1. Da die Daten nicht in den Speicher passen, werden sie durch die Blockgröße geteilt und gelesen.
  2. Der Spaltenname der Originaldaten ist schwierig zu verwenden, daher habe ich ihn in einen einfach zu verwendenden Namen geändert.
  3. In dieser Aggregation werden wir nicht gegen value2 vorgehen.

Verwenden Sie line_profiler

Dieses Mal wird es in ipython notebook verwendet.

%load_ext line_profiler

Sie können mit dem magischen Befehl "% lprun" darauf zugreifen. Verwenden wir dies, um das obige "proc1" zu messen.

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)

Suchen Sie nach Engpässen

Bis ich line_profiler ausführte, war es wie" Ich frage mich, ob das Laden in File Split langsam ist ". Es ist langsam, aber es gibt andere Teile, die viel Zeit in Anspruch nehmen.

a. Der Teil von "df.rename ..." nimmt ungefähr die Hälfte des Aggregationsprozesses von "groupby" in% Zeit (Prozentsatz des Ganzen) in Anspruch.

--Das Umbenennen einer Spalte darf nicht innerhalb der Schleife erfolgen. ..

b. Wenn Sie die Spalte "value2" nicht verwenden, sollten Sie sie auch nicht mit der Option "usercols" von "read_csv" lesen.

schließlich

Ich dachte, es würde länger dauern, als ich erwartet hatte, um umzubenennen. Ich denke, der line_profiler, der eine solche Entdeckung gemacht hat, ist sehr gut.

Als nächstes möchte ich ein Arbeitsmemo über die Parallelverarbeitung von Ipython schreiben.

Recommended Posts

Datenanalyse in Python: Ein Hinweis zu line_profiler
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Ein Hinweis zu [Python] __debug__
Python: Ein Hinweis zu Klasse 1 "Abstract"
Hinweis zu get_scorer von sklearn
Ein Hinweis zu Mock (Python-Mock-Bibliothek)
Datenanalyse Python
Datenanalyse mit Python 2
Datenanalyse Übersicht Python
Ein Memo, das ich in Python zusammengeführt habe
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Einfache Pub / Sub-Programmhinweise in Python
Denken Sie daran, eine Python 3-Umgebung in einer Mac-Umgebung zu erstellen
Ein Hinweis zu __call__
Python-Datenanalysevorlage
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Ein Hinweis zum Unterprozess
Ein Hinweis zu mprotect (2)
Assoziationsanalyse in Python
Über __all__ in Python
Datenanalyse mit Python
Geschichte rund um die Datenanalyse durch maschinelles Lernen
Regressionsanalyse mit Python
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
Empfangen Sie Wörterbuchdaten von Python-Programmen mit AppleScript
Lesehinweis: Einführung in die Datenanalyse mit Python
Beachten Sie beim Initialisieren einer Liste in Python
Liste des Python-Codes, der bei der Big-Data-Analyse verwendet wird
Bis Sie Daten in eine Tabelle in Python einfügen
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Machen Sie einen Screenshot in Python
Mein Python-Datenanalyse-Container
Behandeln Sie Umgebungsdaten in Python
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Python für die Datenanalyse Kapitel 4
Zeigen Sie UTM-30LX-Daten in Python an
Axialsymmetrische Spannungsanalyse mit Python
Ein Hinweis zu KornShell (ksh)
Lernnotizen zur Python-Datenanalyse
Memorandum über Korrelation [Python]
Erstellen Sie ein Lesezeichen in Python
Ein Hinweis zur TensorFlow-Einführung
Python für die Datenanalyse Kapitel 2
Ein Memorandum über den Python-Mock
Einfache Regressionsanalyse mit Python
Zeichne ein Herz in Python
Datenanalyse mit Python-Pandas
Über "für _ in range ():" von Python
Python für die Datenanalyse Kapitel 3
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Veröffentlichung einer Bibliothek, die Zeichendaten in Python-Bildern verbirgt
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
Ein Hinweis beim Berühren der Gesichtserkennungs-API von Microsoft mit Python
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
Erstellen Sie eine Python-Datenanalyseumgebung auf einem Mac (El Capitan).
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
<Python> Erstellen Sie einen Server für die Datenanalyse mit Jupyter Notebook