- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
Перемещение данных в DataFrame и из него 101
HTTP-команды реализуются как методы библиотеки (например, requests.get() используется для выполнения HTTP-запроса GET). Ниже показано, как получить удаленный доступ к excerpt.txt с помощью Requests. Замените URL-адрес GitHub-ссылкой на файл, если необходимо:
import requests
r = requests.get('http://localhost/excerpt.txt') for i, line in enumerate( r.text.split('\n')):
if line.strip():
print("Line %i: " %(i), line.strip())
Мы выполняем GET-запрос с помощью метода requests.get(), передавая URLадрес файла в качестве параметра . Метод возвращает объект Response, в атрибуте text которого содержатся полученные данные . Requests автоматически декодирует полученный контент, делая обоснованные предположения о кодировке, так что вам не придется заниматься этим самостоятельно. Как и в примере с urllib3, мы выводим только непустые строки, добавляя номер каждой строки в начале .
УПРАЖНЕНИЕ № 6: ДОСТУП К API С ПОМОЩЬЮ REQUESTS
Как и urllib3, библиотека Requests может взаимодействовать с HTTP API. Попробуйте переписать код, который отправляет GET-запрос к News API, так, чтобы в нем использовалась библиотека Requests вместо urllib3. Обратите внимание, что при использовании Requests не нужно вручную добавлять параметры запроса к URL, передаваемому в запросе. Вместо этого передавайте параметры в виде словаря строк.
Перемещение данных в DataFrame и из него
В pandas входит ряд методов чтения, каждый из которых предназначен для загрузки данных в определенном формате и/или из определенного типа источника. Эти методы позволяют преобразовать табличные данные в DataFrame одним вызовом, благодаря чему импортированный датасет сразу готов к анализу. В pandas также есть методы для преобразования данных DataFrame в другие форматы, например JSON. В этом разделе рассматриваются методы, позволяющие перемещать данные в DataFrame или из него. Мы также рассмотрим библиотеку pandas-datareader, которая полезна для загрузки данных из различных онлайнисточников и преобразования в pandas DataFrame.
102 Глава 4. Доступ к данным из файлов и API
Импортирование вложенных структур JSON
Поскольку JSON стал фактическим стандартом для обмена данными между приложениями, важно иметь возможность быстро импортировать JSON-документ и преобразовывать его в структуру данных Python. В предыдущей главе мы рассмотрели пример преобразования простой, невложенной структуры JSON в объект DataFrame с помощью функции pandas read_json(). В этом разделе вы узнаете, как выполнить подобные преобразования сложного, вложенного JSON-документа, такого как этот:
data = [{"Emp":"Jeff Russell", "POs":[{"Pono":2608,"Total":35},
{"Pono":2617,"Total":35},
{"Pono":2620,"Total":139}
]},
{"Emp":"Jane Boorman", "POs":[{"Pono":2621,"Total":95},
{"Pono":2626,"Total":218}
]
}]
Как видите, каждая запись в документе JSON начинается с простой структурной пары «ключ — значение» с ключом Emp, за которой следует вложенная структура с ключом POs. Иерархическую структуру JSON можно преобразовать в pandas DataFrame с помощью метода чтения библиотеки pandas json_normalize(), который принимает вложенную структуру и делает ее плоской, или нормализует, превращая в простую таблицу. Вот как это делается:
import json
import pandas as pd
df = pd.json_normalize( data, "POs", "Emp").set_index([ "Emp","Pono"]) print(df)
Помимо экземпляра JSON , который будет обработан json_normalize(), мы указываем POsкак вложенный массив , который необходимо сделать плоским, и Emp в качестве поля, которое будет использоваться как часть сложного индекса в итоговой таблице . В той же строке кода мы задаем два столбца в качестве индекса: Emp и Pono . Результатом будет следующий датафрейм pandas:
|
|
Total |
Emp |
Pono |
|
Jeff Russell |
2608 |
35 |
|
2617 |
35 |
Перемещение данных в DataFrame и из него 103
|
2620 |
139 |
Jane Boorman |
2621 |
95 |
|
2626 |
218 |
|
|
|
ПРИМЕЧАНИЕ
Использование двухколоночного индекса упрощает агрегирование данных внутри групп. Более подробно мы рассмотрим датафреймы с многоколоночными индексами в главе 6.
Конвертирование DataFrame в JSON
На практике часто приходится выполнять обратную операцию — преобразование pandas DataFrame в JSON. Следующий код преобразует датафрейм из примера обратно в экземпляр JSON, из которого он был первоначально сгенерирован:
df = df.reset_index()
json_doc = ( df.groupby(['Emp'], as_index=True)
.apply(lambda x: x[['Pono','Total']].to_dict('records')).reset_index()
.rename(columns={0:'POs'}).to_json(orient='records'))
Начинаем с удаления двухколоночного индекса датафрейма, чтобы Emp и Pono стали обычными столбцами . Затем используем составной однострочник для преобразования DataFrame в документ JSON. Сначала применим к датафрейму операцию groupby, группируя строки по столбцу Emp . Используем groupby() в сочетании с apply() для применения лямбда-функции к каждой записи в каждой группе . Внутри лямбда-функции укажем список полей для отображения в строке вложенного массива для каждой записи Emp. Применим метод DataFrame.to_dict()с параметром records, чтобы отформатировать поля в массиве следующим образом: [{колонка:значение}, ... , {колонка:значение}], где каждый словарь — заказ, связанный с конкретным сотрудником.
На данном этапе у нас есть объект Series с индексом Emp и столбцом, содержащим массив заказов, связанных с сотрудником. Чтобы дать колонке название (в данном случае POs), необходимо преобразовать объект Series в DataFrame. Простой способ сделать это — метод reset_index() . Помимо преобразования Series в DataFrame, reset_index() изменяет Emp, так что это больше не индекс, а обычный столбец, что будет важно при преобразовании датафрейма в формат JSON. Наконец, мы явно задаем имя столбца, содержащего вложенный массив (POs), используя метод rename() , и конвертируем измененный DataFrame в JSON .
104 Глава 4. Доступ к данным из файлов и API
УПРАЖНЕНИЕ № 7:
ОБРАБОТКА СЛОЖНЫХ СТРУКТУР JSON
JSON, использованный в предыдущем разделе, имел одно поле с простой структурой (Emp) на верхнем уровне каждой записи. В реальном JSONдокументе таких полей может быть больше. В записях в примере ниже есть второе простое поле на верхнем уровне — Emp_email:
data = [{"Emp":"Jeff Russell", "Emp_email":"jeff.russell", "POs":[{"Pono":2608,"Total":35},
{"Pono":2617,"Total":35},
{"Pono":2620,"Total":139}
]},
{"Emp":"Jane Boorman", "Emp_email":"jane.boorman", "POs":[{"Pono":2621,"Total":95},
{"Pono":2626,"Total":218}
]
}]
Чтобы преобразовать эти данные в DataFrame, необходимо передать список всех полей верхнего уровня с простой структурой в третий параметр json_normalize(), как показано ниже:
df = pd.json_normalize(data, "POs", ["Emp","Emp_email"]).set_index(["Emp","Emp_email","Pono"])
Содержимое датафрейма будет таким:
|
|
|
Total |
Emp |
Emp_email |
Pono |
|
Jeff Russell |
jeff.russell |
2608 |
35 |
|
|
2617 |
35 |
|
|
2620 |
139 |
Jane Boorman |
jane.boorman |
2621 |
95 |
|
|
2626 |
218 |
|
|
|
|
Попробуйте преобразовать этот датафрейм обратно в исходный документ JSON, изменив операцию groupby, рассмотренную в предыдущем разделе.
Перемещение данных в DataFrame и из него 105
Содержимое json_doc выглядит следующим образом:
[{"Emp": "Jeff Russell",
"POs": [{"Pono": 2608, "Total": 35}, {"Pono": 2617, "Total": 35}, {"Pono": 2620, "Total": 139}
]},
{"Emp": "Jane Boorman",
"POs": [{"Pono": 2621, "Total": 95}, {"Pono": 2626, "Total": 218}
]
}]
Для удобочитаемости можно вывести документ на экран с помощью следующей команды:
print(json.dumps(json.loads(json_doc), indent=2))
Преобразование онлайн-данных в DataFrame
с помощью pandas-datareader
Некоторые сторонние библиотеки имеют совместимые с pandas методы чтения для получения доступа к данным из различных онлайн-источников, таких как Quandl1 и Stooq2. Самая популярная подобная библиотека — pandas-datareader. На момент написания книги эта библиотека включала 70 методов для загрузки данных из определенного источника и их преобразования в pandas DataFrame. Многие методы библиотеки являются обертками для финансовых API, позволяя легко получать финансовые данные в формате pandas.
Установка pandas-datareader
Запустите следующую команду для установки pandas-datareader:
$ pip install pandas-datareader
Описание методов чтения библиотеки можно найти в документации pandasdatareader3. Кроме того, можно вывести на экран список доступных методов с помощью функции dir():
1 https://data.nasdaq.com
2 https://stooq.com
3 https://pandas-datareader.readthedocs.io/en/latest/remote_data.html