Машинное обучение, искусственный интеллект. Python, Pandas, Keras. Часть 2. Визуализация данных.

В этой статье мы разберем основные методы визуализации данных.

Скачиваем этот файл с котировками акций Google: GOOGL_data


# Отображение графиков непосредственно в Jupyter ноутбуке
%pylab inline

import pandas as pd
import seaborn as sns # либа для построения графиков

df = pd.read_csv('./data/individual_stocks_5yr/GOOGL_data.csv')
print (df.info())

P.S. есть две замечательные функции
dropna() — удаляет записи, у которых есть пропуски
fillna() — заполняет пропуски указанным значением

Давайте построим самый простой график — цена от времени.

Подготовим данные и проверим.


df['Date'] = df['Date'].astype('datetime64[ns]')

df_timeseries=df[['Date', 'Close']]

df_timeseries.head(3)

Строим график:


df_timeseries.plot()

Построим график цены на акцию за 2016 год.


df_timeseries_2016=df_timeseries[df['Date'].dt.year == 2016]
df_timeseries_2016.plot()

Немного усложним задачу: нужно построить график волатильности по годам.
Для этого нам необходимо:

  • Узнать волатильность для каждого дня
  • Просуммировать волатильность дней каждого года
  • Построить график
  • Волатильность нужно считать не в абсолютной величине, а в относительной

 


df['Volatility']=abs((df['High']-df['Low'])/df['Close'])*100
df['Year']=df['Date'].dt.year
df.head()

df_volatility=df[['Volatility', 'Year']]
df_volatility.groupby('Year').mean().plot()

Как видно, 2017 год стал самым скучным для людей, купивших акции Google.

Давайте немного автоматизируем процесс и не будем использовать CSV файл. Для импорта данных напрямую из интернета есть отличный инструмент — pandas_datareader. Задача простая — построить графики цен на акции компаний Oracle, IBM, Microsoft с 2017 года по сегодняшний день.


import pandas_datareader as web
from datetime import datetime

#увеличим дефолтный размер графиков
from pylab import rcParams
rcParams['figure.figsize'] = 8, 5

# Необходимые акции
stocks = ['ORCL', 'IBM', 'MSFT']

# Определение дат
start = datetime(2017,1,1)
end = datetime.now()

# Загружаем данные
f = web.DataReader(stocks, 'yahoo', start, end)
# Записываем их в dataframe
df = pd.DataFrame(f.to_frame().stack()).reset_index()

# Проверим структуру загруженных данных
df.head(5)

Названия столбцов выглядят немного странно. Нужно их переименовать.


df.columns = ['Date', 'Company', 'Kind', 'Price']
df.head()

После выполнения вышеуказанных команд — столбцы будут иметь нормальные имена.


# Нам необходимо оставить записи с ценой типа 'Close'
df_for_plot = df[df['Kind']=='Close'][['Date','Company','Price']]
# Отсортируем таким образом, чтобы в начале шли более старые котировки
df_for_plot = df_for_plot.reindex(index=df_for_plot.index[::-1])
df_for_plot.head(20)

Теперь нам необходимо свести данные таким образом, чтобы категориальный признак Company можно было представить в виде столбцов категорий. Сделать это можно с помощью pivot_table().

Обратите внимание, в документации говорится, что сделать это можно с помощью метода pivot(), однако его исопльзование приводит к ошибке.


df_for_plot = df_for_plot.pivot_table(index='Date', columns='Company', values='Price')
df_for_plot.head()

Теперь данные структурированы необходимым образом. Можно строить график.


df_for_plot.plot()

Построим диаграмму распределения цен акции компании IBM c 2017 года по н.в.


sns.distplot(df_for_plot.IBM)


df_for_plot.std() # просто для справки посчитаем стандартное отклонение

Построим график взаимосвязи двух численных признаков — объема торгов и волатильности за день.

Для этих целей можно использовать joint plot. Joint plot — это гибрид scatter plot и histogram.


df = pd.read_csv('./data/individual_stocks_5yr/GOOGL_data.csv')
df['Date'] = df['Date'].astype('datetime64[ns]')
df['Volatility']=abs((df['High']-df['Low'])/df['Close'])*100

sns.jointplot(df['Volatility'], df['Volume'])

Построим Heatmap корелляции признаков в текущем датасете.


sns.heatmap(df.corr())

Что нам показал данный график? А то, что из четырех колонок Open, High, Low и Close можно оставить одну, так как они для алгоритмов машинного обучения принесут только вред из-за возможности переобучения. Также видно, что есть корреляция между объемами торгов и волатильностью.


X = df.drop(['Name','Open','High','Low','Date'], axis=1)
df.head()
X['Close'] = X['Close'].astype(int)
X['Volatility'] = X['Volatility'].astype(int)
X.head()

Воспользуемся методом t-SNE. По-сути это метод нелинейного снижения размерности и визуализации многомерных перменных.


from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

tsne = TSNE(random_state=17)
tsne_representation = tsne.fit_transform(X_scaled)

plt.scatter(tsne_representation[:, 0], tsne_representation[:, 1])

Отобразим объекты с разной волатильностью разными цветами:


plt.scatter(tsne_representation[:, 0], tsne_representation[:, 1],
c=X['Volatility'].map({0: 'blue', 1: 'magenta', 2:'yellow', 3: 'red', 4:'pink', 5: 'grey', 6:'black', 7: 'green', 8:'cyan', 9: 'orange', 10:'orange', 11: 'orange', 12:'orange'}));

Вообще, временные ряды — не лучший пример отображения мощности и возможностей метода t-SNE, поэтому позднее добавлю другой пример.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *