- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
pandas 79
поля совпадающих строк из датафрейма emps. Однако важно понимать, что во множестве других случаев объединение методом right join — это не то же самое, что объединение inner join. Например, если в датафрейм salary добавить строку, для которой в emps нет совпадений, то объединение right join включит ее наряду со строками, имеющими совпадения в этом датафрейме.
ПРИМЕЧАНИЕ
Подробнее об объединении датафреймов см. в документации pandas1.
УПРАЖНЕНИЕ № 4: ИСПОЛЬЗОВАНИЕ РАЗНЫХ ТИПОВ JOIN
Важно понимать, как различные значения параметра how, переданного в метод join(), влияют на итоговый датафрейм.
Добавьте новую строку к датафрейму salary так, чтобы значение поля Empno для этой строки в датафрейме emps отсутствовало (в предыдущем разделе мы рассмотрели, как добавить строку в датафрейм с помощью объекта Series). После этого объедините датафреймы emps и salary так, чтобы новый датафрейм включал только те строки из emps, которые имеют совпадения в salary. Затем снова объедините emps и salary, но теперь так, чтобы новый датафрейм включал все строки из обоих датафреймов.
Объединение «один-ко-многим»
При объединении методом «один-ко-многим» (one-to-many) строка из одного датафрейма может соответствовать сразу нескольким строкам из другого датафрейма. Рассмотрим ситуацию, когда каждый продавец из датафрейма emps обработал несколько заказов. Это можно отобразить в датафрейме orders:
import pandas as pd
data = [[2608, 9001,35], [2617, 9001,35], [2620, 9001,139], [2621, 9002,95], [2626, 9002,218]]
orders = pd.DataFrame(data, columns = ['Pono', 'Empno', 'Total']) print(orders)
1https://pandas.pydata.org/pandas-docs/stable/reference/frame.html#combining- comparing-joining-merging
80 Глава 3. Библиотеки Python для data science
Так будет выглядеть orders:
|
Pono |
Empno |
Total |
0 |
2608 |
9001 |
35 |
1 |
2617 |
9001 |
35 |
2 |
2620 |
9001 |
139 |
3 |
2621 |
9002 |
95 |
4 |
2626 |
9002 |
218 |
|
|
|
|
Теперь, когда у вас есть датафрейм orders с заказами, можно объединить его
сдатафреймом сотрудников, созданным ранее. Это объединение типа «один- ко-многим», поскольку один сотрудник из датафрейма emps может быть связан
снесколькими строками из датафрейма orders:
emps_orders = emps.merge(orders, how='inner', left_on='Empno', right_on='Empno').set_index('Pono')
print(emps_orders)
Вэтом фрагменте кода мы применяем метод merge()для объединения данных из датафреймов emps и orders, имеющих связь «один-ко-многим». Метод merge() позволяет указать столбцы, по которым необходимо проводить объединение, сразу из обоих датафреймов, используя left_on для указания столбца из вызывающего датафрейма и right_on — для столбца из другого датафрейма. При использовании join() можно указать столбец, по которому нужно проводить объединение, только из вызывающего датафрейма. А из другого датафрейма join() берет столбец индексов.
Вэтом примере мы применяем внутренний тип объединения (inner), чтобы включить только связанные строки из обоих датафреймов. В результате получаем следующий датасет:
|
Empno |
Name |
Job |
Total |
Pono |
|
|
|
|
2608 |
9001 |
Jeff Russell |
sales |
35 |
2617 |
9001 |
Jeff Russell |
sales |
35 |
2620 |
9001 |
Jeff Russell |
sales |
139 |
2621 |
9002 |
Jane Boorman |
sales |
95 |
2626 |
9002 |
Jane Boorman |
sales |
218 |
|
|
|
|
|
Рисунок 3.6 иллюстрирует, как работает объединение типа «один-ко-многим».
Как видно на рисунке, объединение «один-ко-многим» включает по одной строке для каждой строки в датасете на стороне ко-многим. Поскольку мы используем тип
pandas 81
объединения inner, никакие другие строки не будут включены. А при объединении типа left или outer в результат будут также включены те строки из датасета на стороне один-, которые не имеют совпадений в датасете на стороне ко-многим.
|
|
emps_orders |
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2608 |
|
9001 |
Jeff Russell |
|
sales |
35 |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2617 |
|
9001 |
Jeff Russell |
|
sales |
35 |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2620 |
|
9001 |
Jeff Russell |
|
sales |
139 |
|
|||||||
emps |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
9001 |
Jeff Russell |
|
sales |
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
orders |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2608 |
|
9001 |
|
35 |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2617 |
|
9001 |
|
35 |
|
|
|
|
|
|
|
|
|
|
|
2620 |
|
9001 |
|
139 |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 3.6. Объединение двух датафреймов, связанных отношением «один-ко-многим»
Помимо отношений «один-ко-многим» и «один-к-одному», существует связь «многие-ко-многим» (many-to-many). В качестве примера такой взаимосвязи рассмотрим два датасета: в одном будут перечислены книги, а в другом — авторы. Каждая запись в датасете с авторами может быть связана с одной или несколькими записями в датасете с книгами, и наоборот, каждая запись в датасете с книгами может быть связана с одной или несколькими записями из набора данных с авторами. Мы обсудим этот тип отношений в главе 7, где более подробно рассматривается конкатенация, слияние и объединение датасетов.
Агрегирование данных методом groupby()
Метод pandas groupby()позволяет агрегировать данные по нескольким строкам датафрейма. Например, он может найти сумму значений столбца или получить среднее подмножество значений в столбце.
Предположим, что необходимо рассчитать среднюю сумму заказов по каждому сотруднику в датафрейме orders, созданном ранее. Для этого можно воспользоваться методом groupby():
print(orders.groupby(['Empno'])['Total'].mean())