wie zu parallelisieren viele (fuzzy -) string-Vergleiche, die mit gelten Pandas?
Ich habe Folgendes problem
Ich habe einen dataframe master enthält Sätze wie
master
Out[8]:
original
0 this is a nice sentence
1 this is another one
2 stackoverflow is nice
Für jede Zeile in Master -, I-lookup in eine andere Dataframe slave für die beste übereinstimmung mit fuzzywuzzy
. Ich benutze fuzzywuzzy, weil die übereinstimmenden Sätze zwischen den beiden dataframes ein bisschen unterscheiden (Sonderzeichen, etc).
Beispielsweise slave könnte
slave
Out[10]:
my_value name
0 2 hello world
1 1 congratulations
2 2 this is a nice sentence
3 3 this is another one
4 1 stackoverflow is nice
Hier eine voll funktionsfähige, wunderschöne, kompakte Beispiel arbeiten 🙂
from fuzzywuzzy import fuzz
import pandas as pd
import numpy as np
import difflib
master= pd.DataFrame({'original':['this is a nice sentence',
'this is another one',
'stackoverflow is nice']})
slave= pd.DataFrame({'name':['hello world',
'congratulations',
'this is a nice sentence ',
'this is another one',
'stackoverflow is nice'],'my_value': [2,1,2,3,1]})
def fuzzy_score(str1, str2):
return fuzz.token_set_ratio(str1, str2)
def helper(orig_string, slave_df):
#use fuzzywuzzy to see how close original and name are
slave_df['score'] = slave_df.name.apply(lambda x: fuzzy_score(x,orig_string))
#return my_value corresponding to the highest score
return slave_df.ix[slave_df.score.idxmax(),'my_value']
master['my_value'] = master.original.apply(lambda x: helper(x,slave))
Die 1-Millionen-Dollar-Frage ist: kann ich parallelisieren gelten meine obigen code?
Nachdem alle, jede Zeile in master
ist im Vergleich zu all den Zeilen in slave
(slave ist ein kleiner Datensatz, und ich kann viele Kopien der Daten in den Arbeitsspeicher (RAM).
Ich sehe nicht ein, warum ich nicht ausführen konnte mehrere Vergleiche (D. H. die Verarbeitung mehrerer Zeilen gleichzeitig).
Problem: ich weiß nicht, wie das geht oder ob das überhaupt möglich ist.
Jede Hilfe sehr dankbar!
- Ich bemerken Sie das dask tag hier. Haben Sie versucht, mit dask schon und laufen in ein Problem?
- vielen Dank für Ihre Hilfe! es scheint dask akzeptiert nur regulären Funktionen
- auch, ich habe nur einen computer, so dass keine verteilte Aufträge über Maschinen
- Dask verwendet cloudpickle zu serialisieren Funktionen und so kann problemlos mit lambdas und closures gegenüber anderen datasets.
- dann wären Sie in der Lage zu schreiben, die einfach obigen code in dask, wie Sie Sie vorschlagen?
- Etwa die gleiche, aber ich würde
assign
statt Spalte Zuordnung, und ich würde die Metadaten zuapply
über die Spalte, die Sie erwarten. Wenn Sie erstellen eine minimale reproduzierbare Beispiel, dann ist es leichter, eine explizite Lösung. Zum Beispiel, etwas, das kann ich copy-und-paste zu arbeiten, nur auf meinem lokalen Rechner. - das hört sich gut an. ich glaube, der code oben ist voll funktionsfähig
- Lassen Sie uns weiter, diese Diskussion im chat.
- verwenden können den chat jetzt leider. bitte sagen Sie mir, was Sie brauchen und ich werde mein bestes tun! vielen Dank für Eure Hilfe
- ok habe es lassen Sie mich das erstellen einer paste und go-code für Sie
- Hallo @MRocklin, bitte siehe meine aktualisierte Antwort. Danke!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie parallelisieren, dies mit Dask.dataframe.
Darüber hinaus sollten Sie sich Gedanken über die vor-und Nachteile die Verwendung von threads vs. Prozesse hier. Ihr fuzzy-string-matching-fast sicher nicht-Veröffentlichung der GIL, so dass Sie nicht bekommen keine Vorteile aus der Nutzung mehrerer threads. Jedoch, mit der Prozesse wird dazu führen, dass Daten zu serialisieren und zu bewegen, um Ihre Maschine, die vielleicht die Dinge verlangsamen ein bisschen.
Dem Sie Experimentieren können zwischen der Verwendung von threads und Prozessen oder auf einem verteilten system durch die Verwaltung der
get=
keyword argument dercompute()
Methode.dask
nach überfliegen dask.pydata.org/en/latest/install.htmlnpartitions
wie gut?Arbeite ich an etwas ähnliches, und ich wollte, um eine vollständige funktionierende Lösung für jemand anderes, die Sie stolpern könnte, auf diese Frage. @MRocklin hat leider einige syntax-Fehler im code-snippets zur Verfügung gestellt. Ich bin kein Experte mit Dask, so kann ich nicht kommentieren, einige überlegungen zur Leistung, aber das sollte erfüllen Ihre Aufgabe genauso wie @MRocklin vorgeschlagen hat. Dies ist mit Dask version 0.17.2 und Pandas version 0.22.0:
Dann, um Ihre Ergebnisse (wie in dieser interpreter-Sitzung):
Diese Antworten sind ein bisschen alt. Einige neuere code:
Ich persönlich würd Graben gelten Aufruf fuzzy_score in die Helfer-Funktion und nur ausführen der operation.
Können Sie verändern die Planer mit diese Tipps.