问题很简单,我有两个数据帧:
>
一个有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)
正如我所说,这两种方法花费了太多的时间,在运行我的电脑/笔记本一个小时后崩溃了,它失败了。
我的最后一个问题:你有一个优化的方法去更快?有可能吗?如果它已经被优化,我会买一台其他的电脑,但是哪些标准,但是什么标准来寻找一台能够进行如此快速计算的电脑?
我想球树是这个任务的合适结构。
您可以使用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中,我可能会