- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
54 Глава 2. Структуры данных Python
Поскольку кортежи неизменяемы, они не подходят для хранения значений данных, которые необходимо периодически обновлять.
Словари
Словарь — это еще одна широко используемая в Python структура данных. Словарь — изменяемая, неупорядоченная коллекция пар «ключ — значение» (keyvalue), где каждый ключ является уникальным именем, которое указывает на элемент данных — значение. Словарь заключается в фигурные скобки. Каждый ключ отделяется от своего значения двоеточием, а пары «ключ — значение» разделяются запятыми, как показано ниже:
{'Make': 'Ford', 'Model': 'Mustang', 'Year': 1964}
Словари, как и кортежи, полезны для хранения разнородных данных об объектах реального мира. Как показано в этом примере, словари имеют дополнительное преимущество — возможность присвоить метку каждому элементу данных.
Список словарей
Как и другие типы данных, словари могут быть вложены в другие структуры. Наш список дел, реализованный в виде списка словарей, будет выглядеть следующим образом:
dict_list = [
{'time': '8:00', 'name': 'Pay bills'}, {'time': '8:30', 'name': 'Tidy up'}, {'time': '9:30', 'name': 'Walk the dog'},
{'time': '10:00', 'name': 'Go to the pharmacy'}, {'time': '10:30', 'name': 'Cook dinner'}
]
В отличие от кортежей, словари изменяемы. Это означает, что в паре «ключ — значение» значение можно изменить:
dict_list[1]['time'] = '9:00'
Этот пример также показывает, как обращаться к значениям словаря: в отличие от списков и кортежей, для этого используются имена ключей, а не числовые индексы.
Словари 55
Добавление элементов в словарь с помощью setdefault()
Метод setdefault() — удобный способ добавления новых данных в словарь. В качестве параметра он принимает пару «ключ — значение». Если указанный ключ уже существует, метод просто возвращает текущее значение этого ключа, а если не существует, setdefault() вставляет его в словарь с указанным значением. Для примера сначала создадим словарь под названием car с моделью
Jetta:
car = {
"brand": "Volkswagen", "style": "Sedan", "model": "Jetta"
}
Теперь попробуем добавить новое значение Passat по ключу model с помощью setdefault():
print(car.setdefault("model", "Passat"))
В результате получим вывод, показывающий, что значение ключа model не изменилось:
Jetta
Однако если указать новый ключ, setdefault()вставит пару «ключ — значение» и вернет значение:
print(car.setdefault("year", 2022))
Вывод:
2022
Теперь выведем на экран словарь целиком:
print(car)
56 Глава 2. Структуры данных Python
Вот что мы получим:
{
"brand": "Volkswagen", "style": "Sedan", "model": "Jetta", "year": 2022
}
Как видите, метод setdefault()избавляет от необходимости вручную проверять, есть ли уже в словаре ключ из вставляемой пары «ключ — значение». Ее можно добавлять в словарь без риска перезаписать значение уже существующего ключа.
Теперь, когда вы знаете, как работает setdefault(), рассмотрим практический пример. Подсчет количества вхождений каждого слова во фразу — частая задача NLP. В следующем примере показано, как решить ее с помощью словаря, используя метод setdefault(). Текст, который необходимо обработать:
txt = '''Python is one of the most promising programming languages today. Due to the simplicity of Python syntax, many researchers and scientists prefer Python over many other languages.'''
Первый шаг — удаление из текста знаков препинания. Без этого шага "languages"
и"languages." будут считаться двумя отдельными словами. Удаляем точки
изапятые:
txt = txt.replace('.', '').replace(',', '')
Далее разбиваем текст на слова и помещаем их в список:
lst = txt.split() print(lst)
Получаем следующий список слов:
['Python', 'is', 'one', 'of', 'the', 'most', 'promising', 'programming',
'languages', 'today', 'Due', 'to', 'the', 'simplicity', 'of', 'Python', 'syntax', 'many', 'researchers', 'and', 'scientists', 'prefer', 'Python',
'over', 'many', 'other', 'languages']
Словари 57
Теперь можем подсчитать количество вхождений каждого слова в список. Это можно реализовать с помощью словаря, используя метод setdefault():
dct = {}
for w in lst:
c = dct.setdefault(w,0) dct[w] += 1
Сначала создаем пустой словарь. Затем добавляем в него пары «ключ — значение», используя слова из списка в качестве ключей. Метод setdefault() устанавливает начальное значение для каждого ключа, равное 0. Затем, при первом появлении определенного слова, значение увеличивается на 1, то есть значение счетчика теперь равно единице. При последующих появлениях этого слова к уже имеющемуся значению добавляется 1 с помощью оператора +=, точно подсчитывая вхождения.
Перед тем как выводить словарь, возможно, понадобится отсортировать слова по количеству вхождений:
dct_sorted = dict(sorted(dct.items(), key=lambda x: x[1], reverse=True)) print(dct_sorted)
Используя метод словаря items(), можно преобразовать словарь в список кортежей, где каждый кортеж будет состоять из ключа и его значения. Таким образом, когда внутри функции sorted()в lambda мы указываем x[1]для параметра key, мы делаем сортировку по первому элементу кортежа (с индексом 1), то есть по значениям (количеству слов) исходного словаря. Полученный словарь выглядит следующим образом:
{'Python': 3, 'of': 2, 'the': 2, 'languages': 2, 'many': 2, 'is': 1, 'one': 1, 'most': 1, 'promising': 1, 'programming': 1, 'today': 1, 'Due': 1, 'to': 1, 'simplicity': 1, 'syntax': 1, 'researchers': 1, 'and': 1, 'scientists': 1, 'prefer': 1, 'over': 1, 'other': 1}
Преобразование JSON в словарь
С помощью словарей структуры данных Python можно преобразовывать в строки JSON и наоборот. Вот как загрузить строку, представляющую собой документ JSON, в словарь, используя лишь оператор присваивания: