Как повысить производительность параллельных вычислений с помощью dask

У меня есть фреймворк pandas и преобразован в фреймворк dask

df.shape = (60893, 2)

df2.shape = (7254909, 2)

df['name_clean'] = df['Name'].apply(lambda x :re.sub('\W+','',x).lower(),meta=('x', 'str'))
names = df['name_clean'].drop_duplicates().values.compute()

df2['found'] = df2['name_clean2'].apply(lambda x: any(name in x for name in names),meta=('x','str')) ~ takes 834 ms

df2.head(10) ~ takes 3 min 54 sec

Как я могу увидеть форму фрейма данных dask?

Почему так много времени для .head ()? Правильно ли я это делаю?


person Hari    schedule 14.03.2017    source источник
comment
Я не понимаю, что вы имеете в виду, говоря «Как мне создать список имен для перебора». Результатом .values является dask.array. Возможно, вы хотите позвонить .compute() вместо .values?   -  person MRocklin    schedule 14.03.2017
comment
Мне нужно сравнить значения (сравнение строк) в списке со столбцом фрейма данных, поэтому мне нужно перебрать список   -  person Hari    schedule 14.03.2017
comment
Спасибо, Роклин! могу это сделать, но когда я хочу увидеть результат, требуется много времени   -  person Hari    schedule 14.03.2017


Ответы (1)


Вы не можете перебирать dask.dataframe или dask.array. Вам нужно сначала вызвать метод .compute(), чтобы превратить его в кадр / серию данных Pandas или массив NumPy.

Обратите внимание, что простой вызов метода .compute() и последующее забывание результата ничего не делают. Вам нужно сохранить результат как переменную.

dask_series = df.Name.apply(lambda x: re.sub('\W+', '', x).lower(), 
                            meta=('x', 'str')
pandas_series = dask_series.compute()

for name in pandas_series:
    ...
person MRocklin    schedule 14.03.2017