【发布时间】:2020-05-03 02:32:20
【问题描述】:
问题和问题陈述
我有来自两个来源的数据。每个源都包含由ID 列、坐标和属性标识的组。我想通过首先匹配这些组来处理这些数据,然后在这些组中找到最近的邻居,然后研究来自不同来源的属性如何在邻居之间进行比较。我对自己的学习挑战是如何使用并行处理来处理这些数据。
问题是:“使用 Dask 进行并行处理,处理此类数据的最简单、最直接的方法可能是什么?”
到目前为止的背景和我的解决方案
数据在 CSV 文件中,如下面的虚拟数据(真实文件在 100 MiB 范围内):
source1.csv:
ID,X_COORDINATE,Y_COORDINATE,ATTRIB1,PARAM1
B,-63802.84728184705,-21755.63629150563,3,36.136464492674556
B,-63254.41147034371,405.6973789009853,1,18.773534321367528
A,-9536.906537069272,32454.934987740824,0,14.043507555168809
A,15250.802157581298,-40868.390394552596,0,6.680542212635015
source2.csv:
ID,X_COORDINATE,Y_COORDINATE,ATTRIB1,PARAM1
B,-6605.150024790153,39733.35763934722,3,5.599467583303852
B,53264.28797042654,24647.24183964514,0,27.938127686688162
A,6690.836682554512,34643.0606728128,0,10.02914141165683
A,15243.16,-40954.928,0,18.130371948545935
我想做的是
- 将数据加载到数据帧中
- 按 ID 列将它们分组
- 对于
source1和source2中的每个组,让我们调用每个组中的子数据帧source1_sub和source2_sub- 根据列 X_COORDINATE 和 Y_COORDINATE 构造 kdtree 对象
k1和k2
- 根据列 X_COORDINATE 和 Y_COORDINATE 构造 kdtree 对象
- 对于每对对象
(k1, k2)- 为树木找到最近的邻居
- 构造三个数据帧:
-
matches_sub:包含source1_sub和source2_sub中的匹配行 -
source1_sub_only:source1_sub中不匹配的行 -
source2_sub_only:source2_sub中不匹配的行
-
- 将所有
matches_sub、source1_sub_only和source2_sub_only数据帧连接成三个数据帧:matches、source1_only、source2_only - 分析这些数据帧
这是一个应该很好地并行化的问题,因为每对组都独立于其他组对。我决定使用scipy.spatial.cKDTree 进行实际的坐标匹配,但困难在于它对原始 numpy 数组的索引进行操作,这与访问 Dask 数组的方式并不直接兼容。至少这是我的理解。
我的第一次徒劳的尝试真的很尴尬
- 尝试使用两个 Dask 数据帧,对齐它们并找到匹配项。这非常缓慢且难以理解。
- 使用 Dask Dataframe 读取数据并使用 Dask Bag 进行处理。这稍微不那么复杂,但仍不能令人满意。
【问题讨论】:
-
我编辑了问题以重新表述实际想要做的事情。
标签: python pandas dataframe dask