- •Об авторе
- •О научном редакторе
- •От издательства
- •Введение
- •Использование 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: расширение набора примеров
- •Прогнозирование тенденций фондового рынка
- •Получение данных
- •Извлечение признаков из непрерывных данных
- •Генерирование выходной переменной
- •Обучение и оценка модели
- •Выводы
268 Глава 12. Машинное обучение для анализа данных
она, упадет или останется прежней. Выяснить это можно, изучив столбец priceRise в строке для следующего дня, который можно получить с помощью команды df['priceRise'].shift(-1). Отрицательный сдвиг смещает будущие значения назад во времени. На основе этого сдвига можно создать новый столбец со значением -1, если цена падает, 0, если цена остается прежней, и 1, если цена растет. Вот как это делается:
conditions = [
(df['priceRise'].shift(-1) > 0.01), (df['priceRise'].shift(-1)< -0.01)
]
choices = [1, -1]
df['Pred'] = np.select(conditions, choices, default=0)
Алгоритм, реализованный выше, исходит из следующих предположений:
1.Увеличение цены более чем на 1% по отношению к стоимости акции в следующий день расценивается как повышение (1).
2.Снижение цены более чем на 1% по отношению к стоимости акции в следующий день расценивается как падение (-1).
3.Остальные случаи расцениваются как стагнация (0).
Для реализации алгоритма мы задаем список conditions, который проверяет данные в соответствии с пунктами 1 и 2 , а также список choices со значениями 1 и -1 для обозначения роста или падения цены . Затем мы передаем эти два списка в функцию NumPy select() , которая создает массив, выбирая значения из choices на основе значений в conditions. Если ни одно из условий не выполняется, в соответствии с пунктом 3 по умолчанию используется значение 0. Сохраняем массив в новом столбце Pred датафрейма, который можно использовать в качестве выходных данных для обучения и тестирования модели. По сути, -1, 0 и 1 теперь являются классами, из которых модель будет делать выбор при классификации новых данных.
Обучение и оценка модели
Для обучения модели scikit-learn требуется представить входные и выходные данные в отдельных массивах NumPy. Создаем массивы из датафрейма df:
features = df[['priceRise','volumeRise','priceRise_idx','volumeRise_idx']].to_numpy() features = np.around(features, decimals=2)
target = df['Pred'].to_numpy()
Прогнозирование тенденций фондового рынка 269
Массив features теперь содержит четыре независимые переменные (входные данные), а массив target — одну зависимую переменную (выходные данные). Далее можно разделить данные на обучающий и тестовый наборы и обучить модель:
from sklearn.model_selection import train_test_split
rows_train, rows_test, y_train, y_test = train_test_split(features, target, test_size=0.2)
from sklearn.linear_model import LogisticRegression clf = LogisticRegression()
clf.fit(rows_train, y_train)
Так же как в примере с анализом тональности, приведенном в начале главы, мы используем функцию scikit-learn train_test_split() для разделения датасета по схеме 80/20, а для обучения модели используем классификатор LogisticRegression. Далее передаем тестовую часть датасета в метод классификатора score() для оценки его точности:
print(clf.score(rows_test, y_test))
Результат будет приблизительно таким:
0.6274509803921569
Он означает, что примерно в 62% случаев модель верно предсказала тенденции для акций Apple на следующий день. Разумеется, у вас может получиться другая цифра.
УПРАЖНЕНИЕ № 20: ЭКСПЕРИМЕНТИРУЕМ С РАЗЛИЧНЫМИ АКЦИЯМИ
И НОВЫМИ МЕТРИКАМИ
Продолжая наш пример, поэкспериментируйте с различными акциями и попробуйте использовать новые метрики, полученные из данных об акциях, в качестве дополнительных независимых переменных, чтобы повысить точность модели. Возможно, вам пригодятся метрики, выведенные в главе 10.