当经销商数据集有 25k+ 条记录且客户有 200k+ 条记录时,使用 Python 查找离给定客户位置最近的经销商

问题描述

我有两张桌子 - 经销商和客户。对于客户表中的每个客户位置,我需要从经销商表中找到最近的经销商。

我有一个可以运行但需要几个小时才能运行的代码。我需要帮助来优化我的解决方案。

dealer 表有 25k+ 行,customer 表有 200k+ 行。两个表都有 3 个主要列:(DealerID,Lat,Long) 和 (CustomerID,Long)。我的输出看起来像这样:

客户 ID 纬度 最近的经销商 距离
客户 1 61.61 -149.58 经销商 3 15.53
客户 2 42.37 -72.52 Dealer258 8.02
客户 3 42.42 -72.1 经销商1076 32.92
客户 4 31.59 -89.87 Dealer32 3.85
客户 5 36.75 -94.84 经销商726 7.90

我当前的解决方案:遍历所有数据行以找到最小值。距离会太长。为了优化这一点,我根据四舍五入的纬度和经度点对两个表中的数据进行了分组,然后将它们加在一起得出我的最后一组(参见下面的“LatLongGroup”列)。

客户 ID 纬度 纬度组 LongGroup Lat​​LongGroup
客户 1 61.61 -149.58 61 -149 -88
客户 2 42.37 -72.52 42 -72 -30
客户 3 42.42 -72.1 42 -72 -30
客户 4 31.59 -89.87 31 -89 -58​​td>
客户 5 36.75 -94.84 36 -94 -58​​td>

这两个表都根据“LatLongGroup”列进行排序。我有一个名为 group 的单独表,它为经销商表提供每个组的开始和结束行号。 然后我匹配经销商表中与 customerID 具有相同“Latlonggroup”的记录。这有助于我缩小对最近经销商的搜索范围。

但有时最近的经销商可能不属于同一组,因此为了避免任何陷阱,我不仅搜索匹配的组,而且还搜索上下一个。 View Currently Used Code

请让我知道优化这一点的最佳方法是什么,或者是否有更简单的方法可以为这样的大型数据集找到最近的经销商。任何方向都非常感谢。谢谢!

col_names = ["CustomerKey","DealerKey","Dist"]
df = pd.DataFrame(columns = col_names)
c = 0
for i in range(0,len(df_c)):
    print(i)
    row = {'CustomerKey':df_c.loc[i,'ZIPBRANDKEY'],'DealerKey':'','Dist':0}
    df = df.append(row,ignore_index=True)
    a = group[group['LatLongGroup'] == df_c.LatLongGroup[i]].index[0]
    if(a-1 >= 0):
        start = group.loc[a-1,'Start']
    else:
        start = group.loc[a,'Start']
    if(a+1 < len(group)):
        end = group.loc[a+1,'End']
    else:
        end = group.loc[a,'End']
    t1 = 0
    for j in range(start,end):
        dist = round(geopy.distance.distance(df_c.Lat_long[i],df_s.Lat_long[j]).miles,2)
        if(t1 == 0):
            min_dist = dist
            dealerkey = df_s.loc[j,'DEALER_BRAND_KEY']
            t1 = 1
        elif(dist < min_dist):
            min_dist = dist
            dealerkey = df_s.loc[j,'DEALER_BRAND_KEY']
    df.loc[c,'DealerKey'] = dealerkey
    df.loc[c,'Dist'] = min_dist
    c = c+1
df.head()

作为参考,上面提到的组数据框如下所示:

开始 结束
-138 0 7
-137 7 15
-136 15 53
-135 53 55
-88 55 78

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)