Ich habe ein Modellierungs- und Bewertungsprogramm, das die DataFrame.isin
Funktion von Pandas stark nutzt und Listen von Facebook-Like-Einträgen einzelner Benutzer für jede von mehreren tausend spezifischen Seiten durchsucht. Dies ist der zeitaufwändigste Teil des Programms, mehr als das Modellieren oder Bewerten von Stücken, einfach weil es nur auf einem Kern läuft, während der Rest auf ein paar Dutzend gleichzeitig läuft.
Obwohl ich weiß, dass ich den Datenrahmen manuell in Blöcke aufteilen und den Vorgang parallel ausführen kann, gibt es eine einfache Möglichkeit, dies automatisch zu tun? Mit anderen Worten, gibt es eine Art Paket, das erkennt, dass ich eine leicht delegierbare Operation ausführe und diese automatisch verteile? Vielleicht ist das zu viel verlangt, aber ich war in der Vergangenheit genug überrascht von dem, was bereits in Python verfügbar ist, daher denke ich, dass es sich lohnt, danach zu fragen.
Alle anderen Vorschläge, wie dies erreicht werden könnte (auch wenn nicht durch ein magisches Einhornpaket!), Wären ebenfalls willkommen. Ich versuche nur, einen Weg zu finden, um 15 bis 20 Minuten pro Lauf zu sparen, ohne die gleiche Zeit für das Codieren der Lösung aufzuwenden.
quelle
Antworten:
Leider ist die Parallelisierung bei Pandas noch nicht implementiert. Sie können sich dieser Github-Ausgabe anschließen, wenn Sie an der Entwicklung dieser Funktion teilnehmen möchten.
Ich kenne kein "magisches Einhorn-Paket" für diese Zwecke, daher ist es das Beste, eine eigene Lösung zu schreiben. Aber wenn Sie trotzdem keine Zeit damit verbringen möchten und etwas Neues lernen möchten, können Sie die beiden in MongoDB integrierten Methoden (Map Reduce und Agg Framework) ausprobieren. Siehe mongodb_agg_framework .
quelle
Ich denke, Ihre beste Wette wäre Rosetta . Ich finde es sehr nützlich und einfach. Überprüfen Sie die Pandas-Methoden .
Sie können es per Pip bekommen .
quelle
Es gibt die nützliche
dask
Bibliothek für parallele Numpy / Pandas-JobsLink: https://github.com/blaze/dask
quelle
Es gibt eine häufigere Version dieser Frage bezüglich der Parallelisierung der Pandas Apply- Funktion - dies ist also eine erfrischende Frage :)
Zunächst möchte ich Swifter erwähnen, da Sie nach einer "gepackten" Lösung gefragt haben und dies auf den meisten SO-Fragen in Bezug auf die Parallelisierung von Pandas erscheint.
Aber ich möchte trotzdem meinen persönlichen Hauptcode dafür weitergeben, da ich nach einigen Jahren der Arbeit mit DataFrame nie eine 100% -Parallelisierungslösung (hauptsächlich für die Apply-Funktion) gefunden habe und immer wieder zurückkehren musste, um meinen " Handbuch "Code.
Dank Ihnen habe ich es allgemeiner gestaltet, jede (theoretisch) DataFrame-Methode mit ihrem Namen zu unterstützen (damit Sie keine Versionen für isin, apply usw. behalten müssen).
Ich habe es auf "isin" -, "apply" - und "isna" -Funktionen mit Python 2.7 und 3.6 getestet. Es ist unter 20 Zeilen, und ich folgte der Pandas Namenskonvention wie "Teilmenge" und "NJOBS".
Ich habe auch einen Zeitvergleich mit dem dask-äquivalenten Code für "isin" hinzugefügt und es scheint ~ X2-mal langsamer zu sein als dieser Kern.
Es beinhaltet 2 Funktionen:
df_multi_core - das ist das, was du nennst. Es akzeptiert:
_df_split - Dies ist eine interne Hilfsfunktion , die global zum laufenden Modul positioniert werden muss (Pool.map ist "Placement-abhängig"), andernfalls würde ich sie intern lokalisieren.
Hier ist der Code aus meiner Übersicht (ich werde dort weitere Pandas-Funktionstests hinzufügen):
Der folgende Code ist ein Testcode für ein parallelisiertes isin , in dem die native Mehrkernleistung mit der Leistung von dask verglichen wird. Auf einer I7-Maschine mit 8 physischen Kernen habe ich ungefähr die vierfache Geschwindigkeit erreicht. Ich würde gerne hören, was Sie von Ihren realen Daten erhalten!
quelle
isin
- es scheint, dass das Code-Snippet mit 'isin' am effektivsten ist - ~ X1.75-mal schneller als dask (im Vergleich zu derapply
Funktion, die nur 5% schneller als dask wurde)