gpt4 book ai didi

python - 在其他数据框中找到最近的点(有很多数据)

转载 作者:行者123 更新时间:2023-12-03 19:43:52 24 4
gpt4 key购买 nike

问题很简单,我有两个 DataFrame :

  • 一个有 90 000 套公寓及其纬度/经度
  • 一个有 3 000 个药房及其纬度/经度

  • 我想为我所有的公寓创建一个新变量:“最近药房的距离”

    为此,我尝试了两种方法 花很多时间 :

    第一种方法:我创建了一个矩阵,其中我的公寓排成一排,我的药房排成一排,它们在交叉点之间的距离,之后我只取矩阵的最小值以获得 90 000 值的列向量

    我只是使用 double for with numpy :
    m,n=len(result['latitude']),len(pharma['lat'])
    M = np.ones((m,n))
    for i in range(m):
    for j in range(n):
    if (result['Code departement'][i]==pharma['departement'][j]):
    M[i,j] =(pharma['lat'][j]-result['latitude'][i])**2+(pharma['lng'][j]-result['longitude'] [i])**2

    ps:我知道纬度/经度的公式是错误的,但公寓在同一地区,所以这是一个很好的近似值

    第二种方法:我使用这个主题的解决方案(谁是同样的问题,但数据较少)
    https://gis.stackexchange.com/questions/222315/geopandas-find-nearest-point-in-other-dataframe

    我使用了geopandas et最近的方法:
    from shapely.ops import nearest_points
    pts3 = pharma.geometry.unary_union


    def near(point, pts=pts3):
    nearest = pharma.geometry == nearest_points(point, pts)[1]
    return pharma[nearest].geometry.get_values()[0]

    appart['Nearest'] = appart.apply(lambda row: near(row.geometry), axis=1)


    正如我所说, 两种方法都花费太多时间 , 运行 1 小时后,我的个人电脑/笔记本电脑崩溃并且失败了。

    我的最后一个问题:你有更快的优化方法吗?有可能的 ?如果它已经优化,我将购买另一台 PC,但是要寻找能够进行如此快速计算的 PC 需要哪些标准?

    最佳答案

    我猜是 Ball Tree是适合此任务的结构。

    您可以使用 scikit-learn实现,请参阅下面的代码以获取适合您情况的示例:

    import numpy as np
    import geopandas as gpd
    from shapely.geometry import Point
    from sklearn.neighbors import BallTree

    ## Create the two GeoDataFrame to replicate your dataset
    appart = gpd.GeoDataFrame({
    'geometry': Point(a, b),
    'x': a,
    'y': b,
    } for a, b in zip(np.random.rand(100000), np.random.rand(100000))
    ])

    pharma = gpd.GeoDataFrame([{
    'geometry': Point(a, b),
    'x': a,
    'y': b,
    } for a, b in zip(np.random.rand(3000), np.random.rand(3000))
    ])

    # Create a BallTree
    tree = BallTree(pharma[['x', 'y']].values, leaf_size=2)

    # Query the BallTree on each feature from 'appart' to find the distance
    # to the nearest 'pharma' and its id
    appart['distance_nearest'], appart['id_nearest'] = tree.query(
    appart[['x', 'y']].values, # The input array for the query
    k=1, # The number of nearest neighbors
    )


    使用这种方法,您可以非常快速地解决您的问题(上面的例子,在我的电脑上,在 100000 个点的输入数据集上,用不到一秒钟的时间找到最近点的索引,在 3000 个点中)。

    默认情况下 query BallTree的方法正在返回到最近邻居的距离及其 id。
    如果您愿意,可以通过设置 return_distance 禁用返回此最近邻居的距离。 False 的参数.
    如果你真的只关心距离,你可以只保存这个值:
    appart['distance_nearest'], _ = tree.query(appart[['x', 'y']].values, k=1)

    关于python - 在其他数据框中找到最近的点(有很多数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58893719/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com