26

次の問題があります

次のような文を含むデータフレームマスターがあります

master
Out[8]: 
                  original
0  this is a nice sentence
1      this is another one
2    stackoverflow is nice

Master のすべての行について、別の Dataframeスレーブを検索して、fuzzywuzzy. 2 つのデータフレーム間で一致する文が少し異なる可能性があるため (余分な文字など)、fuzzywuzzy を使用します。

たとえば、スレーブ

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

これは、完全に機能し、素晴らしく、コンパクトな作業例です:)

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))

100 万ドルの問題は、上記の適用コードを並列化できるかどうかです。

結局のところ、すべてmasterの行がすべての行と比較されますslave(スレーブは小さなデータセットであり、データの多くのコピーを RAM に保持できます)。

複数の比較を実行できなかった理由がわかりません (つまり、同時に複数の行を処理します)。

問題: それを行う方法がわかりません。または、それが可能かどうかもわかりません。

どんな助けでも大歓迎です!

4

3 に答える 3

34

これを Dask.dataframe で並列化できます。

>>> dmaster = dd.from_pandas(master, npartitions=4)
>>> dmaster['my_value'] = dmaster.original.apply(lambda x: helper(x, slave), name='my_value'))
>>> dmaster.compute()
                  original  my_value
0  this is a nice sentence         2
1      this is another one         3
2    stackoverflow is nice         1

さらに、ここでスレッドとプロセスの使用の間のトレードオフについて考える必要があります。あいまいな文字列の一致はほぼ確実に GIL を解放しないため、複数のスレッドを使用してもメリットはありません。ただし、プロセスを使用すると、データがシリアル化されてマシン内を移動するため、処理が少し遅くなる可能性があります。

get=メソッドのキーワード引数を管理することで、スレッドとプロセス、または分散システムの使用を試すことができますcompute()

import dask.multiprocessing
import dask.threaded

>>> dmaster.compute(get=dask.threaded.get)  # this is default for dask.dataframe
>>> dmaster.compute(get=dask.multiprocessing.get)  # try processes instead
于 2016-06-22T23:30:31.053 に答える