Если вы посадите меня где угодно в Манхэттене, я с уверенностью скажу, где находится ближайшее заведение с бабл-чаем. Возможно, это потому, что я помню многие из них, но в те моменты, когда память подводит, мне на помощь приходит карта бабл-чая на моём блоге о данных. В этом руководстве мы используем комбинацию Python, API Google Maps и geojsonio, чтобы создать то, что можно назвать самым важным инструментом в мире: карту бабл-чая.
Прежде чем начать писать код, нужно настроить окружение. Это руководство написано для Python 3.6. Если вы ещё не сделали этого, скачайте Python и Pip. Далее вам потребуется установить несколько пакетов, которые мы будем использовать в этом уроке, через командную строку в директории вашего проекта:
Мы будем использовать API Google Maps, поэтому убедитесь, что у вас сгенерирован ключ API. Поскольку мы работаем с Python, использование Jupyter Notebook — лучший способ извлечь максимум из этого руководства. Как только ваш ноутбук будет готов к работе, вы можете скачать все данные для этой статьи с GitHub. Убедитесь, что данные находятся в той же директории, что и ваш ноутбук, и тогда мы можем начинать!
Для этой задачи мы применим объектно-ориентированный подход. Мы создадим класс *BubbleTea* для обработки данных и методов, которые понадобятся нашему боту. Для этого начнём с использования модуля googlemaps для инициализации аутентификации и библиотеки pandas для анализа данных, чтобы прочитать CSV-файл.
В приведённом выше примере кода инициализация `googlemaps` происходит перед конструктором, так как этот ключ API не должен меняться. Однако в конструкторе нам нужен параметр с именем файла, содержащего данные о местах с бабл-чаем, чтобы мы могли использовать pandas для его чтения в виде DataFrame.
Чтобы понять, с чем мы работаем, давайте взглянем на файл с местами продажи бабл-чая:
Как видите, это простой `DataFrame`, содержащий две колонки: одна с названием заведения, а другая — с его адресом.
Чтобы визуализировать каждое место продажи бабл-чая как точку на карте, нужно преобразовать адреса в координаты. В конечном итоге мы будем использовать эти координаты для создания геопространственных объектов Point с помощью библиотеки shapely.
Давайте разберёмся, как получаются эти координаты. Поскольку у нас нет широты и долготы, мы будем использовать модули `geocoder` и `googlemaps` для запроса координат. Ниже вы можете увидеть запрос к API с помощью `geocoder.google()`. В качестве параметра мы передаём адрес, который будет использован для создания геопространственного объекта. В этом примере я использовал адрес здания Колумбийского университета.
Это выводит следующий результат:
Выводы:
Давайте используем рассмотренный выше код, чтобы добавить три колонки в наш CSV-файл с данными о бабл-чае: Широта, Долгота и Координаты. Эта функция создаст колонки с долготой и широтой, а затем использует их для создания геопространственного объекта Point с помощью shapely — библиотеки, которая позволяет работать с геометрическими объектами.
Последний шаг в этом проекте — визуализация геопространственных данных с помощью geojsonio. Но чтобы использовать geojsonio, нам нужно преобразовать вышеуказанный DataFrame в формат GeoJSON. На первый взгляд это может показаться сложным, так как изначально наши данные были в формате CSV. Однако не стоит беспокоиться: мы можем сделать это с помощью нескольких строк кода. Конкретнее, мы создадим три вспомогательных метода для работы функции `visualize`.
Функция `get_geo` возвращает координаты в виде списка:
Функция `get_names()` возвращает колонку Name в виде серии.
И наконец, `get_gdf` преобразует все данные в `GeoDataFrame` и возвращает объект того же типа. Здесь мы используем две предыдущие функции, так как первый параметр требует, чтобы индексы были в виде серии, а параметр `geometry` требует список.
Отлично! Теперь давайте используем geojsonio для создания карты бабл-чая! Теперь, когда все вспомогательные функции реализованы, мы можем использовать их для визуализации с помощью функции `display` из geojsonio.
И вот мы это сделали — наш объект `BubbleTea` готов к использованию. Продолжая работу в том же Jupyter Notebook, мы используем только что созданный код для построения карты. Мы инициализируем класс с нашим файлом данных о бабл-чае в новой ячейке ноутбука. Помните, что это только инициализирует то, что находится в конструкторе, поэтому на данный момент у нас создан только pandas `DataFrame` — `GeoDataFrame` ещё не создан.
Далее мы вызываем метод `calc_coords`. Напомним, что эта функция делает API-запросы к Google Maps для получения широты и долготы, а затем использует эти две колонки для преобразования в объект shapely `Point`.
Из-за большого количества запросов к API Google Maps это может занять некоторое время. Пока идёт обработка, уделите время чтению этой замечательной статьи.
Самая долгая часть позади! Теперь мы готовы создать нашу потрясающую карту бабл-чая:
Это даёт нам красивую интерактивную карту, которую мы можем использовать для любых целей. Я решил опубликовать её в Gist на GitHub, но у geojsonio есть множество способов поделиться вашим контентом, так что выбирайте то, что подходит именно вам.
На этом всё! Если вы хотите узнать больше о геопространственном анализе, ознакомьтесь со следующими ресурсами:
GeoJSON
OpenStreetMap
CartoDB
Если вам понравилось то, что вы сделали здесь, подписывайтесь на меня в Twitter @lesleyclovesyou, чтобы получать больше контента, рассуждений о науке о данных и, что самое важное, ретвиты очень милых щенков.