Geopy Nominatim - неправильное определение координат
Взяты станы и регионы из таблиц по запросам в wordstat. Код должен искать координаты регионов с помощью geopy и в итоге добавлять столбцы с широтой и долготой. Конечная цель - изображение точек на карте.
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="Stiven")
def get_coords(address, geolocator=geolocator):
if geolocator is None:
geolocator = Nominatim(user_agent="Stiven")
ret = geolocator.geocode(address, timeout = 60)
if ret is None:
return None
return ret.latitude, ret.longitude
wordstat['Coordinates'] = wordstat[0].map(get_coords)
#wordstat = wordstat.dropna()
wordstat[["Latitude", "Longitude"]] = pd.DataFrame(wordstat['Coordinates'].tolist(), columns=["lat", "long"])
del wordstat['Coordinates']
#wordstat = wordstat.dropna()
wordstat[:20]
Output:
0 1 2 Latitude Longitude
1 Область Арарат 4189 194.0 35.000074 104.999927
2 **Китай 48341 173.0 66.000647 169.490087**
3 Чукотский автономный округ 14353 160.0 43.736833 41.726799
5 Карачаево-Черкесская Республика 97196 141.0 40.248330 45.145513
6 Черногория 4009 141.0 38.628173 70.815654
7 Область Гехаркуник 3406 138.0 46.622503 31.099490
8 Таджикистан 118110 136.0 67.678325 57.062685
9 Южный АО 2023 136.0 45.564344 17.011895
10 Ненецкий автономный округ 25157 136.0 45.813311 14.480837
11 Хорватия 1932 134.0 67.147163 74.341549
12 Словения 2048 134.0 34.982302 33.145128
13 Ямало-Ненецкий автономный округ 348596 134.0 41.526535 43.246957
15 Кипр 8439 131.0 51.478180 7.554234
16 Самцхе-Джавахети 2511 129.0 45.189003 34.740110
17 Новая Зеландия 1368 129.0 63.246778 25.920916
18 Северный Рейн-Вестфалия 2312 128.0 44.863258 43.440691
19 Республика Крым 1304900 127.0 63.551503 154.014726
21 Финляндия 18286 126.0 50.708012 37.583762
22 Ставропольский край 1316045 123.0 54.475184 45.021182
23 Магаданская область 52366 123.0 52.887332 33.415853
Если же изобразить точки на карте (через Plotly, go.Figure) получается, что Китай находится около Камчатки, Япония - на Средиземном море, а Архангельская область - в Норвегии. Проверив получившиеся координаты с настоящими нашла множество ошибок (но наверняка, они везде), так что проблема точно с ними, а не с графиком.

Ответы (2 шт):
Вы неправильно использовали решение, данное на ваш предыдущий вопрос - не указали index в конструкторе pd.DataFrame():
# даем столбцам нормальные названия
df.columns = ["name", "val1", "val2"]
# получаем координаты
df["coords"] = df["name"].map(get_coords)
df[["lat", "lon"]] = \
pd.DataFrame(df.pop("coords").tolist(),
columns=["lat", "long"],
index=df.index)
получим:
In [203]: df
Out[203]:
name val1 val2 lat lon
0 Область Арарат 4189 194.0 39.855342 44.694583
1 Китай 48341 173.0 35.000074 104.999927
2 Чукотский автономный округ 14353 160.0 66.000647 169.490087
3 Карачаево-Черкесская Республика 97196 141.0 43.736833 41.726799
4 Черногория 4009 141.0 42.986885 19.518099
5 Область Гехаркуник 3406 138.0 40.248330 45.145513
6 Таджикистан 118110 136.0 38.628173 70.815654
7 Южный АО 2023 136.0 46.622503 31.099490
8 Ненецкий автономный округ 25157 136.0 67.678325 57.062685
9 Хорватия 1932 134.0 45.564344 17.011895
10 Словения 2048 134.0 45.813311 14.480837
11 Ямало-Ненецкий автономный округ 348596 134.0 67.147163 74.341549
12 Кипр 8439 131.0 34.982302 33.145128
13 Самцхе-Джавахети 2511 129.0 41.526535 43.246957
14 Новая Зеландия 1368 129.0 -41.500083 172.834408
15 Северный Рейн-Вестфалия 2312 128.0 51.478180 7.554234
16 Республика Крым 1304900 127.0 45.189003 34.740110
17 Финляндия 18286 126.0 63.246778 25.920916
18 Ставропольский край 1316045 123.0 44.863258 43.440691
19 Магаданская область 52366 123.0 63.551503 154.014726
рисуем на карте:
import plotly.express as px
fig = px.scatter_geo(df, lat="lat", lon="lon", hover_name="name", size="val1")
fig.show()
результат:
Проблема была не с определением координат, а выделением долготы и широты. С добавлением последнего параметра проблема исчезла.
df[["Latitude", "Longitude"]] = pd.DataFrame(df['Coordinates'].tolist(),
columns=["lat", "long"],
index=df.index)

