- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
58 Глава 2. |
Структуры данных Python |
|
|
|
|
d = { "PONumber" |
: 2608, |
|
"ShippingInstructions" : {"name" : "John Silver", |
||
|
"Address": { "street" |
: "426 Light Street", |
|
"city" |
: "South San Francisco", |
|
"state" |
: "CA", |
|
"zipCode" |
: 99237, |
|
"country" |
: "United States of America" }, |
"Phone" : [ { "type" : "Office", "number" : "809-123-9309" }, { "type" : "Mobile", "number" : "417-123-4567" }
]
}
}
Как видим, у этого словаря сложная структура. Значение ключа ShippingIn structions само является словарем, в нем значение ключа Address тоже словарь, а значение ключа Phone является списком словарей.
Можно сохранить словарь непосредственно в файл JSON с помощью модуля json, используя метод json.dump():
import json
with open("po.json", "w") as outfile: json.dump(d, outfile)
Аналогично, можно использовать метод json.load() для преобразования содержимого файла JSON в словарь Python:
with open("po.json",) as fp: d = json.load(fp)
В результате получим такой же словарь, как тот, что представлен выше. Более подробно о работе с файлами мы поговорим в главе 4.
Множества
Множество Python — это неупорядоченная коллекция неповторяющихся элементов. Дублирование элементов в множестве не допускается. Множество объявляется с помощью фигурных скобок, а элементы в нем разделяются запятыми:
{'London', 'New York', 'Paris'}
Множества 59
Удаление дубликатов из последовательности
Поскольку элементы множества должны быть уникальными, эта структура данных полезна, когда нужно удалить дублирующиеся элементы из списка или кортежа. Предположим, что требуется просмотреть список корпоративных клиентов. Такой список можно получить, извлекая имена клиентов из размещенных заказов. Поскольку клиент может сделать несколько заказов, имена в списке могут повторяться. Такие дубликаты можно удалить с помощью множества:
lst = ['John Silver', 'Tim Jemison', 'John Silver', 'Maya Smith'] lst = list(set(lst))
print(lst)
Мы просто приводим список к типу множества, а затем преобразуем обратно в список. Конструктор множества автоматически удаляет дубликаты. Обновленный список будет выглядеть так:
['Maya Smith', 'Tim Jemison', 'John Silver']
Недостаток этого подхода в том, что начальный порядок элементов не сохраняется, поскольку множество — это неупорядоченная коллекция элементов. Действительно, если запустить предыдущий код несколько раз, порядок вывода каждый раз будет разным.
Чтобы выполнить ту же операцию, сохранив первоначальный порядок, используйте функцию sorted():
lst = ['John Silver', 'Tim Jemison', 'John Silver', 'Maya Smith'] lst = list(sorted(set(lst), key=lst.index))
Она сортирует множество по индексам исходного списка, сохраняя таким образом порядок. Новый список будет выглядеть так:
['John Silver', 'Tim Jemison', 'Maya Smith']
Общие операции с множеством
У объектов множеств есть методы для выполнения обычных математических операций над последовательностями, например объединения и пересечения. Эти
60 Глава 2. Структуры данных Python
методы позволяют с легкостью объединять множества или извлекать элементы, общие для нескольких множеств.
Представьте, что вам нужно распределить огромное количество фотографий по группам исходя из того, что на них изображено. Чтобы автоматизировать эту задачу, можно начать с инструмента визуального распознавания (visual recognition), например Clarifai API, который будет генерировать множество описательных тегов для каждой фотографии. Затем множества тегов можно сравнить друг с другом с помощью метода intersection(). Этот метод сравнивает два множества и создает новое множество, содержащее элементы, которые есть в обоих множествах. В данном конкретном случае чем больше тегов в каждом множестве, тем более схожа тематика этих двух изображений.
Для простоты в следующем примере возьмем только две фотографии. Используя соответствующие множества описательных тегов, можно определить степень совпадения тематики этих двух фото:
photo1_tags = {'coffee', 'breakfast', 'drink', 'table', 'tableware', 'cup', 'food'} photo2_tags = {'food', 'dish', 'meat', 'meal', 'tableware', 'dinner', 'vegetable'} intersection = photo1_tags.intersection(photo2_tags)
if len(intersection) >= 2:
print("The photos contain similar objects.")
В этом фрагменте кода мы выполняем операцию поиска пересечений, чтобы найти элементы, общие для обоих множеств. Если количество общих предметов в множествах равно или больше двух, можно сделать вывод, что фотографии имеют схожую тематику и, следовательно, их можно сгруппировать.
УПРАЖНЕНИЕ № 1: ПРОДВИНУТЫЙ АНАЛИЗ ТЕГОВ ФОТОГРАФИЙ
А сейчас попробуйте применить на практике то, чему вы научились в этой главе. Продолжите работать с примером с множествами из предыдущего раздела. В упражнении вам также понадобятся словари и списки.
В примере мы сравнили описательные теги только двух фотографий, по пересечению определив общие. Расширим функциональность кода, чтобы он обрабатывал произвольное количество фотографий, быстро группируя их в категории на основе пересекающихся тегов.
Предположим, что входными данными служит список словарей, где каждый словарь представляет собой фотографию (конечно, вы можете создать
Множества 61
свой собственный список, содержащий гораздо больше элементов). Список словарей ниже доступен для загрузки из репозитория GitHub для книги1:
l = [
{
"name": "photo1.jpg",
"tags": {'coffee', 'breakfast', 'drink', 'table', 'tableware', 'cup', 'food'}
},
{
"name": "photo2.jpg",
"tags": {'food', 'dish', 'meat', 'meal', 'tableware', 'dinner', 'vegetable'}
},
{
"name": "photo3.jpg",
"tags": {'city', 'skyline', 'cityscape', 'skyscraper', 'architecture', 'building',
'travel'}
},
{
"name": "photo4.jpg",
"tags": {'drink', 'juice', 'glass', 'meal', 'fruit', 'food', 'grapes'}
}
]
Ваша задача — распределить фотографии по группам с помощью пересечений тегов и сохранить результат в словарь:
photo_groups = {}
Для этого необходимо перебрать все возможные пары фотографий из списка. Это можно реализовать с помощью вложенной пары циклов for, организованных следующим образом:
for i in range(1, len(l)):
for j in range(i+1,len(l)+1): print(f"Intersecting photo {i} with photo {j}")
#Реализуйте поиск пересечений здесь, сохраняя результаты
#в photo_groups
Вам потребуется самостоятельно написать код тела цикла так, чтобы он выполнял поиск пересечений между l[i]['tags'] и l[j]['tags'] и создавал новую пару «ключ — значение» в словаре photo_groups, если
1 https://github.com/pythondatabook/sources/blob/main/ch2/list_of_dicts.txt