【问题标题】:Group GPS points with Pandas与 Pandas 组合 GPS 点
【发布时间】:2019-04-26 07:42:18
【问题描述】:

我有一个 Pandas 塔数据框,例如:

site       lat      lon
18ALOP01   11.1278  14.3578
18ALOP02   11.1278  14.3578
18ALOP12   11.1288  14.3575
18PENO01   11.1580  14.2898

如果它们太近(50m),我需要将它们分组。然后,我制作了一个执行“自交叉连接”的脚本,计算所有站点组合之间的距离,并为距离小于阈值的站点设置相同的 id。因此,如果我有 n 个站点,它将计算 (n^2) - n 组合,那么,这是一个糟糕的算法。有更好的方法吗?

【问题讨论】:

  • 您的预期输出是什么样的?
  • 如果点a 距离b 40m,距离c 80m,并且点b 距离c 45m,会发生什么?他们都在同一个组吗?
  • 是的,没问题。

标签: python pandas geo geopandas


【解决方案1】:

假设站点的数量和“真实”位置未知,您可以尝试MeanShift 聚类算法。虽然这是一种通用算法并且不具有高度可扩展性,但它比在 python 中实现您自己的聚类算法更快,并且您可以尝试使用bin_seeding=True 作为优化,如果将数据点合并到网格中是可接受的捷径修剪起始种子。 (注意:如果将数据点合并到网格中,而不是计算点之间的欧几里得距离,是一种可接受的“完整”解决方案,那么这似乎是解决问题的最快方法。)

这是 scikit-learn 实现 MeanShift 的示例,其中 x/y 坐标以米为单位,算法创建半径为 50m 的集群。

In [2]: from sklearn.cluster import MeanShift

In [3]: import numpy as np

In [4]: X = np.array([
   ...:     [0, 1], [51, 1], [100, 1], [151, 1],
   ...: ])

In [5]: clustering = MeanShift(bandwidth=50).fit(X)  # OR speed up with bin_seeding=True

In [6]: print(clustering.labels_)
[1 0 0 2]

In [7]: print(clustering.cluster_centers_)
[[ 75.5   1. ]
 [  0.    1. ]
 [151.    1. ]]

【讨论】:

    猜你喜欢
    • 2018-11-19
    • 2019-07-03
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多