需求:两张含经纬度的表A,B,需要找到距离A表内各点2km范围的B表的经纬度清单,如A表中point1,找到B表中距离point1 2km范围内的点
遇到的问题:处理时间太长,现在A表有10万、B表有25万。我处理一遍得17分钟,希望能缩短处理时间
编程能力:只会简单的python
如下是我丑陋的代码:
import pandas as pd
import numpy as np
from datetime import datetime
from math import radians, cos, sin, asin, sqrt
df5 = pd.read_csv('cell.csv',encoding='gbk')
df4 = pd.read_csv('cell_all.csv',encoding='gbk')
def fun3(df5,df4,group=20,interval=0.15,dis=2000):
result1 = pd.DataFrame()
df4 = df4.sort_values('Longitude')
df5 = df5.sort_values('Longitude')
df4['t'] = 1
df5['t'] = 1
n = 0
nmax = df5.shape[0]
for i in range(nmax//group+1):
start = n
end = n+group
if end > nmax:
end = nmax
df51 = df5.iloc[start:end]
df4_lon_max = df51.Longitude.max()+0.15
df4_lon_min = df51.Longitude.min()-0.15
df4_lat_max = df51.Latitude.max()+0.15
df4_lat_min = df51.Latitude.min()-0.15
df41 = df4[(df4['Longitude']>df4_lon_min) & (df4['Longitude']<df4_lon_max) & (df4['Latitude']<df4_lat_max) & (df4['Latitude']>df4_lat_min)]
df45 = pd.merge(df51,df41,how='left',on='t')
df_array = df45.values
df_np = np.insert(df_array, -1, values=list(map(lambda x: haversine(x[1], x[2], x[5], x[6]), df_array)), axis=1)
df = pd.DataFrame(df_np)
df.columns = ['point_x', 'Longitude_x', 'Latitude_x', 't', 'point_y', 'Longitude_y','dis', 'Latitude_y']
df = df[(df['dis'] < dis)]
if n==0:
result1 = df
else:
result1 = pd.concat([result1,df])
return result1
fun3(df5,df4,20,0.15,2000)
Wall time: 16min 45s
1775184 rows × 8 columns
尝试过将group设为10/20/30/40/50,但貌似越大越慢,所以目前就定在20.麻烦大神帮忙指点指点
我自己造的测试数据试了下,不是特别好写(提问里看不出你的耗时代码行区间是哪些);
df41 = df4[(df4['Longitude']>df4_lon_min) & (df4['Longitude']<df4_lon_max) & (df4['Latitude']<df4_lat_max) & (df4['Latitude']>df4_lat_min)]
如果这是你目前的瓶颈,我用的是矩阵求解,但是没有测太大数据量的效果
"""
假设 df1、df2 数据包含以下经纬
74, 33.2
71.46, 27.7
69.32, 35.42
75.06, 24,
74.11, 16.64
73.37, 18.73
56.63, 26.9
"""
from scipy.spatial import distance_matrix
...
min_distance = 15
tmp = distance_matrix(df1, df2) # 求出 df1、df2 的所有距离
idx = np.where(tmp<min_distance) # 比对距离边界,获取原始数据索引
你自己试下
我看了下,您这个计算貌似不是距离?比如haversine(118.829712,28.954829,119.91846,28.88096)距离是106285米,而distance_matrix(df1, df2)计算结果为1.09125104km?
瓶颈在haversine距离计算上,我需要拿到符合条件的表A的name/lon/lat,对应的表B的name/lon/lat,还有距离,表的格式如下:
name lon lat
p1 118.829712 28.954829
p2 118.829712 28.954829
p3 118.830528 28.963094
p4 118.830528 28.963094
p5 118.830924 28.966679
@猪头33:
我这个是 欧氏距离
,和你的 haversine
球体计算有点偏差;你看看链接里的优化能不能用
https://www.javaroad.cn/questions/151139