- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
94 Глава 4. Доступ к данным из файлов и API
Двоичные файлы
Текстовые файлы — не единственный тип файлов, с которыми вам придется работать. Существуют также исполняемые (.exe) и графические (.jpeg, .bmp и др.) файлы, которые содержат данные в двоичном формате в виде последовательности байтов. Поскольку эти байты обычно интерпретируются не как текстовые символы, вы не можете получить доступ к содержимому двоичного файла, открыв его в текстовом режиме. Вместо этого необходимо использовать функцию open() в двоичном режиме.
В следующем примере показано, как открыть файл изображения в двоичном режиме. Попытка сделать это в текстовом режиме приведет к ошибке. Вы можете запустить этот код с любым файлом .jpg на компьютере:
image = "/path/to/file.jpg"
with open(image, "rb") as image_file: content = image_file.read()
print(len(content))
Мы сообщаем функции open(), что нужно открыть файл для чтения в двоичном режиме, передавая "rb" в качестве второго параметра . Извлеченный объект, как и объект, полученный при открытии файла в текстовом режиме, содержит метод read(), который позволяет получить содержимое файла . В данном примере содержимое извлекается в виде объекта bytes. И мы просто определяем количество байтов, прочитанных из файла .
Экспортирование данных в файл
После обработки данных вам может понадобиться сохранить их в файл, чтобы использовать при следующем исполнении скрипта, импортировать в другие скрипты или приложения либо просто просматривать. Например, вам может понадобиться регистрировать информацию об ошибках и исключениях приложения для последующего анализа.
Вы можете записать данные, создав новый файл из Python-скрипта или перезаписав существующий. Рассмотрим второй вариант. Возвращаясь к примеру из раздела «Файлы с табличными данными», предположим, что требуется изменить строку в файле cars.csv, скорректировав цену определенного автомобиля. Напомним, что данные были считаны из файла cars.csv в список словарей с именем cars. Чтобы просмотреть значения каждого словаря в этом списке, можно запустить следующий цикл:
Экспортирование данных в файл 95
for row in cars: print(list(row.values()))
В теле цикла мы вызываем метод values() для каждого словаря списка, тем самым преобразуя значения словаря в объект dict_values, который легко преобразовать в список. Каждый список представляет собой строку из исходного файла CSV, как показано здесь:
['1997', 'Ford', 'E350', '3200.00']
['1999', 'Chevy', 'Venture', '4800.00']
['1996', 'Jeep', 'Grand Cherokee', '4900.00']
Предположим, нам нужно обновить поле Price во второй строке (для автомобиля Chevy Venture) и сохранить это изменение в исходном файле cars.csv. Это можно сделать так:
to_update = ['1999', 'Chevy', 'Venture']new_price = '4500.00'
with open('path/to/cars.csv', 'w') as csvfile:fieldnames = cars[0].keys()
writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader()
for row in cars:
if set(to_update).issubset(set(row.values())): row['Price'] = new_price
writer.writerow(row)
Прежде всего, нам нужен способ идентифицировать строку, которую требуется обновить. Мы создаем список с названием to_update, элементов в котором будет достаточно для того, чтобы однозначно идентифицировать строку . Затем определяем новое значение для изменяемого поля как new_price . Далее открываем файл для записи, передавая параметр w в функцию open() . Используемый здесь режим w будет перезаписывать существующее содержимое файла. Соответственно, далее нужно определить имена полей, которые будут отправлены в файл . Это имена ключей словаря, который представляет собой строку с информацией об автомобиле.
Используя функцию csv.DictWriter(), мы создаем объект writer, который будет преобразовывать словари из списка cars в выходные строки для отправки в файл cars.csv. Проходя в цикле по словарям списка cars , проверяем, соответствует ли каждая строка указанному идентификатору. Если да, то для данной строки обновляем поле Price. Наконец, все еще внутри цикла, записываем каждую строку в файл, используя метод writer.writerow().