Pandas-Leistungsoptimierung
Pandas ist ein sehr leistungsstarkes Datenanalysewerkzeug, aber bei großen Datensätzen treten häufig Leistungsengpässe auf.
Um die Effizienz von Pandas bei der Verarbeitung großer Datenmengen zu verbessern, ist es notwendig, einige Techniken zur Leistungsoptimierung zu verstehen und anzuwenden.
Die Pandas-Leistungsoptimierung umfasst mehrere Aspekte, darunter die Optimierung von Datentypen, das Vermeiden unnötiger Schleifen, die Verwendung vektorisierter Operationen, die Optimierung von Indizes und das chunkweise Laden großer Datensätze.
Im Folgenden stellen wir mehrere Methoden zur Leistungsoptimierung von Pandas im Detail vor.
Geeignete Datentypen verwenden
Datentypen in Pandas (dtype) beeinflussen direkt den Speicherverbrauch und die Berechnungsgeschwindigkeit. Die Wahl geeigneter Datentypen kann den Speicherverbrauch erheblich reduzieren und die Berechnung beschleunigen.
1. Geeignete numerische Typen verwenden
Der Standard-Zahlentyp von Pandas istint64undfloat64, aber für die meisten Daten kann dies Speicher verschwenden. Sie können kleinere Typen verwenden, wie z. B.int8, int16, float32usw.
| Methode | Beschreibung |
|---|---|
astype() |
Wird verwendet, um den Datentyp einer Spalte umzuwandeln |
downcast |
Downcasten Sie den Datentyp, zum Beispiel konvertieren Sieint64Downcast aufint32oderint16 |
Beispiel
# Beispieldaten
df = pd.DataFrame({'A': [100, 200, 300, 400], 'B': [1000, 2000, 3000, 4000]})
# Spaltendatentypen in kleinere Datentypen konvertieren
df['A'] = df['A'].astype('int16')
df['B'] = df['B'].astype('int32')
print(df.dtypes)
Ausgabe:
A int16 B int32 dtype: object
2. Für Zeichendaten verwendencategorytype
Für String-Spalten mit wiederholten Werten können Siecategoryden Typ verwenden, um den Speicherverbrauch zu reduzieren.categoryDer Typ speichert ganzzahlige Indizes im Speicher statt der Zeichenfolgen selbst.
Beispiel
df = pd.DataFrame({'Category': ['A', 'B', 'A', 'C', 'B', 'A']})
# Verwende den Kategorie-Typ
df['Category'] = df['Category'].astype('category')
print(df.dtypes)
Ausgabe:
Category category dtype: object
Verwende vektorisierte Operationen statt Schleifen
Einer der größten Vorteile von Pandas ist die Fähigkeit, vektorisierte Operationen für schnelle Batch-Berechnungen zu nutzen. In Pandas sollte man native Python-Schleifen vermeiden und die in Pandas integrierten Funktionen verwenden, die zugrunde liegende Optimierungen für schnelle Berechnungen nutzen können.
Beispiel
# Beispieldaten
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8]})
# Vektorisierte Operationen verwenden, Schleifen vermeiden
df['C'] = df['A'] + df['B']
print(df)
Ausgabe:
A B C 0 1 5 6 1 2 6 8 2 3 7 10 3 4 8 12
Im Vergleich zur zeilenweisen Verarbeitung von Daten können vektorisierte Operationen von Pandas die Berechnungsgeschwindigkeit erheblich verbessern.
3. Verwendeapply()undapplymap()Optimierung
Pandas bietetapply()undapplymap()Methoden, mit denen du Funktionen zeilen- oder spaltenweise in einem DataFrame anwenden kannst und die effizienter als Schleifen sind.
Beispiel
df['D'] = df['A'].apply(lambda x: x ** 2)
print(df)
Ausgabe:
A B C D 0 1 5 6 1 1 2 6 8 4 2 3 7 10 9 3 4 8 12 16
apply()Es eignet sich zur Verarbeitung eindimensionaler Daten,applymap()während es eine Funktion auf jedes Element in einem DataFrame anwendet und für zweidimensionale Daten geeignet ist.
Beispiel
df = df.applymap(lambda x: x * 10)
print(df)
Ausgabe:
A B C D 0 10 50 60 10 1 20 60 80 40 2 30 70 100 90 3 40 80 120 160
Verwenden Sie geeignete Indizes
Pandas-Indizes können die Geschwindigkeit beim Nachschlagen von Daten verbessern, insbesondere wenn mehrere Suchvorgänge oder Datenzusammenführungen erforderlich sind, und Indizes können die Effizienz erheblich steigern. Bei großen Datensätzen kann die Leistung verbessert werden, indem geeignete Indizes sichergestellt und unnötige Indexoperationen reduziert werden.
Beispiel
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8]})
df.set_index('A', inplace=True)
# Schnelles Nachschlagen über den Index
print(df.loc[2])
Ausgabe:
B 6 Name: 2, dtype: int64
Große Datensätze in Blöcken laden
Wenn der Datensatz zu groß ist, kann das Laden des gesamten Datensatzes viel Speicher verbrauchen und sogar einen Speicherüberlauf verursachen. In diesem Fall können Sie den Speicherdruck reduzieren, indem Sie Daten in Blöcken lesen.
Pandas bietetchunksizeParameter, der beim Lesen von CSV- oder Excel-Dateien das Laden von Daten in Blöcken ermöglicht.
Beispiel
chunksize = 10000
for chunk in pd.read_csv('large_file.csv', chunksize=chunksize):
# Verarbeite jeden Datenblock
process(chunk)
Dask und Vaex sind zwei Bibliotheken, die Datensätze verarbeiten können, die größer als der Arbeitsspeicher sind. Sie sind mit Pandas kompatibel, unterstützen Multithreading und verteiltes Rechnen und können sehr große Datensätze effektiv verarbeiten.
Beispiel
# Verwende Dask, um einen großen Datensatz zu lesen
df = dd.read_csv('large_file.csv')
# Führe Berechnungsoperationen aus
df.groupby('category').sum().compute()
DurchnumbaBerechnung beschleunigen
numbaist ein JIT-Compiler, der Python-Code beschleunigen kann. Durch die Beschleunigung des Codes für die Datenverarbeitung kann die Leistung deutlich verbessert werden. Insbesondere bei rechenintensiven Operationen wie Schleifen und numerischen Berechnungen,numbaes kann die Geschwindigkeit erheblich erhöhen.
Beispiel
import pandas as pd
# Beispielfunktion
@numba.jit
def calculate_square(x):
return x ** 2
# numba zur Beschleunigung der Berechnung verwenden
df = pd.DataFrame({'A': [1, 2, 3, 4]})
df['B'] = df['A'].apply(calculate_square)
print(df)
Verkettete Zuweisung vermeiden
Verkettete Zuweisung ist eine der häufigen Performance-Fallstricke in Pandas. Sie kann unnötige Seiteneffekte verursachen und verlangsamt normalerweise die Ausführung. Am besten verwendet man explizite Zuweisung und vermeidet mehrere Zuweisungen in derselben Zeile.
Beispiel
df['A'][df['A'] > 2] = 0
# Korrekte Zuweisungsmethode:
df.loc[df['A'] > 2, 'A'] = 0
Merge-Vorgänge optimieren
Wenn Sie mehrere DataFrames zusammenführen, verwenden Siemerge()oderconcat()Sie müssen darauf achten, die Merge-Operation zu optimieren, insbesondere bei der Verarbeitung großer Datensätze. Sie könnenonundhowParameter, um die Merge-Methode explizit anzugeben und unnötige Berechnungen zu vermeiden.
Beispiel
# Verwenden Sie eine geeignete Merge-Methode
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Value': ['A', 'B', 'C']})
df2 = pd.DataFrame({'ID': [1, 2, 3], 'Value': ['X', 'Y', 'Z']})
# Verwenden Sie den on-Parameter zum Zusammenführen
merged_df = pd.merge(df1, df2, on='ID', how='inner')
print(merged_df)
Ausgabe:
ID Value_x Value_y 0 1 A X 1 2 B Y 2 3 C ZWeitere Erweiterungen