1

我可以使用一些帮助。

主要问题是用它们的纬度和经度计算两点之间的距离。我们将巴西划分为 33k 个六边形,列在下面的数据框中:

图片

我一直在尝试将此数据框与其副本合并,因此我将拥有一个包含这些六边形的所有组合的 10 亿行数据框,并使用此函数计算它们之间的距离:

def get_distance(lat_1, lng_1, lat_2, lng_2): 
    d_lat = lat_2 - lat_1
    d_lng = lng_2 - lng_1 

    temp = (  
         np.sin(d_lat / 2) ** 2 
       + np.cos(lat_1) 
       * np.cos(lat_2) 
       * np.sin(d_lng / 2) ** 2
    )
    
    #print('a')

    return 6373.0 * (2 * np.arctan2(np.sqrt(temp), np.sqrt(1 - temp))) * 1.4 * 1000

我尝试将它们与 Pandas 合并,但出现内存错误(需要 8GB),所以我使用 Vaex 库将数据转换为 hdf5 文件。但是,当我尝试将这些与此代码合并时,我得到了同样的错误。

with h5py.File('mergedfs', 'w') as hdf:
    hdf.create_dataset('datasetmerge', data = dvv.join(dvv2, left_on='key', right_on='key2', how='left', allow_duplication=True))

有没有人经历过这样的事情?我提前感谢您的帮助。

另外,如果您有任何替代解决方案,我很高兴听到!

4

1 回答 1

0

如果没有您的数据集的 dytpe,我将无法编写一个精确的解决方案。但是,当我查看您的代码和文件图像时,我可以猜测伪代码应该是什么样子。见下文。我为您的 HDF5 文件和数据集使用了假定名称。我使用图像中显示的列/字段名称作为纬度和经度数据。这只是循环,调用get_distance()以计算距离并将值返回为dist_i_j。注意:我按原样调用您的函数get_distance()。希望这会让你开始。或者,如果您可以提供有关 dtype 的更多信息(或一些示例数据),我可以微调代码。祝你好运!

with h5py.File('not_mergedfs', 'w') as hdf:
    data=h5f['ds_name']
    
    for i in range (32882):
        lat_1 = data[i]['lat']
        lng_1 = data[i]['lon']
  
        for j in range (i+1,32882):
            lat_2 = data[j]['lat']
            lng_2 = data[j]['lon']
    
            dist_i_j = get_distance(lat_1, lng_1, lat_2, lng_2)
于 2021-01-22T15:53:48.547 回答