28 февраля 2024

🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

Автор статей по блокчейну, криптовалюте, безопасности и общим темам
В статье разбираем три различных способа преобразования адреса в широту и долготу с помощью Geopy.
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

Когда вы работаете с реальными данными, вы не можете полагаться на то, что в базах содержится вся необходимая информация для реализации вашего проекта Data Science. Чаще всего вы располагаете частичной информацией и должны обогатить данные дополнительными характеристиками.

Может возникнуть ситуация, когда набор данных содержит адрес, но в то же время широта и долгота отсутствуют. В этом случае первым шагом для дополнения данных будет добавление этой пары координат. Мы называем этот процесс преобразования адреса в широту и долготу геокодированием.

Геокодирование востребовано во многих областях, таких как недвижимость, финансы и логистика. Без этой технологии вы не сможете анализировать и визуализировать полученные данные на карте. В этом руководстве мы будем заниматься геокодированием на Python с помощью библиотеки Geopy.

🐍 Библиотека питониста
Больше полезных материалов вы найдете на нашем телеграм-канале«Библиотека питониста»
🐍🎓 Библиотека собеса по Python»
Подтянуть свои знания по Python вы можете на нашем телеграм-канале«Библиотека собеса по Python»
🐍🧩 Библиотека задач по Python
Интересные задачи по Python для практики можно найти на нашем телеграм-канале«Библиотека задач по Python»

Что такое геокодирование?

Геокодирование – это процесс преобразования адресов (например, «Парковая дорога Амфитеатр, 1600, город Маунтин-Вью, штат Калифорния») в географические координаты (например, широта 37.423021 и долгота -122.083739), которые вы можете использовать для размещения маркеров на карте или позиционирования карты. Проще говоря, это вычислительный процесс преобразования описания физического адреса в местоположение на поверхности Земли.

Процесс геокодирования часто включает в себя интерполяцию пространственных объектов, таких как улицы или земельные участки, в географические границы карты. Полученные данные выводятся в виде числовых координат, пригодных для использования в пространственном анализе или визуализации карт.

При геокодировании используются различные источники данных для преобразования адреса в географическое местоположение. Первичным источником является справочная база данных улиц, содержащая названия и диапазоны адресов в пределах определенного округа или района. Другие источники включают базы данных почтовых индексов, базы данных названий городов и базы данных важных мест (например, парков или достопримечательностей).

Геокодирование – это не только получение координат по заданному адресу. Оно также используется в пространственном анализе, поиске данных и их обработке. К примеру, компании используют геокодирование для анализа демографической информации с целью проведения целевых маркетинговых кампаний или оптимизации маршрутов доставки. В сфере общественной безопасности геокодирование используется для определения местоположения чрезвычайных происшествий, чтобы оперативно направлять ближайшие службы спасения.

В контексте Data Science геокодирование является важным этапом в процессе создания геопространственных визуализаций и может использоваться в различных областях, таких как прогнозирование цен на недвижимость, оптимизация маршрутов доставки и разработка планов реагирования на стихийные бедствия.

Что такое Geopy?

Библиотека Geopy
Библиотека Geopy

Geopy – это библиотека Python с открытым исходным кодом, специализирующаяся на добавлении местоположения к данным с помощью сервисов геокодирования, таких как Google Maps, Open StreeMap и ArcGIS.

Пример реализации проекта по геокодированию на практике

В этой статье мы проанализируем массив данных канадских музеев с сайта Kaggle. В нем содержится информация о музеях, расположенных в Канаде. Эта подборка музеев может быть полезна для прогнозирования цен на жилье Airbnb в Торонто. Например, вы могли заметить, что стоимость аренды жилья увеличивается с приближением к таким интересным местам, как музеи, рестораны, кафе и так далее.

Давайте посмотрим на таблицу:

        import pandas as pd
import geopy

l_cols= ['Name','Street Address','City','State','Zipcode']
df = pd.read_csv('/kaggle/input/canada-museums/museums list CAN.csv', encoding = "ISO-8859-1",usecols=l_cols)
df = df[df.City=='Toronto']
df.head()

    
Информация об объектах
Информация об объектах

На изображении таблицы выше видно, что разные столбцы содержат информацию об объектах, включая название музея, адрес улицы, город, штат и почтовый индекс.

Для дальнейших действий нам понадобится уникальный столбец, который объединит всю информацию из этой таблицы. Как мы можем это сделать? Самый эффективный способ объединить более двух столбцов – это использовать pandas.series.str.cat(), который дает нам возможность задать нужный разделитель между одним столбцом и другим:

        df['Country'] = 'Canada'
