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. Это лишь отправная точка для более сложного и продвинутого анализа геопространственных данных.

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию
Java Team Lead
Москва, по итогам собеседования
Разработчик С#
от 200000 RUB до 400000 RUB

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