使用cudf和cuspatial计算组上的Haversine距离

问题描述

我正在尝试使用加速(GPU支持)计算进行距离计算,但是在熊猫和Cudf之间的细微差别上遇到了很多麻烦。

我有一个包含车辆和时间点(纬度,经度,时间戳)的df,基于cpu的计算大致如下:

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

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

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

尝试使用RAPIDSAI的cudfcuspatial非常令人困惑。

我正在尝试:

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}

任何出现问题的主意或对此有更好的文档,将不胜感激。

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

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

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

解决方法

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

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']))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...