Я получаю сообщение об ошибке «Таблица не найдена», когда использую многопроцессорную обработку для фрагментированного фрейма данных Pandas в каждом процессоре, запущенном библиотекой mp.
Я использую библиотеку pandasql для SQL следующим образом:
import pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())
df = pd.DataFrame({'a': [1,2,4,3,6,1,2], 'b': ['a','a','b','b','c','c','c']})
Это работает для одного потока:
sorted_df = pysqldf("select * from df order by b, a")
Это не работает, когда я применяю многопроцессорность для параллельной обработки каждого фрагмента df:
def parallelize_dataframe(df, func):
unique_bs = df.b.unique().tolist()
df_split = [df[df.a == l] for l in unique_bs]
df = pd.concat(pool.map(func, df_split))
pool = Pool(num_cores)
pool.close()
pool.join()
return df
def sort_chunks(data):
sorted_data = pysqldf("select * from data order by b, a")
return sorted_data
sorted_df = parallelize_dataframe(df, sort_chunks)
Ошибка, которую я получаю, следующая:
PandaSQLException: (sqlite3.OperationalError) нет такой таблицы: данные [SQL: 'выбрать * из данных'] (предыстория этой ошибки по адресу: http://sqlalche.me/e/e3q8)
Я понимаю, о чем мне говорит ошибка. По сути, данные DF в каждом процессоре не находятся в базе данных. Я не уверен, что было бы обходным путем для этой проблемы. Мы будем очень признательны за любой вклад. Спасибо.