当前位置: 首页 > 知识库问答 >
问题:

在其他数据框中查找最近点(包含大量数据)

微生智刚
2023-03-14

问题很简单,我有两个数据帧:

>

  • 一个有90000套公寓和他们的经纬度

    还有一个有3000个药房和他们的经纬度

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

    为此,我尝试了两种花费大量时间的方法:

    第一种方法:我创建了一个矩阵,我的公寓排成一行,我的药店排成一列,它们之间的距离在交叉点上,然后我只取矩阵的最小值,得到一个90000值的列向量

    我只是用了一个双人床来搭配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:我知道lat/long的公式是错误的,但公寓位于同一区域,所以这是一个很好的近似值

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

    我使用了geopandas等最接近的方法:

    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个答案

    武向文
    2023-03-14

    我想球树是这个任务的合适结构。

    您可以使用scikit学习实现,请参阅下面的代码以获取适合您的案例的示例:

    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点中)。

    默认情况下,BallTree的查询方法返回到最近邻居的距离及其id。如果需要,可以通过将return_distance参数设置为False来禁用返回最近邻居的距离。如果你真的只关心距离,你只能保存这个值:

    appart['distance_nearest'], _ = tree.query(appart[['x', 'y']].values, k=1)
    
     类似资料:
    • 我有一个这样的csv文件: 我必须按“姓名”和“出生日期”(可能与其他列一起)查找唯一的行,但必须按最大日期查找。 因此,我必须获得如下csv文件: 怎么做?我没有任何想法。。

    • 问题内容: 我有这种表,找到最大的标记 学生 外面应该是这样的 但我得到这种输出 我用SQL写这个 我该如何纠正sql? 问题答案: 在SQL Server中,您可以使用 尽管您也可以使用逻辑上等效的标准SQL

    • 我做了一些搜索,不知道如何通过,但是我想知道是否有一种方法可以实现相反的效果:通过该集合的补充来过滤数据帧。例如:为了。 这可以通过方法实现吗?

    • 本文向大家介绍C ++程序查找数组中最近的点对,包括了C ++程序查找数组中最近的点对的使用技巧和注意事项,需要的朋友参考一下 这是在数组中查找最接近的点对的程序。 演算法 对于最近点之间的距离 要计算最小距离- 示例 输出结果

    • 我有一个巨大的表(大约4000万行),称为nearest_spot,表示行(以linestring格式)和它们所到的最近点(大约有1500个不同的点,存储在另一个表中)。最近的_点表如下所示: 其中data_id为主键,spot_id是spot表主键的外键,spot_name是spot名称(我知道冗余不好但我不允许修改数据库)和link_geom是行坐标。 数据库位于PostgreSQL 10.6

    • 第一次问问题(温柔点),因为我还没有找到任何有用的东西。 在R中,我有两个数据帧。一个(DataFrameA)有一列带有唯一日期列表。另一个(DataFrameB)也有日期列表。但是DataFrameB中的某些日期在DataFrameA中可能不存在。在这种情况下,我想将DataFrameB中的日期更新为DataFrameA中的最小日期,该日期大于DataFrameB中的日期。 在SQL中,我可能会