[PYTHON] Gebrauchsfertige Pandas-Beschleunigungstechniken

Bei der Verarbeitung einer großen Datenmenge mit Pandas Es dauert oft zehn Minuten bis Stunden, um ein paar GB zu verarbeiten, und Tage, wenn Sie nicht gut darin sind. Wenn die Verarbeitung langsam ist, wird die weitere Arbeit nicht fortgesetzt Beachten Sie, wie Sie mit einer einfachen Änderung des Quellcodes beschleunigen können

DataFrame-Summe und Mittelwert werden nur mit numerischen Daten erstellt

index name weight height
0 Tanaka 160.1 60.1
1 Suzuki 172.4 75.0
2 Saitou 155.8 42.2
...
999998 Morita 167.9 94.07
999999 Satou 177.7 80.3

Zum Beispiel, wenn Sie einen Datenrahmen wie den oben genannten haben Bei der Berechnung des Durchschnittswerts von Gewicht und Größe scheint der Prozess wie folgt beschrieben zu werden.

Schlechtes Muster


import pandas as pd

sr_means = df.mean()
mean_height = sr_means['height'] 
mean_weight = sr_means['weight']

Aufgrund des Spaltennamens, der die Zeichenfolge enthält, dauert die Berechnung des obigen Codes jedoch sehr lange

Durch Ändern der Beschreibung wie unten gezeigt wird die Verarbeitung um Größenordnungen schneller.

Gutes Muster


import pandas as pd

sr_means = df[['height', 'weight']].mean()
mean_height = sr_means['height'] 
mean_weight = sr_means['weight']

Nachtrag: Nach dem Schreiben war ich neugierig und recherchiert, und die Option, nur mit numerischen Werten zu arbeiten, war geeignet

Nachtrag: Gutes Muster


import pandas as pd

sr_means = df.mean(numeric_only = True)
mean_height = sr_means['height'] 
mean_weight = sr_means['weight']

Messen Sie tatsächlich die Zeit

Tatsächliche Messung


import pandas as pd
import numpy as np

N = 100000
df_test = pd.DataFrame(
    {
        'name':['abc'] * N,
        'weight': np.random.normal(60, 5, N),
        'height': np.random.normal(160, 5, N)
    }
)

print("df_test.mean()")
%time df_test.mean()

print("df_test[['height', 'weight']].mean()")
%time df_test[['height', 'weight']].mean()

Die obigen Ergebnisse sind unten. Letzteres ist etwa vier Größenordnungen schneller, selbst wenn man bedenkt, dass die Anzahl der zu berechnenden Spalten um eins reduziert wird.

Ergebnis


df_test.mean()
Wall time: 3.06 s

df_test[['height', 'weight']].mean()
Wall time: 4 ms

Verwenden wir eine Funktion höherer Ordnung (Karte)

Wenn Sie beispielsweise das Spaltengewicht auf eine Ganzzahl runden möchten, können Sie die Rundungsfunktion verwenden. Wenn Sie mit Python und dem heutigen Schreiben nicht vertraut sind, schreiben Sie in der Regel mit der for-Anweisung. Verwenden wir die Funktionszuordnung höherer Ordnung. (Ich werde die Funktion höherer Ordnung in diesem Artikel weglassen.)

Schlechtes Muster


#Wenden Sie die Rundungsfunktion auf das Element an
for idx in range(len(df_test['weight'].index)):
    df_test['weight'][idx] = round(df_test['weight'][idx])

Schreiben Sie unten mit Karte neu

Gutes Muster


#Wenden Sie die Rundungsfunktion auf das Element an
df_test['weight'] = df_test['weight'].map(round)

Ich werde diesmal auch die Zeit messen. Da die for-Anweisung zu langsam ist, reduzieren Sie die Anzahl der Daten

Tatsächliche Messung


def func(sr):
    for idx in range(len(sr.index)):
        sr[idx] = round(sr[idx])
    return(sr)


N = 1000
df_test = pd.DataFrame(
    {
        'name':['abc'] * N,
        'weight': np.random.normal(60, 5, N),
        'height': np.random.normal(160, 5, N)
    }
)

print("Für für")
%time df_test['weight'] = func(df_test['weight'])
print("Für Karte")
%time df_test['weight'] = df_test['weight'].map(round)

Das Ergebnis ist unten. Was eine Karte mit Lichtgeschwindigkeit verarbeiten kann, wird mit einer for-Anweisung lächerlich langsam Weil dies nur 100 Daten sind Es ist beängstigend, wenn Sie über den Umgang mit 1 bis 100 Millionen Daten nachdenken

Ergebnis


Für für
Wall time: 22.1 s

Für Karte
Wall time: 0 ns

Nur durch die Verbesserung der beiden oben genannten Prozesse Früher dauerte die Verarbeitung von Daten einen Tag, jetzt kann sie in wenigen Minuten verarbeitet werden. Ich möchte es stetig verbessern.

Recommended Posts

Gebrauchsfertige Pandas-Beschleunigungstechniken
Pandas