使用Dask通过for循环对模糊字符串匹配进行并行化(延迟)

时间:2019-06-26 15:43:30

标签: python dask fuzzy dask-delayed

我有几个熊猫数据框(每年一个),其中包含公司特定的信息。我的总体目标是为每个公司创建一个ID,以将重复的横截面数据库转换为面板结构。我最初的方法是通过对多个变量(例如公司名称,总部所在地等)进行模糊匹配,将观察到的第一年的每个公司与第二年的所有公司进行匹配。模糊匹配方法是必需的,因为数据是由OCR算法生成的,可能会导致拼写错误。

我写了一个运行良好的代码。我什至可以使用标准的python多处理库在集群的一个节点的所有核心上并行化它。 但是,代码仍需要大约40天才能完成。因此,其想法是应用更​​复杂的过程,并使用dask和dask.distributed在集群的多个节点上并行化代码。最近几天,我一直在尝试学习如何使用dask。显然,不建议将dask.dataframe用于我的目的(因为我必须遍历数据帧的每一行)。因此,我的方法是从应该匹配的列中创建列表。随后,代码遍历列表中的每个元素,并使用dask.delayed在for循环内执行模糊匹配。

您现在在下面看到的基本代码的结果是延迟功能的列表。我现在的问题是,是否有一种简单的方法可以使用所有可用的节点和核心来“解压缩”它们,以便我可以看到实际的数字并将其潜在地插入到dask或pandas数据框中?

from dask import delayed
from time import sleep
from fuzzywuzzy import fuzz, process
import dask.dataframe as dd
import dask.array as da
import dask

m_list = ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
s_list = ['ccc', 'ddd', 'eee', 'lll', 'kkk']


def my_function(i, slave_list):
    fuzzy_matches0 = []
    for j in slave_list:
        fuzzy_match = fuzz.ratio(str(i), str(j))
        fuzzy_matches0.append(fuzzy_match)
    return fuzzy_matches0


results = []
for i in m_list:
    x = dask.delayed(my_function)(i, s_list)
    results.append(x)


print(results)

0 个答案:

没有答案