- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
96 Глава 4. Доступ к данным из файлов и API
Вот что вы увидите в файле cars.csv после выполнения скрипта:
Year,Make,Model,Price
1997,Ford,E350,3200.00
1999,Chevy,Venture,4500.00
1996,Jeep,Grand Cherokee,4900.00
Как видим, файл выглядит как оригинал, но значение поля Price во второй строке изменилось.
Доступ к удаленным файлам и API
Некоторые сторонние библиотеки Python, включая urllib3 и Requests, позволяют получить данные из удаленного файла, доступного по URL. Библиотеки также можно использовать для отправки запросов к HTTP API (API, использующим HTTP в качестве протокола передачи данных). Многие из них возвращают запрашиваемые данные в формате JSON. И urllib3, и Requests формируют пользовательские HTTP-запросы на основе введенной информации.
HTTP (HyperText Transfer Protocol — протокол передачи гипертекста), кли- ент-серверный протокол, составляющий основу обмена данными в интернете, структурирован как серия запросов и ответов. HTTP-сообщение, посылаемое клиентом, — это запрос (request), а сообщение, возвращаемое сервером, — ответ (response). Например, всякий раз, когда вы щелкаете по ссылке в браузере, выступающем в роли клиента, он отправляет HTTP-запрос для получения нужной веб-страницы с соответствующего веб-сервера. То же самое можно сделать из Python-скрипта. Скрипт, выступающий в роли клиента, получает запрашиваемые данные в виде документа JSON или XML.
Как работают HTTP-запросы
Существует несколько типов HTTP-запросов. Наиболее популярные из них — GET, POST, PUT и DELETE. Они также известны как методы HTTP-запросов или просто HTTP-команды (HTTP command / HTTP verb). Команда HTTP в любом HTTP-запросе определяет действие, которое необходимо выполнить с указанным ресурсом. Например, GET-запрос получает данные из ресурса, а POST-запрос отправляет данные в место назначения.
HTTP-запрос включает цель запроса (target) — обычно это URL-адрес, а также заголовки (headers), которые представляют собой поля, передающие вместе с запросом дополнительную информацию. В некоторых запросах также есть тело
Доступ к удаленным файлам и API 97
(body), которое содержит фактические данные запроса, например отправку формы. POST-запросы обычно имеют тело, а GET-запросы — нет.
В качестве примера рассмотрим следующий HTTP-запрос:
GET /api/books?bibkeys=ISBN%3A1718500521&format=json HTTP/1.1Host: openlibrary.org
User-Agent: python-requests/2.24.0Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
В этом запросе используется HTTP-команда GET для получения данных с заданного сервера (указан как Host ) по заданному URI . Остальные строки — это заголовки с дополнительной информацией. Заголовок запроса User-Agent определяет приложение, отправляющее запрос, и его версию . Заголовок Accept сообщает, какие типы содержимого клиент способен обработать . Заголовок Connection со значением keep-alive дает указание серверу установить постоянное соединение с клиентом, что позволяет выполнять последующие запросы.
Чтобы отправлять HTTP-запросы с помощью Python и получать ответы, необязательно полностью понимать их внутреннюю структуру. Как вы узнаете из следующих разделов, такие библиотеки, как Requests и urllib3, позволяют легко и эффективно управлять HTTP-запросами, просто вызывая соответствующий метод и передавая в него необходимые параметры.
С помощью библиотеки Requests предыдущий HTTP-запрос можно сгенерировать простым Python-скриптом:
import requests
PARAMS = {'bibkeys':'ISBN:1718500521', 'format':'json'} requests.get('http://openlibrary.org/api/books', params = PARAMS)
Скоро мы подробно обсудим библиотеку Requests. А пока обратите внимание, что она избавляет от необходимости задавать заголовки запроса вручную. Requests скрыто устанавливает значения по умолчанию, автоматически генерируя полностью отформатированный HTTP-запрос от вашего имени всего несколькими строками кода.
Библиотека urllib3
urllib3 — это библиотека для работы с URL. Она позволяет получать доступ к URL-ресурсам, таким как HTTP API, веб-сайты и файлы, и управлять ими.
98 Глава 4. Доступ к данным из файлов и API
Эта библиотека предназначена для эффективной обработки HTTP-запросов с помощью потокобезопасного пула соединений, что минимизирует количество необходимых серверных ресурсов.
По сравнению с библиотекой Requests, которую мы рассмотрим далее, urllib3 требует больше ручных операций, однако она предоставляет больше прямого контроля над создаваемыми запросами, что может быть полезно при настройке поведения пула или расшифровке HTTP-ответов.
Установка urllib3
Поскольку urllib3 входит в перечень зависимостей многих популярных библиотек для Python (например, Requests и pip), скорее всего, она уже установлена в вашей среде Python. Чтобы проверить это, импортируйте ее в текущей сессии. Если вы получаете ошибку ModuleNotFoundError, установите библиотеку с помощью следующей команды:
$ pip install urllib3
Доступ к файлам через urllib3
Чтобы потренироваться с помощью urllib3 загружать данные из файла, хранящегося по какому-либо URL-адресу, можно обратиться к файлу excerpt.txt, который мы создали ранее. Чтобы сделать этот файл доступным по URL, поместите его в папку document HTTP-сервера, запущенного на локальном хосте. Или используйте URL-адрес файла из сопутствующего репозитория GitHub1.
Запустите следующий код, при необходимости изменив URL-адрес:
import urllib3
http = urllib3.PoolManager()
r = http.request('GET', 'http://localhost/excerpt.txt')
for i, line in enumerate( r.data.decode('utf-8').split('\n')): if line.strip():
print("Line %i: " %(i), line.strip())
Сначала мы создаем экземпляр PoolManager , с помощью которого urllib3 выполняет запросы. После этого выполняется HTTP-запрос на указанный URLадрес с помощью метода request()PoolManager . Метод request()возвращает объект HTTPResponse. Мы получаем доступ к запрошенным данным через атрибут
1 https://github.com/pythondatabook/sources/blob/main/ch4/excerpt.txt
Доступ к удаленным файлам и API 99
data этого объекта . Затем выводим только непустые строки вместе с их порядковым номером в начале каждой строки .
Запросы API через urllib3
urllib3 также можно использовать для выполнения запросов к HTTP API. В примере ниже мы делаем запрос к News API1, который выполняет поиск наиболее релевантных запросу статей из множества новостных источников. Как и многие другие современные API, News API требует, чтобы API-ключ передавался при каждом запросе. API-ключ разработчика можно получить бесплатно на сайте2 после заполнения простой регистрационной формы. Затем используйте код ниже, чтобы найти статьи о языке программирования Python:
import json import urllib3
http = urllib3.PoolManager()
r = http.request('GET', 'https://newsapi.org/v2/everything? q=Python programming language& apiKey=your_api_key_here& pageSize=5')
articles = json.loads(r.data.decode('utf-8')) for article in articles['articles']:
print(article['title'])
print(article['publishedAt'])
print(article['url'])
print()
Вы передаете поисковую фразу в качестве параметра q в URL-адресе запроса . Единственный параметр, который необходимо указать в URL запроса, — apiKey , передающий ключ API. Существует также множество необязательных параметров. Например, можно указать источники новостей или блоги, из которых вы хотите получать статьи. В этом конкретном примере мы используем pageSize, чтобы установить количество получаемых статей равным пяти . Полный список поддерживаемых параметров можно найти в документации News API3.
Атрибут data объекта HTTPResponse, возвращаемого функцией request(), — документ JSON в виде объекта bytes. Мы преобразовываем его в строку, которую затем передаем методу json.loads() для преобразования в словарь . Чтобы увидеть, как структурированы данные в этом словаре, вы можете вывести его, но
1 https://newsapi.org
2 https://newsapi.org/register
3 https://newsapi.org/docs