見出し画像

【データコンペ】Geopyで2点間の距離を総当り算出して最小の組み合わせを抽出する方法

位置情報(緯度,経度)が複数にあった時に、
その距離を算出して最も近いもの同士を抽出する方法を紹介します。

※使用したケースを超ざっくり説明
SIGNATEの水位予測コンペで、水位観測所・雨量観測所、2つの住所一覧データがありました。
そこでどの水位観測所のデータにどの雨量観測所データを当てはめるか、
ロジックを作る必要があり、そこで距離で決めようと考えました。

※注意
変数名が適当です

Geopyのインストール

pip install geopy

総当り距離の算出

ポイントはgeodesic使用時に.milesで算出すること
仕様的な理解出来なかったのですが、デフォルトだとkmになっていて、
それ自体は問題ではありますが特殊なデータ型で格納されて、大小比較ができなくなります。


def geo(ws_temp,rs_temp):
  ws1 = ws_temp[['観測所名称', '緯度', '経度']]
  for i in range(len(rs_temp)) :
    try:
        ws1[rs_temp['観測所名称'][i]] = ws1.apply(lambda x:geodesic((x["緯度"], x["経度"]), (rs_temp['緯度'][i], rs_temp['経度'][i])).miles, axis=1)
    except KeyError:
        break
  return ws1


最小値の抽出

geoメソッドを実行して、
その中からidxminを使うと最小値を取得することが出来る。

station_masta = geo(wm_usable,rs_usable)
s_min = station_min_target.idxmin(axis = 1)

(ちょっと雑だけどほぼ自分のメモ代わりなので・・)

自分で試したときは大小比較できなかったのが壁で、
milesにすると可能になるという、教えてもらったことによる学びでした。




いいなと思ったら応援しよう!