- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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 67
ПРИМЕЧАНИЕ
Полный список статистических функций, поддерживаемых NumPy, приведен в документации NumPy1.
УПРАЖНЕНИЕ № 2: ИСПОЛЬЗОВАНИЕ СТАТИСТИЧЕСКИХ ФУНКЦИЙ NUMPY
Каждый набор результатов, возвращаемый np.amax() в примерах выше, сам является массивом NumPy. Это означает, что можно передать полученный набор в функцию amax()снова, если требуется найти максимальное значение во всем наборе. Аналогично можно передать этот набор любой другой статистической функции NumPy, например np.median() или np.average(). Попробуйте это сделать. Например, попробуйте найти среднее значение максимальных ежемесячных выплат среди всех сотрудников.
pandas
Библиотека pandas является фактическим стандартом для приложений Python, ориентированных на работу с данными (название библиотеки сложилось из фразы «Python Data Analysis Library»). Библиотека включает две структуры данных: Series (одномерную) и DataFrame (двумерную). Хотя DataFrame является основной структурой данных pandas, фактически она представляет собой коллекцию объектов Series. Поэтому важно понимать обе структуры.
Установка pandas
В стандартный дистрибутив Python не входит модуль pandas.
Его можно установить с помощью команды:
$ pip install pandas
Команда pip также разрешает зависимости библиотеки, неявно устанавливая пакеты NumPy, pytz и python-dateutil.
Как и в случае с NumPy, чтобы использовать модуль pandas, его необходимо импортировать в скрипт.
1 https://NumPy.org/doc/stable/reference/routines.statistics.html
68 Глава 3. Библиотеки Python для data science
pandas Series
pandas Series — это одномерный массив. По умолчанию элементы серии маркируются целыми числами в соответствии с их позицией, как в списке Python. Однако можно задать и свои метки. Они необязательно должны быть уникальными, но должны быть хешируемого типа, например целыми числами (integer), числами с плавающей точкой (float), строками (string) или кортежами (tuple).
Элементы внутри серии могут быть любого типа (целыми числами, строками, числами с плавающей точкой, объектами Python и т. д.), но лучше всего Series работает, если все ее элементы имеют одинаковый тип. В конечном счете Series может стать столбцом в более крупном DataFrame, и вряд ли вы захотите хранить разные типы данных в одном столбце.
Создание Series
Есть несколько способов создать объект Series. В большинстве случаев мы передаем ему одномерный набор данных. Вот так можно создать Series из списка Python:
import pandas as pd
data = ['Jeff Russell','Jane Boorman','Tom Heints']
emps_names = pd.Series(data) print(emps_names)
Прежде всего импортируем библиотеку pandas и даем ей короткое имя pd . Затем формируем список элементов, которые будут использоваться в качестве данных для Series . Наконец, создаем объект-серию, передавая список в метод конструктора Series .
Мы получаем один список с проиндексированными по умолчанию элементами, начиная с 0:
0 Jeff Russell
1 Jane Boorman
2 Tom Heints dtype: object
Атрибут dtype указывает тип данных, содержащихся в данной серии. По умолчанию для хранения строк pandas использует тип object.
Вы можете создать структуру Series, задав собственные индексы, следующим образом:
pandas 69
data = ['Jeff Russell','Jane Boorman','Tom Heints'] emps_names = pd.Series(data,index=[9001,9002,9003]) print(emps_names)
И теперь данные в серии emps_names выглядят так:
9001 Jeff Russell
9002 Jane Boorman
9003 Tom Heints dtype: object
Доступ к данным в Series
Чтобы получить доступ к элементу в серии, укажите ее имя, а затем индекс элемента в квадратных скобках, как показано ниже:
print(emps_names[9001])
Выводится элемент, соответствующий индексу 9001:
Jeff Russell
В качестве альтернативы можно использовать свойство loc объекта Series:
print(emps_names.loc[9001])
Несмотря на то что в данном случае мы используем собственные индексы, получить доступ к элементам по позиции тоже можно (то есть использовать целочисленный индекс расположения элемента). Это делается с помощью свойства iloc. Так, например, можно вывести на экран первый элемент:
print(emps_names.iloc[0])
Можно получить доступ к нескольким элементам по их индексам с помощью среза, как описывалось в главе 2:
print(emps_names.loc[9001:9002])
70 Глава 3. Библиотеки Python для data science
В результате получается следующий вывод:
9001 Jeff Russell
9002 Jane Boorman
Обратите внимание, что срез со свойством loc включает и правую, конечную, точку (в данном случае индекс 9002), тогда как обычный срез в Python этого не делает.
Срезы также можно использовать, чтобы определить диапазон элементов по их позиции, а не по индексу. Например, тот же результат можно получить с помощью следующего кода:
print(emps_names.iloc[0:2])
или так:
print(emps_names[0:2])
Как видите, в отличие от loc, квадратные скобки ([]) или свойство iloc работают так же, как и обычный срез в Python: начальная позиция включается, а конечная — нет. Таким образом, [0:2] не берет элемент с индексом 2 и возвращает только первые два элемента.
Объединение Series в DataFrame
Несколько серий могут быть объединены в датафрейм (DataFrame). Попробуем сделать это, создав еще одну серию и объединив ее с серией emps_names:
data = ['jeff.russell','jane.boorman','tom.heints']
emps_emails = pd.Series(data,index=[9001,9002,9003], name = 'emails')emps_names.name = 'names'
df = pd.concat([emps_names,emps_emails], axis=1) print(df)
Чтобы создать новую серию, мы вызываем конструктор Series() , передавая следующие аргументы: список, который должен быть преобразован в серию, индексы и имя серии.
Перед объединением серий в структуру DataFrame необходимо присвоить сериям имена, поскольку эти названия станут именами соответствующих столбцов