问题描述
我正在尝试使用加速(GPU支持)计算进行距离计算,但是在熊猫和Cudf之间的细微差别上遇到了很多麻烦。
我有一个包含车辆和时间点(纬度,经度,时间戳)的df,基于cpu的计算大致如下:
df = pd.read_csv('taxis.csv')
results = df.groupby('vehicle').apply(lambda x: get_distance(x))
其中get_distance
基本计算使用.shift()
运算符对齐连续点所获得的经纬度列之间的距离。
尝试使用RAPIDSAI的cudf
和cuspatial
非常令人困惑。
我正在尝试:
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']))