微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:按唯一 ID 分组的分块数据的并行化

如何解决Python:按唯一 ID 分组的分块数据的并行化

我有巨大的 (df) 按 Date_startID 排序:

Date_start    ID      Start_flag    End_flag   Date_end                             
01-01-2019    100     1             0         01-02-2019   
01-02-2019    100     0             0         01-03-2019
01-03-2019    100     0             0         01-04-2019
01-06-2019    100     0             0         01-07-2019
01-09-2019    500     1             0         01-10-2019     
01-11-2019    500     0             0         01-12-2019
01-05-2020    500     0             0         01-06-2020
01-06-2020    500     0             0         01-07-2020
01-07-2020    500     0             0         01-08-2020
01-08-2020    500     0             0         01-09-2020 
01-09-2020    700     1             0         01-12-2020
01-01-2021    700     0             0         01-04-2021
01-04-2021    700     0             1         01-07-2021

我还有一个函数,它有助于定义每一行 date_ranges 中的重叠。 我需要为由 df 分组的 ID 应用此函数,如下所示:

df.groupby('ID').apply(detect_overlapping)

查看最后,我按唯一 ID 将 df 拆分为块,最后 df_chunked - 是每个块中有 25000 个 ID 的数据帧列表。 为了在每个块中并行计算,我使用 multiprocessing.Pool:

def applyParallel(grouped_df,func):
    num_cores = 8
    with Pool(num_cores) as pool:
        result_list = pool.map(func,[group for name,group in grouped_df])
        pool.close()
        pool.join()
    return pd.concat(result_list,axis=0)

我将它应用到 df_chunked 的循环中:

result = []
for i in range(0,len(df_chunked)):
   print('chunk# ',i)
   gr_data = df_chunked[i].groupby('ID')
   df_with_target = applyParallel(gr_data,detect_overlapping)
   result.append(df_with_target)

上述方法性能不佳。我还尝试测试 pandarallel,但它因巨大的 df 而崩溃。

为了减少它,我试图找到如何并行化所有 df_chunked 和每组 [df_chunked[0],df_chunked[1]],[df_chunked[2],df_chunked[3]]..., 运行 applyParallel(gr_data,detect_overlapping) 内部的解决方案。

问题:有没有什么办法可以用我描述的更好的方法解决这个任务? 谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。