- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
178 Глава 8. Визуализация
Доступ к объектам Figure и Axes осуществляется через функцию matplotlib. pyplot.subplots(). При вызове без аргументов эта функция возвращает экземпляр Figure и один экземпляр Axes, связанный с Figure. Добавляя аргументы к функции subplots(), можно создать экземпляр Figure и несколько Axes, то есть, другими словами, создать рисунок с несколькими графиками. Например, вызов subplots(2,2)создает рисунок с четырьмя графиками, расположенными в два ряда по два. Каждый график представлен одним объектом Axes.
ПРИМЕЧАНИЕ
Более подробную информацию об использовании subplots() см. в докумен-
тации Matplotlib1.
Создание гистограммы с помощью subplots()
В следующем скрипте мы используем subplots() для создания объекта Figure и одного объекта Axes. Затем обработаем объекты для создания гистограммы с рис. 8.5, отображающей распределение окладов сотрудников. Кроме объектов Figure и Axes, мы будем работать с модулем Matplotlib matplotlib.ticker для форматирования отметок на оси x, а также с NumPy для определения размера шага гистограммы ($50).
# импортирование модулей import numpy as np
from matplotlib import pyplot as plt import matplotlib.ticker as ticker
# данные для графика
salaries = [1215, 1221, 1263, 1267, 1271, 1274, 1275, 1318, 1320, 1324, 1324, 1326, 1337, 1346, 1354, 1355, 1364, 1367, 1372, 1375, 1376, 1378, 1378, 1410, 1415, 1415, 1418, 1420, 1422, 1426, 1430, 1434, 1437, 1451, 1454, 1467, 1470, 1473, 1477, 1479, 1480, 1514, 1516, 1522, 1529, 1544, 1547, 1554, 1562, 1584, 1595, 1616, 1626, 1717]
# подготовка гистограммы
fig, ax = plt.subplots()
fig.set_size_inches(5.6, 4.2)
ax.hist(salaries, bins=np.arange(1100, 1900, 50), edgecolor='black', linewidth=1.2)
formatter = ticker.FormatStrFormatter('$%1.0f')ax.xaxis.set_major_formatter(formatter)
plt.title('Ежемесячные оклады сотрудников отдела продаж') plt.xlabel('Оклад (интервал — $50)')
1 https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.subplots.html
Создание гистограммы с помощью subplots() 179
plt.ylabel('Частота')
# вывод гистограммы на экран plt.show()
Начинаем с объявления списка salaries с данными об окладе, которые хотим визуализировать . Затем вызываем функцию subplots() без параметров , тем самым задаем создание рисунка с одним графиком. Функция возвращает кортеж, содержащий два объекта: fig и ax, представляющие собой рисунок и график соответственно.
Теперь, когда у нас есть экземпляры Figure и Axes, можем приступить к их настройке. В первую очередь вызываем метод set_size_inches() объекта Figure для изменения размера всего рисунка . Затем — метод hist() объекта Axes для построения гистограммы . Передаем методу список salaries в качестве входных данных для гистограммы, а также массив NumPy с точками оси x для определения интервалов. Функция NumPy arange()создает массив равномерно расположенных значений в заданном интервале (в данном случае с шагом 50 от 1100 до 1900). Параметр edgecolor метода hist() нужен для отображения интервальных границ (bins) в виде линий черного цвета, а параметр linewidth позволяет определить ширину этих границ.
Далее используем функцию FormatStrFormatter()из модуля matplotlib.ticker для создания средства форматирования, которое будет добавлять знак доллара к каждой метке оси x . Применяем средство форматирования к меткам оси x с помощью метода set_major_formatter()объекта ax.xaxis . Наконец, задаем общие настройки графика, такие как его заголовок и метки главной оси, через интерфейс matplotlib.pyplot и выводим график на экран.
Частотное распределение на круговой диаграмме
Хотя гистограммы хорошо подходят для визуализации частотного распределения, для отображения такого рода данных в процентах можно использовать круговую диаграмму. В качестве примера в этом разделе приводится преобразование гистограммы распределения окладов, которую мы только что создали, в круговую диаграмму, отображающую данные в виде частей целого.
Прежде чем создать такую круговую диаграмму, из гистограммы необходимо извлечь основную информацию и упорядочить ее. В частности, нужно узнать количество значений окладов в каждом диапазоне $50. Для этого можно использовать функцию NumPy histogram(), которая рассчитывает гистограмму без ее отображения:
180 Глава 8. Визуализация
import numpy as np
count, labels = np.histogram(salaries, bins=np.arange(1100, 1900, 50))
Здесь мы вызываем функцию histogram(), передавая ей тот же список salaries, который создали ранее, и снова используем функцию NumPy arange() для создания равномерно распределенных областей. Вызов histogram() возвращает два массива NumPy: count и labels.
Массив count представляет собой количество сотрудников с окладом в каждом интервале и выглядит следующим образом:
[0, |
0, |
2, |
5, |
7, |
9, |
10, |
8, |
6, |
4, |
2, |
0, |
1, |
0, |
0] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
А массив labels содержит границы интервалов областей:
[1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, 1550, 1600, 1650, 1700, 1750, 1800, 1850]
Далее необходимо объединить соседние элементы массива labels, превратив их в метки для частей круговой диаграммы. Так, соседние элементы 1100 и 1150 должны стать единой меткой, приведенной к виду '$1100-1150'. Используем следующее списковое включение:
labels = ['$'+str(labels[i])+'-'+str(labels[i+1]) for i, _ in enumerate(labels[1:])]
Полученный в результате список labels будет выглядеть так:
['$1100-1150', '$1150-1200', '$1200-1250', '$1250-1300', '$1300-1350', '$1350-1400', '$1400-1450', '$1450-1500', '$1500-1550', '$1550-1600', '$1600-1650', '$1650-1700', '$1700-1750', '$1750-1800', '$1800-1850']
Каждый элемент в labels соответствует элементу в массиве count с тем же индексом. Однако, взглянув на массив count, можно заметить проблему: в некоторых интервалах количество окладов равно 0. Вряд ли стоит включать эти пустые интервалы в круговую диаграмму. Чтобы исключить их, необходимо сформировать список индексов, соответствующих непустым интервалам в массиве count:
non_zero_pos = [i for i, x in enumerate(count) if x != 0]
Создание гистограммы с помощью subplots() 181
Теперь можно использовать non_zero_pos для фильтрации count и labels, исключая те элементы, которые представляют собой пустые интервалы:
labels = [e for i, e in enumerate(labels) if i in non_zero_pos] count = [e for i, e in enumerate(count) if i in non_zero_pos]
Остается только создать и отобразить круговую диаграмму с помощью интерфейса matplotlib.pyplot и plt.pie():
from matplotlib import pyplot as plt plt.pie(count, labels=labels, autopct='%1.1f%%')
plt.title('Ежемесячные оклады сотрудников отдела продаж') plt.show()
На рис. 8.7 показан результат выполнения кода.
Е а а а
|
|
|
$1300–1350 |
|
|
$1350–1400 |
|
|
|
|
|
16.7% |
13.0% |
|
|
|
|
$1250–1300 |
|
|
|
|
|
|
|
|
|
9.3% |
|
|
|
|
3.7% |
$1200–1250 |
$1400–1450 |
18.5% |
|
|
|
|
1.9% |
$1700–1750 |
||
|
|
|
||
|
|
|
3.7% |
$1600–1650 |
|
|
|
|
|
|
|
|
7.4% |
|
|
14.8% |
11.1% |
$1550–1600 |
|
|
||
|
|
|
|
$1450–1500 |
|
|
$1500–1550 |
|
|
|
Рис. 8.7. Круговая диаграмма с распределением частотности
Круговая диаграмма визуализирует те же данные, что и гистограмма на рис. 8.5, однако каждый интервал на ней выражается процентом от целого, а не числом сотрудников с окладом, попадающим в эту область.