- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
158 Глава 7. Объединение датасетов
Поскольку ось 1 проходит горизонтально по столбцам, axis=1сообщает функции concatenate(), что нужно расположить массив new_month_salary в виде столбца справа от других столбцов массива base_salary. Теперь base_salaryвыглядит так:
[[2700 3000 3000 3000] [2600 2800 2800 2900] [2300 2500 2500 2500] [2200 2400 2400 2500] [2500 2700 2700 2700]]
УПРАЖНЕНИЕ № 11:
ДОБАВЛЕНИЕ НОВЫХ СТРОК/СТОЛБЦОВ В МАССИВ NUMPY
Продолжая предыдущий пример, создайте новый массив NumPy с двумя столбцами, который будет содержать информацию об окладе каждого сотрудника еще за два месяца. Затем объедините существующий массив base_salary с вновь созданным. Так же как мы делали выше, добавляйте оклад сотрудников к массиву base_salaryв виде новой строки. Обратите внимание, что при добавлении одной строки или столбца в массив NumPy можно использовать функцию numpy.append(), а не numpy.concatenate().
Объединение структур данных pandas
В главе 3 мы рассмотрели некоторые основные приемы объединения структур данных pandas. Мы разобрали примеры того, как объединять объекты Series в DataFrame и как объединить две структуры DataFrame по индексам. Вы также узнали о различных типах объединений двух датафреймов в один при использовании параметра how внутри метода pandas join() или merge(). В этом разделе вы увидите больше примеров применения этого параметра для создания нестандартных объединений датафреймов, например right join. Однако перед этим вам нужно научиться конкатенировать два датафрейма по определенной оси.
Конкатенация датафреймов
Как и в случае с массивами NumPy, вам может понадобиться объединить два объекта DataFrame по определенной оси, добавив строки или столбцы одного датафрейма к другому. На практических примерах в этом разделе покажем, как это сделать с помощью функции pandas concat(). Прежде чем перейти к рассмотрению примеров, создадим два датафрейма, которые будем конкатенировать.
Объединение структур данных pandas 159
Можно создать датафрейм, поместив в словарь списки jeff_salary, nick_salary и tom_salary, приведенные ранее в этой главе, следующим образом:
import pandas as pd salary_df1 = pd.DataFrame(
{'jeff': jeff_salary, 'nick': nick_salary, 'tom': tom_salary })
Каждый список становится значением в словаре, который, в свою очередь, становится столбцом в создаваемом датафрейме. Ключи словаря, которые являются именами соответствующих сотрудников, становятся метками столбцов. Каждая строка датафрейма содержит все данные об окладе за один месяц. По умолчанию используется числовое индексирование строк, но оптимальной в данном случае была бы индексация с помощью месяцев. Обновить индексы можно таким образом:
salary_df1.index = ['June', 'July', 'August']
Тогда датафрейм salary_df1 будет иметь следующий вид:
|
jeff |
nick |
tom |
June |
2700 |
2600 |
2300 |
July |
3000 |
2800 |
2500 |
August |
3000 |
2800 |
2500 |
|
|
|
|
Возможно, удобнее просматривать данные о зарплате сотрудника в виде строки, а не столбца. Внести такое изменение можно с помощью свойства датафрейма T, которое является сокращением от названия метода DataFrame.transpose():
salary_df1 = salary_df1.T
Эта операция транспонирует датафрейм, превращая его столбцы в строки или наоборот. Теперь датафрейм индексируется по имени сотрудника и выглядит так:
|
June |
July |
August |
jeff |
2700 |
3000 |
3000 |
nick |
2600 |
2800 |
2800 |
tom |
2300 |
2500 |
2500 |
|
|
|
|
160 Глава 7. Объединение датасетов
Теперь необходимо создать еще один датафрейм с теми же столбцами для конкатенации с salary_df1. Как и при конкатенации массивов NumPy, создаем датафрейм, который содержит данные об окладе еще двух сотрудников:
salary_df2 = pd.DataFrame( {'maya': maya_salary, 'john': john_salary
},
index = ['June', 'July', 'August']
).T
Создаем датафрейм, устанавливаем индекс и транспонируем строки и столбцы в одной операции. Вот как будет выглядеть вновь созданный датафрейм:
|
June |
July |
August |
maya |
2200 |
2400 |
2400 |
john |
2500 |
2700 |
2700 |
|
|
|
|
Теперь, когда мы создали оба датафрейма, их можно конкатенировать.
Конкатенация по оси 0
Функция pandas concat() конкатенирует объекты pandas по определенной оси. По умолчанию эта функция использует ось 0, то есть строки датафрейма, который стоит вторым в списке аргументов, будут добавлены после строк дата фрейма, который является первым. Таким образом, для конкатенации salary_df1 и salary_df2можно вызвать concat(), не передавая аргумент axisявно. Все, что нужно сделать, — указать имена датафреймов в квадратных скобках:
salary_df = pd.concat([salary_df1, salary_df2])
Получим следующий датафрейм:
|
June |
July |
August |
jeff |
2700 |
3000 |
3000 |
nick |
2600 |
2800 |
2800 |
tom |
2300 |
2500 |
2500 |
maya |
2200 |
2400 |
2400 |
john |
2500 |
2700 |
2700 |
|
|
|
|
Как видите, строки maya и john из второго датафрейма добавлены после строк первого.