- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование Python для data science
- •Для кого эта книга?
- •О чем эта книга?
- •Глава 1. Базовые знания о данных
- •Категории данных
- •Неструктурированные данные
- •Структурированные данные
- •Слабоструктурированные данные
- •Данные временных рядов
- •Источники данных
- •Веб-страницы
- •Базы данных
- •Файлы
- •Получение
- •Очистка
- •Преобразование
- •Анализ
- •Хранение
- •Питонический стиль
- •Выводы
- •Глава 2. Структуры данных Python
- •Списки
- •Создание списка
- •Использование общих методов списков
- •Использование срезов
- •Использование списка в качестве очереди
- •Использование списка в качестве стека
- •Использование списков и стеков для обработки естественного языка
- •Расширение функциональности с помощью списковых включений
- •Кортежи
- •Список кортежей
- •Неизменяемость
- •Словари
- •Список словарей
- •Добавление элементов в словарь с помощью setdefault()
- •Преобразование JSON в словарь
- •Множества
- •Удаление дубликатов из последовательности
- •Общие операции с множеством
- •Упражнение № 1: продвинутый анализ тегов фотографий
- •Выводы
- •NumPy
- •Установка NumPy
- •Создание массива NumPy
- •Выполнение поэлементных операций
- •Использование статистических функций NumPy
- •Упражнение № 2: использование статистических функций numpy
- •pandas
- •Установка pandas
- •pandas Series
- •Упражнение № 3: объединение трех серий
- •pandas DataFrame
- •Упражнение № 4: использование разных типов join
- •scikit-learn
- •Установка scikit-learn
- •Получение набора образцов
- •Преобразование загруженного датасета в pandas DataFrame
- •Разделение набора данных на обучающий и тестовый
- •Преобразование текста в числовые векторы признаков
- •Обучение и оценка модели
- •Создание прогнозов на новых данных
- •Выводы
- •Глава 4. Доступ к данным из файлов и API
- •Импортирование данных с помощью функции open()
- •Текстовые файлы
- •Файлы с табличными данными
- •Упражнение № 5: открытие json-файлов
- •Двоичные файлы
- •Экспортирование данных в файл
- •Доступ к удаленным файлам и API
- •Как работают HTTP-запросы
- •Библиотека urllib3
- •Библиотека Requests
- •Упражнение № 6: доступ к api с помощью requests
- •Перемещение данных в DataFrame и из него
- •Импортирование вложенных структур JSON
- •Конвертирование DataFrame в JSON
- •Выводы
- •Глава 5. Работа с базами данных
- •Реляционные базы данных
- •Понимание инструкций SQL
- •Начало работы с MySQL
- •Определение структуры базы данных
- •Вставка данных в БД
- •Запрос к базе данных
- •Упражнение № 8: объединение «один-ко-многим»
- •Использование инструментов аналитики баз данных
- •Базы данных NoSQL
- •Документоориентированные базы данных
- •Упражнение № 9: вставка и запрос нескольких документов
- •Выводы
- •Глава 6. Агрегирование данных
- •Данные для агрегирования
- •Объединение датафреймов
- •Группировка и агрегирование данных
- •Просмотр конкретных агрегированных показателей по MultiIndex
- •Срез диапазона агрегированных значений
- •Срезы на разных уровнях агрегирования
- •Добавление общего итога
- •Добавление промежуточных итогов
- •Выбор всех строк в группе
- •Выводы
- •Глава 7. Объединение датасетов
- •Объединение встроенных структур данных
- •Объединение списков и кортежей с помощью оператора +
- •Объединение словарей с помощью оператора **
- •Объединение строк из двух структур
- •Реализация join-объединений списков
- •Конкатенация массивов NumPy
- •Объединение структур данных pandas
- •Конкатенация датафреймов
- •Удаление столбцов/строк из датафрейма
- •Join-объединение двух датафреймов
- •Выводы
- •Глава 8. Визуализация
- •Распространенные способы визуализации
- •Линейные диаграммы
- •Столбчатые диаграммы
- •Круговые диаграммы
- •Гистограммы
- •Построение графиков с помощью Matplotlib
- •Установка Matplotlib
- •Использование matplotlib.pyplot
- •Работа с объектами Figure и Axes
- •Создание гистограммы с помощью subplots()
- •Совместимость Matplotlib с другими библиотеками
- •Построение графиков для данных pandas
- •Отображение данных геолокации с помощью Cartopy
- •Выводы
- •Глава 9. Анализ данных о местоположении
- •Получение данных о местоположении
- •Преобразование стандартного вида адреса в геокоординаты
- •Получение геокоординат движущегося объекта
- •Анализ пространственных данных с помощью geopy и Shapely
- •Поиск ближайшего объекта
- •Поиск объектов в определенной области
- •Объединение двух подходов
- •Упражнение № 15: совершенствование алгоритма подбора машины
- •Получение непространственных характеристик
- •Объединение датасетов с пространственными и непространственными данными
- •Выводы
- •Глава 10. Анализ данных временных рядов
- •Регулярные и нерегулярные временные ряды
- •Общие методы анализа временных рядов
- •Вычисление процентных изменений
- •Вычисление скользящего окна
- •Вычисление процентного изменения скользящего среднего
- •Многомерные временные ряды
- •Обработка многомерных временных рядов
- •Анализ зависимости между переменными
- •Выводы
- •Глава 11. Получение инсайтов из данных
- •Ассоциативные правила
- •Поддержка
- •Доверие
- •Лифт
- •Алгоритм Apriori
- •Создание датасета с транзакциями
- •Определение часто встречающихся наборов
- •Генерирование ассоциативных правил
- •Визуализация ассоциативных правил
- •Получение полезных инсайтов из ассоциативных правил
- •Генерирование рекомендаций
- •Планирование скидок на основе ассоциативных правил
- •Выводы
- •Глава 12. Машинное обучение для анализа данных
- •Почему машинное обучение?
- •Типы машинного обучения
- •Обучение с учителем
- •Обучение без учителя
- •Как работает машинное обучение
- •Данные для обучения
- •Статистическая модель
- •Неизвестные данные
- •Пример анализа тональности: классификация отзывов о товарах
- •Получение отзывов о товарах
- •Очистка данных
- •Разделение и преобразование данных
- •Обучение модели
- •Оценка модели
- •Упражнение № 19: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
200 Глава 9. Анализ данных о местоположении
расстояние до места посадки пассажира будет больше, чем расстояние по прямой. Исходя из этого, рассмотрим более надежный способ подбора автомобиля для конкретного места подачи.
Поиск объектов в определенной области
Часто, чтобы определить наиболее подходящее такси, нужно задать вопрос не «Какая машина ближе всего?», а «Какая машина находится в районе места подачи?». Это справедливо не только потому, что фактическое расстояние от одной точки до другой оказывается почти всегда больше, чем расстояние между точками по прямой. На практике такие преграды, как река или железнодорожные пути, часто разделяют географические области на отдельные зоны, которые соединяются только в ограниченном количестве точек в виде мостов, туннелей и т. п. Поэтому непосредственное расстояние может быть весьма обманчивым. Рассмотрим пример на рис. 9.2.
Рис. 9.2. Препятствие в виде реки может ввести в заблуждение при измерении расстояния (pick-up — место подачи)
Видим, что на рисунке cab_26 находится ближе всего к месту посадки, но из-за реки cab_112, скорее всего, доберется туда быстрее. До этого несложно додуматься, глядя на карту, но как прийти к этому же выводу в Python-скрипте? Один из способов — разделить территорию на несколько небольших многоугольников, или областей, окруженных набором связанных прямых линий, а затем проверить, какие автомобили находятся в том же многоугольнике, что и место посадки.
В данном конкретном примере необходимо определить многоугольник, который охватывает место посадки и ограничен рекой. Границы многоугольника можно определить вручную через Google Maps: щелкните правой кнопкой мыши на нескольких точках, которые, соединяясь, образуют замкнутый многоугольник, и запишите геокоординаты каждой точки. Получив координаты, объявите многоугольник в скрипте с помощью библиотеки Shapely.
Анализ пространственных данных с помощью geopy и Shapely 201
Вот как создать многоугольник с помощью Shapely и проверить, находится ли заданная точка внутри этого многоугольника:
from shapely.geometry import Point, Polygon
coords = [(46.082991, 38.987384), (46.075489, 38.987599), (46.079395, 38.997684), (46.073822, 39.007297), (46.081741, 39.008842)]
poly = Polygon(coords)
cab_26 = Point(46.073852, 38.991890) cab_112 = Point(46.078228, 39.003949) pick_up = Point(46.080074, 38.991289)
print('cab_26 within the polygon:', cab_26.within(poly)) print('cab_112 within the polygon:', cab_112.within(poly)) print('pick_up within the polygon:', pick_up.within(poly))
Сначала импортируем два класса Shapely: Point и Polygon . Затем создаем объект Polygon с помощью списка кортежей с широтой и долготой . Этот объект представляет собой область к северу от реки, включающую место посадки. Далее создаем несколько объектов Point, представляющих местоположение cab_26, cab_112 и место подачи соответственно . Наконец, выполняем несколько запросов, содержащих геоданные, чтобы определить, находится ли определенная точка внутри многоугольника, используя метод Shapely’s within() . В результате выполнения скрипта получаем:
cab_26 within the polygon: False cab_112 within the polygon: True pick_up within the polygon: True
УПРАЖНЕНИЕ № 14: ОПРЕДЕЛЕНИЕ ДВУХ
ИБОЛЕЕ МНОГОУГОЛЬНИКОВ
Впредыдущем разделе мы использовали многоугольник, охватывающий одну область на карте. Теперь попробуйте задать два или более соседних многоугольника, охватывающих определенные районы города, разделенные препятствием, например рекой. Получите координаты этих многоугольников, используя Google-карты своего города или любого другого населенного пункта планеты. Вам также понадобятся координаты нескольких точек, входящих в многоугольники, чтобы смоделировать местоположение автомобилей и места подачи.
202 Глава 9. Анализ данных о местоположении
В скрипте задайте многоугольники с помощью Shapely и сгруппируйте их в словарь, а точки, представляющие машины, соберите в другой словарь. Затем разделите автомобили на группы в зависимости от того, в каком многоугольнике они находятся. Это можно сделать с помощью двух циклов: внешнего (для перебора многоугольников) и внутреннего (для перебора точек, представляющих автомобили). На каждой итерации внутреннего цикла проверяйте, находится ли точка подачи внутри многоугольника. Следующий фрагмент кода иллюстрирует, как это реализовать:
--фрагмент-- cabs_dict ={}
polygons = {'poly1': poly1, 'poly2': poly2} cabs = {'cab_26': cab_26, 'cab_112': cab_112} for poly_name, poly in polygons.items():
cabs_dict[poly_name] = []
for cab_name, cab in cabs.items(): if cab.within(poly):
cabs_dict[poly_name].append(cab_name)
--фрагмент--
Далее необходимо определить, в каком многоугольнике находится место посадки. Узнав эту информацию, выберите соответствующий список машин из словаря cabs_dict, используя название многоугольника в качестве ключа. Наконец, с помощью geopy определите, какое такси в выбранном многоугольнике находится ближе всего к месту подачи.
Объединение двух подходов
До сих пор мы выбирали наиболее подходящий автомобиль либо в пределах определенной области, либо рассчитывая линейное расстояние до точки. На самом деле, самый точный результат может дать комбинирование этих двух подходов, поскольку не всегда нужно слепо исключать все такси, которые не находятся в том же многоугольнике, что и пассажир. Такси в соседней области может оказаться ближе всего по фактическому расстоянию поездки, даже если учесть, что придется делать крюк до моста через реку или объезжать другое препятствие. Ключевой момент — учесть пункты проезда из одного многоугольника в другой. На рис. 9.3 показано, как это сделать.
Пунктирная линия, проходящая через середину рисунка, представляет собой границу, разделяющую территорию на два многоугольника: к северу и к югу от
Анализ пространственных данных с помощью geopy и Shapely 203
реки. Знак равенства, установленный на мосту, обозначает пункт проезда, через который автомобили могут попасть из одного многоугольника в другой. Расстояние от такси, находящихся в многоугольнике, который граничит с областью, где находится точка посадки, состоит из двух частей: расстояния между текущим местоположением такси и пунктом проезда и расстояния между пунктом проезда и точкой посадки.
=
Рис. 9.3. Использование пунктов проезда между смежными областями
Чтобы найти ближайшую машину, необходимо определить, в каком многоугольнике находится каждый автомобиль, и на основе этих данных рассчитать расстояние от такси до места подачи: либо по прямой, если такси находится в том же многоугольнике, либо через пункт проезда, если оно находится в соседнем многоугольнике. Рассчитаем расстояние только для cab_26:
from shapely.geometry import Point, Polygon from geopy.distance import distance
coords = [(46.082991, 38.987384), (46.075489, 38.987599), (46.079395, 38.997684), (46.073822, 39.007297), (46.081741, 39.008842)]
poly = Polygon(coords)
cab_26 = Point(46.073852, 38.991890) pick_up = Point(46.080074, 38.991289) entry_point = Point(46.075357, 39.000298)
if cab_26.within(poly):
dist = distance((pick_up.x, pick_up.y), (cab_26.x,cab_26.y)).m else:
dist = distance((cab_26.x,cab_26.y), (entry_point.x,entry_point.y)).m + distance((entry_point.x,entry_point.y), (pick_up.x, pick_up.y)).m
print(round(dist))