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

import pandas as pd

# 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

# Beispieldaten
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

import pandas as pd

# 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

# Verwende apply(), um eine benutzerdefinierte Funktion auf eine Spalte anzuwenden
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

# Verwenden Sie applymap(), um eine Funktion auf jedes Element eines DataFrame anzuwenden
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

# Einen Index erstellen und eine Suche durchführen
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

# CSV-Datei in Blöcken lesen
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

import dask.dataframe as dd

# 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 numba
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

# Verkettete Zuweisung: Kann Warnungen auslösen und die Leistung beeinträchtigen
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

import pandas as pd

# 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       Z
Weitere Erweiterungen