 悬赏园豆:100
                [已解决问题] 
            
                    解决于 2022-10-28 08:07
                悬赏园豆:100
                [已解决问题] 
            
                    解决于 2022-10-28 08:07 
                 
        需求:两张含经纬度的表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