多个熊猫数据帧作为多处理参数

时间:2018-08-28 14:56:37

标签: pandas dataframe multiprocessing

我是Python的新手,如果这是一个愚蠢的问题,我想道歉。

我目前正在从事一项开发工作,以执行多项数据检查。

简而言之,我有一个主数据帧,需要对其他一些数据帧的数据进行验证。

我所做的代码在单核上正常工作,但是由于数量庞大,我将需要实现多核处理。问题是我找不到如何将多个熊猫数据框作为参数传递给功能模块。

请注意,主要数据集purchase_orders已在流程之间分割,因此每个数据集将接收1/4的数据。其他数据帧应该更小并且完全相同,因此,如果有一种方法可以使生成的进程访问数据,那么在主进程上创建的数据帧也可以,因为我只会从它们读取数据。

数据框change_log和参数将在apply方法上使用。

代码如下:

# this is the code I would like to call for multi processing
def apply_scores_test(purchase_orders, change_log, parameters):
    print('Running multicore')
    size = 1
    g_first = 'X'
    g_results = 'START'
    g_temp_lifnr = 'X'
    purchase_orders = purchase_orders.apply(calculate_scores, axis=1)
    return purchase_orders

# Starting the multi-core processing (locked to 4 process to make it easier to test)
p = multiprocessing.Pool(4) 
args = [(g_purchase_orders_1, change_log, parameters), (g_purchase_orders_2, change_log, parameters), (g_purchase_orders_3, change_log, parameters),(g_purchase_orders_4, change_log, parameters),]
res = p.map(apply_scores_test, args)
p.close()
p.join()

我当前收到的错误是功能模块仅接收到一个参数,如下所示:

TypeError: apply_scores_test() missing 2 required positional arguments: 
'change_log' and 'parameters'

有人对我开始多处理时如何将3个pandas数据帧传递给功能模块有任何线索吗?

更新:我尝试使用multiprocessing.pool.starmap而不是map进行更多测试,并且收到相同的错误。 我也尝试使用partial,但由于我至少需要使用参数,而且据我了解,“部分”仅适用于2个参数,因此也不起作用。

我对数据帧有任何其他想法,我将不胜感激。

非常感谢。

账单

1 个答案:

答案 0 :(得分:0)

作为链接,请考虑使用封装在上下文管理器starmap中的with对代码进行重构。对于Windows,请确保在if __name__ == '__main__':

中运行多处理
import multiprocessing
...

args = [(g_purchase_orders_1, change_log, parameters), 
        (g_purchase_orders_2, change_log, parameters), 
        (g_purchase_orders_3, change_log, parameters),
        (g_purchase_orders_4, change_log, parameters)]

if __name__ == '__main__':
    with multiprocessing.Pool(processes=4) as p:

        # LIST OF RETURNED DATAFRAMES
        results = p.starmap(apply_scores_test, args)

        # OUTPUT RESULTS
        for r in results:
            print(r)