
- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы

2
Структуры данных Python
Структуры данных организуют и хранят информацию, упрощая к ней доступ. В Python встроены четыре структуры данных: списки, кортежи, словари и множества.
С этими структурами легко работать, при этом их можно использовать для выполнения сложных операций с данными,
что делает Python одним из самых популярных языков для анализа данных.
В этой главе мы рассмотрим четыре встроенных типа данных Python и уделим особое внимание возможностям, которые позволяют с минимумом кода создавать функциональные приложения, ориентированные на данные. Вы также узнаете, как объединять базовые структуры в более сложные, например в список словарей, чтобы точнее представить объекты реального мира. Кроме того, вы попробуете применить полученные знания для обработки естественного языка и фотографий.
Списки
Список Python — это упорядоченная коллекция объектов. Элементы в списке разделяются запятыми, а сам список заключается в квадратные скобки:
[2,4,7]
['Bob', 'John', 'Will']

38 Глава 2. Структуры данных Python
Список изменяем, то есть в него можно добавлять элементы, удалять их и изменять. В отличие от множеств, которые мы обсудим позже, списки могут содержать повторяющиеся элементы.
Списки содержат последовательность элементов, которые можно логически сгруппировать по общему признаку. Эта структура данных, как правило, содержит элементы одной категории (то есть однородные данные, такие как имена людей, названия статей или номера участников). Очень важно понимать эту особенность, выбирая подходящий инструмент для выполнения поставленной задачи. Если вам нужна структура, содержащая объекты с разными свойствами, используйте кортеж или словарь.
ПРИМЕЧАНИЕ
Хотя списки обычно считаются однородными, Python допускает наличие в них элементов разных типов. Этот список, например, включает как строки, так и целые числа:
['Ford', 'Mustang', 1964]
Создание списка
Чтобы создать простой список, поместите последовательность элементов внутрь квадратных скобок и присвойте этой последовательности имя:
regions = ['Asia', 'America', 'Europe']
На практике, однако, списки обычно заполняются с нуля динамически, часто с помощью цикла, который вычисляет один элемент за итерацию. В таких случаях первым шагом будет создание пустого списка:
regions = []
Теперь можно добавлять, удалять и сортировать элементы в созданном списке. Для этих (и некоторых других) целей в Python используются методы списков.
Использование общих методов списков
Методы списков — это функции, которые реализуют определенное поведение внутри списка. В этом разделе мы рассмотрим некоторые общие методы, включая

Списки 39
append(), index(), insert() и count(). Начнем практику с создания пустого списка. Попробуем создать список домашних обязанностей: шаг за шагом мы будем наполнять список делами и упорядочивать его:
my_list = []
append(), пожалуй, самый популярный метод списков. Он добавляет элемент в конец последовательности. Можно использовать append() для добавления обязанностей по дому в список:
my_list.append('Pay bills') my_list.append('Tidy up') my_list.append('Walk the dog') my_list.append('Cook dinner')
Теперь список содержит четыре элемента в том порядке, в каком они были добавлены:
['Pay bills', 'Tidy up', 'Walk the dog', 'Cook dinner']
Каждый элемент списка имеет числовой ключ, известный как индекс. Он позволяет сохранять элементы списка в определенном порядке. В Python используется нулевая индексация, то есть начальному элементу последовательности присваивается индекс 0.
Чтобы получить доступ к конкретному элементу списка, укажите название списка, а затем индекс этого элемента в квадратных скобках. Например, с помощью кода ниже можно вывести на экран первый пункт списка дел:
print(my_list[0])
Функция print() выведет:
Pay bills
Индексы можно использовать не только для доступа к нужному элементу, но и для вставки нового элемента в заданное место. Скажем, необходимо добавить в список новую обязанность между выгулом собаки (walk the dog) и приготовлением ужина (cook dinner). Для этого сначала используем метод index(), чтобы

40 Глава 2. Структуры данных Python
определить индекс элемента, перед которым нужно вставить новый. Сохраним его в переменной i:
i = my_list.index('Cook dinner')
Это значение будет индексом нового элемента. Добавим этот элемент с помощью метода insert():
my_list.insert(i, 'Go to the pharmacy')
Новая обязанность добавляется в список по указанному индексу, при этом индексы всех последующих элементов увеличиваются на один. Обновленный список будет выглядеть так:
['Pay bills', 'Tidy up', 'Walk the dog', 'Go to the pharmacy', 'Cook dinner']
Поскольку списки допускают повтор элементов, может понадобиться проверка того, сколько раз встречается тот или иной элемент. Это можно сделать с помощью метода count(), как в следующем примере:
print(my_list.count('Tidy up'))
Функция print() выявляет в списке только один экземпляр 'Tidy up'(делать уборку). Хотя, возможно, стоило бы почаще включать этот пункт в список дел!
ПРИМЕЧАНИЕ
Список всех методов списка можно найти в документации Python1.
Использование срезов
Получить доступ к диапазону элементов последовательности, например списка, можно с помощью нотации среза. Чтобы получить фрагмент списка, укажите индекс первого элемента фрагмента и индекс последнего элемента фрагмента плюс1. Разделите индексы двоеточием и заключите в квадратные скобки. Например, вывести на экран первые три пункта из списка дел можно следующим образом:
print(my_list[0:3])
1 https://docs.python.org/3/tutorial/datastructures.html

Списки 41
Результатом будет список элементов с индексами от 0 до 2:
['Pay bills', 'Tidy up', 'Walk the dog']
Начальный и конечный индексы в срезе указывать необязательно. Если опустить начальный индекс, срез начнется с нулевого элемента списка. Это означает, что срез из предыдущего примера можно смело изменить так:
print(my_list[:3])
Если опустить конечный индекс, то срез будет продолжаться до конца списка. Вот так можно вывести элементы с индексом 3 и выше:
print(my_list[3:])
В результате получим два последних пункта списка дел:
['Go to the pharmacy', 'Cook dinner']
Наконец, вы можете опустить оба индекса, и тогда получите копию всего списка:
print(my_list[:])
Результат:
['Pay bills', 'Tidy up', 'Walk the dog', 'Go to the pharmacy', 'Cook dinner']
Нотация срезов не ограничивается извлечением подпоследовательности элементов списка. Ее также можно использовать вместо методов append() и insert() для заполнения списка. Так, например, можно добавить два пункта в конец списка:
my_list[len(my_list):] = ['Mow the lawn', 'Water plants']
Функция len() возвращает количество элементов в списке. Это же значение является первым индексом, выходящим за пределы списка. Можно смело добавлять новые элементы, начиная с этого индекса. Теперь список выглядит так:
['Pay bills', 'Tidy up', 'Walk the dog', 'Go to the pharmacy', 'Cook dinner', 'Mow the lawn', 'Water plants']