1

我正在尝试使用加速(GPU 支持)计算进行距离计算,但在处理 pandas 和 cudf 之间的细微差别时遇到了很多麻烦。

我有一个带有车辆和时间点(lat、lng、timestamp)的df,我基于cpu的计算大致是这样的:

df = pd.read_csv('taxis.csv')

results = df.groupby('vehicle').apply(lambda x: get_distance(x))

其中基本上计算使用运算符对齐连续点get_distance实现的纬度、经度列之间的距离。.shift()

事实证明,尝试使用cudfcuspatial来自 RAPIDSAI 非常令人困惑。

我正在尝试做:

df = cudf.read_csv("vehicles.csv")
grouped_df = df.groupby("vehicle", method="cudf")
results = grouped_df.apply_grouped(gpu_distance,
                               incols=['lat','lon'],
                               outcols=dict(tot=np.float64))

我的gpu_distance功能(什么不起作用)在哪里


def gpu_distance(lat,lon,tot)

    
    lat1 = lat[1:]
    lon1 = lon[1:]
    lat2 = lat[0:-1]
    lon2 = lon[0:-1]

    distances = cuspatial.haversine_distance(lat1,lon2,lat2,lon2)

    tot = np.sum(distances)



这还不是我的完整用例,但我正在努力构建它,收到有关实际模块的错误

  Unknown attribute 'haversine_distance' of type Module(<module 'cuspatial' from {my RAPIDS installation}

任何有问题的想法都将不胜感激,或者如果有更好的文档。

cuspatial.haversine_distance当不在 groupby 语句中运行时,我能够运行该函数,以下代码正常执行

# 
lat1 = df.shift()['lat'][1:]
lon1 = df.shift()['lon'][1:]
lat2 = df['lat'][1:]
lon2 = df['lon'][1:]

res = cuspatial.haversine_distance(lat1,lon1,lat2,lon2)
4

1 回答 1

0

这是一个快速实现,我认为它可以捕获您正在寻找的内容:

def shifter(lon, lat, shift_lon, shift_lat):
    for i in range(cuda.threadIdx.x, len(lon)-1, cuda.blockDim.x):
        shift_lon[i] = lon[i+1]
        shift_lat[i] = lat[i+1]
    shift_lon[len(lon)-1] = lon[0]
    shift_lat[len(lat)-1] = lat[0]

sorted_coords = grouped_df.apply_grouped(shifter,
                                        incols=['lon', 'lat'],
                                        outcols={'shift_lon': np.float64,
                                                 'shift_lat': np.float64},
                                        tpb=8)

df['distances'] = 
    cudf.Series(cuspatial.haversine_distance(sorted_coords['shift_lon'],
                                             sorted_coords['shift_lat'],
                                             sorted_coords['lon'],
                                             sorted_coords['lat']))
于 2020-09-22T19:37:10.660 回答