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

В этой статье мы разберем основные методы визуализации данных.
Скачиваем этот файл с котировками акций Google: GOOGL_data
[python]
# Отображение графиков непосредственно в 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())
[/python]
P.S. есть две замечательные функции
dropna() — удаляет записи, у которых есть пропуски
fillna() — заполняет пропуски указанным значением
Давайте построим самый простой график — цена от времени.
Подготовим данные и проверим.
[python]
df[‘Date’] = df[‘Date’].astype(‘datetime64[ns]’)
df_timeseries=df[[‘Date’, ‘Close’]]
df_timeseries.head(3)
[/python]
Строим график:
[python]
df_timeseries.plot()
[/python]
Построим график цены на акцию за 2016 год.
[python]
df_timeseries_2016=df_timeseries[df[‘Date’].dt.year == 2016]
df_timeseries_2016.plot()
[/python]
Немного усложним задачу: нужно построить график волатильности по годам.
Для этого нам необходимо:
- Узнать волатильность для каждого дня
- Просуммировать волатильность дней каждого года
- Построить график
- Волатильность нужно считать не в абсолютной величине, а в относительной
[python]
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()
[/python]
Как видно, 2017 год стал самым скучным для людей, купивших акции Google.
Давайте немного автоматизируем процесс и не будем использовать CSV файл. Для импорта данных напрямую из интернета есть отличный инструмент — pandas_datareader. Задача простая — построить графики цен на акции компаний Oracle, IBM, Microsoft с 2017 года по сегодняшний день.
[python]
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)
[/python]
Названия столбцов выглядят немного странно. Нужно их переименовать.
[python]
df.columns = [‘Date’, ‘Company’, ‘Kind’, ‘Price’]
df.head()
[/python]
После выполнения вышеуказанных команд — столбцы будут иметь нормальные имена.
[python]
# Нам необходимо оставить записи с ценой типа ‘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)
[/python]
Теперь нам необходимо свести данные таким образом, чтобы категориальный признак Company можно было представить в виде столбцов категорий. Сделать это можно с помощью pivot_table().
Обратите внимание, в документации говорится, что сделать это можно с помощью метода pivot(), однако его исопльзование приводит к ошибке.
[python]
df_for_plot = df_for_plot.pivot_table(index=’Date’, columns=’Company’, values=’Price’)
df_for_plot.head()
[/python]
Теперь данные структурированы необходимым образом. Можно строить график.
[python]
df_for_plot.plot()
[/python]
Построим диаграмму распределения цен акции компании IBM c 2017 года по н.в.
[python]
sns.distplot(df_for_plot.IBM)
[/python]
[python]
df_for_plot.std() # просто для справки посчитаем стандартное отклонение
[/python]
Построим график взаимосвязи двух численных признаков — объема торгов и волатильности за день.
Для этих целей можно использовать joint plot. Joint plot — это гибрид scatter plot и histogram.
[python]
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’])
[/python]
Построим Heatmap корелляции признаков в текущем датасете.
[python]
sns.heatmap(df.corr())
[/python]
Что нам показал данный график? А то, что из четырех колонок Open, High, Low и Close можно оставить одну, так как они для алгоритмов машинного обучения принесут только вред из-за возможности переобучения. Также видно, что есть корреляция между объемами торгов и волатильностью.
[python]
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()
[/python]
Воспользуемся методом t-SNE. По-сути это метод нелинейного снижения размерности и визуализации многомерных перменных.
[python]
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])
[/python]
Отобразим объекты с разной волатильностью разными цветами:
[python]
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’}));
[/python]
Вообще, временные ряды — не лучший пример отображения мощности и возможностей метода t-SNE, поэтому позднее добавлю другой пример.