l_cols_concat = ['Street Address','City','State','Zipcode','Country']
df['unique_address'] = df['Name'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
df.head()

    
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

Мы можем использовать строковую переменную 'address1', которая будет содержать уникальный адрес первой строки:

        address1 = df['unique_address'].iloc[0]
print(address1)
# Bizune Event Gallery,452 Richmond St W,Toronto,ON,M5V 1Y1,Canada

    

Мы будем использовать ее в следующих шагах, чтобы поэкспериментировать с различными сервисами геокодирования по отдельному адресу. Когда станет понятно, как Geopy определяет местоположение, это можно будет применить к целому столбцу DataFrame Pandas. Мы протестируем следующих крупнейших геопровайдеров:

  1. Google Maps
  2. OpenStreetMap
  3. ArcGIS

Геокодирование с помощью Google Maps API

Геокодирование с помощью Google Maps API
Геокодирование с помощью Google Maps API

Самый популярный метод преобразования адресов в координаты – это использование Google Maps API.

Хотя Google Maps предоставляет платные услуги, при первом создании аккаунта вы получаете 200 долларов в качестве бонусных кредитов.

Чтобы получить доступ к сервису, необходимо создать новый аккаунт на платформе Google Maps. Здесь вы найдете отличное руководство, которое поможет вам в процессе генерации ключа API.

        GM_API_KEY = 'your_api_key'
from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key=GM_API_KEY)


    

GoogleV3 – это класс, предназначенный для использования API Google Maps v3. Для начала мы можем попробовать извлечь местоположение из одного адреса:

        location = geolocator.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

    
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

После этого мы можем попробовать выполнить эту операцию для значения unique_address, которое мы создали ранее.

        def service_geocode(g_locator, address):
    location = g_locator.geocode(address)
    if location!=None:
      return (location.latitude, location.longitude)
    else:
      return np.NaN

    

Мы можем использовать функцию apply(), чтобы применить ее ко всем строкам unique_address:

        df['LAT_LON'] = df['unique_address'].apply(lambda x:service_geocode(geolocator,x))
df[['unique_address','LAT_LON']].head()

    
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

Геокодирование с помощью API OpenStreetMap

Геокодирование с помощью API OpenStreetMap
Геокодирование с помощью API OpenStreetMap

Поскольку OpenStreetMap – самая большая и свободно редактируемая географическая база данных и проект, API является бесплатным. Чтобы геолоцировать один адрес, достаточно указать в качестве исходных данных для класса Nominatim электронную почту вашего аккаунта OSM, а не ключ API:

        from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your_email")
location = geolocator.geocode(address1)
print(location)
# None

    

К сожалению, местоположение, возвращаемое API OpenStreetMap, равно None, поскольку он не распознает адрес.

Действительно, этот API не может определить местоположение большинства адресов улиц в базе данных, поскольку не имеет достаточного охвата адресов во всех районах.

По этой причине нам необходимо создать еще одно значение unique_address_osm с меньшим количеством информации:

        l_cols_concat = ['City','State','Country']
df['unique_address_osm'] = df['Street Address'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
address1_osm = df['unique_address_osm'].iloc[0]

    

После этого мы получаем новый адрес и снова пытаемся извлечь широту и долготу из адреса улицы:

        address1_osm = df['unique_address_osm'].iloc[0]
location = geolocator.geocode(address1_osm)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

    
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

Как и в предыдущем случае, мы применяем функцию service_geocode() ко всем столбцам unique_address_osm:

        df['LAT_LON_osm'] = df['unique_address_osm'].apply(lambda x: service_geocode(geolocator,x))
df[['unique_address_osm','LAT_LON','LAT_LON_osm']].head()

    
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

Несмотря на то что мы не указали название музея, OpenStreetMap возвращает координаты, аналогичные GoogleMapsAPI.

Геокодирование с помощью ArcGIS API

ArcGIS – это программное обеспечение, позволяющее анализировать и визуализировать геопространственные данные. Оно также предоставляет сервисы определения местоположения, такие как Google Maps и OpenStreetMap.

        from geopy.geocoders import ArcGIS
geolocator_arcgis = ArcGIS()
location = geolocator_arcgis.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

    
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

На этот раз проблем с получением пары координат не возникло. Мы можем продолжить выполнение этой операции для всех адресов:

        df['LAT_LON_arcgis'] = df['unique_address'].apply(lambda x: service_geocode(geolocator_arcgis,x))
df[['unique_address','LAT_LON','LAT_LON_osm','LAT_LON_arcgis']].head()

    
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

Взглянув на первые строки массива данных, мы видим, что пары координат, полученные с помощью ArcGIS, аналогичны тем, что были получены ранее, присутствует лишь небольшая разница.

Измерение расстояния между двумя пунктами

Еще одна функциональность Geopy – возможность рассчитать расстояние между двумя точками. Для этого используется геодезическое расстояние, полученное между двумя парами (широта и долгота).

        from geopy.distance import geodesic
point1 = df.LAT_LON_arcgis.iloc[0]
point2 = df.LAT_LON_arcgis.iloc[1]
distance = geodesic(point1, point2)
print('The distance between {} and {} is {} meters'.format(df.Name.iloc[0],df.Name.iloc[1],distance.meters))

    
🐍🗺 Геокодирование для Data Scientists: вводное руководство с примерами

Расстояние между этими двумя музеями составляет около 2-х километров.

***

Вот и все! Вы узнали три разных способа преобразования адреса в широту и долготу с помощью Geopy. Это лишь отправная точка для более сложного и продвинутого анализа геопространственных данных.

Комментарии

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