Sie können das swifter
Paket verwenden:
pip install swifter
Es funktioniert als Plugin für Pandas und ermöglicht es Ihnen, die apply
Funktion wiederzuverwenden :
import swifter
def some_function(data):
return data * 10
data['out'] = data['in'].swifter.apply(some_function)
Es wird automatisch herausgefunden, wie die Funktion am effizientesten parallelisiert werden kann, unabhängig davon, ob sie vektorisiert ist (wie im obigen Beispiel) oder nicht.
Weitere Beispiele und einen Leistungsvergleich finden Sie auf GitHub. Beachten Sie, dass sich das Paket in der aktiven Entwicklung befindet, sodass sich die API möglicherweise ändern kann.
Beachten Sie auch, dass dies für Zeichenfolgenspalten nicht automatisch funktioniert . Bei Verwendung von Strings greift Swifter auf einen „einfachen“ Pandas zurück apply
, der nicht parallel ist. In diesem Fall führt das Erzwingen der Verwendung dask
nicht zu Leistungsverbesserungen, und Sie sollten Ihr Dataset besser manuell aufteilen und mithilfe von parallelisierenmultiprocessing
.
allow_dask_on_strings(enable=True)
df.swifter.allow_dask_on_strings(enable=True).apply(some_function)
Am einfachsten ist es, die map_partitions von Dask zu verwenden . Sie benötigen diese Importe (Sie müssen
pip install dask
):und die Syntax ist
(Ich glaube, dass 30 eine geeignete Anzahl von Partitionen ist, wenn Sie 16 Kerne haben). Der Vollständigkeit halber habe ich den Unterschied auf meiner Maschine (16 Kerne) zeitlich festgelegt:
Wenn Sie einen Faktor von 10 für die Beschleunigung von Pandas angeben , gilt dies für dask auf Partitionen. Wenn Sie eine Funktion haben, die Sie vektorisieren können, sollten Sie dies natürlich tun - in diesem Fall ist die Funktion (
y*(x**2+1)
) trivial vektorisiert, aber es gibt viele Dinge, die nicht vektorisiert werden können.quelle
The get= keyword has been deprecated. Please use the scheduler= keyword instead with the name of the desired scheduler like 'threads' or 'processes'
ValueError: cannot reindex from a duplicate axis
. Um dies zu umgehen, sollten Sie entweder doppelte Indizes von entfernendf = df[~df.index.duplicated()]
oder Ihre Indizes von zurücksetzendf.reset_index(inplace=True)
.Sie können
pandarallel
stattdessen Folgendes versuchen : Ein einfaches und effizientes Tool zum Parallelisieren Ihrer Pandas-Vorgänge auf allen Ihren CPUs (unter Linux und MacOS)Siehe https://github.com/nalepae/pandarallel
quelle
Wenn Sie in nativem Python bleiben möchten:
wendet die Funktion
f
parallel auf die Spaltecol
des Datenrahmens andf
quelle
ValueError: Length of values does not match length of index
von__setitem__
inpandas/core/frame.py
. Ich bin mir nicht sicher, ob ich etwas falsch gemacht habe oder ob das Zuweisen zudf['newcol']
nicht threadsicher ist.Hier ist ein Beispiel eines sklearn-Basistransformators, bei dem Pandas parallelisiert sind
Weitere Informationen finden Sie unter https://towardsdatascience.com/4-easy-steps-to-improve-your-machine-learning-code-performance-88a0b0eeffa8
quelle