Программное обеспечение

Машинное обучение, искусственный интеллект. Python, Pandas, Keras. Часть 1.

В этой статье мы разберем основы работы с Pandas для машинного обучения.

Для начала работы установите Anaconda2. Однако, Вы можете использовать системный Python с библиотеками.
Перейдите по данной ссылке: https://www.anaconda.com/download/ и скачайте установочный файл для Вашей системы.
Далее нам потребуется Jupyter Notebook.
Предполагается, что Вы знаете основы Python. Если не знаете, то ничего страшного — синтаксис этого языка достаточно простой. Также необходимо ознакомиться с библиотеками NumPy, Pandas и Scipy.

По pandas есть отличная шпаргалка. Прилагается ниже:
Шпаргалка Pandas

Перед началом работы скачайте файл с котировками.

Котировки акций Google класса A

Основы

Первое, с чего нам необходимо начать, так это с импорта необходимых библиотек

[python]

import pandas as pd
import numpy as np

[/python]

Давайте произведем чтение нашего CSV файла в переменную с типом dataframe. Dataframe в Pandas это, по-сути, такая же обычная таблица.

[python]

df = pd.read_csv(‘./data/individual_stocks_5yr/GOOGL_data.csv’)

[/python]

Сейчас мы считали в dataframe информацию об акциях Google.

Теперь нам необходимо хоть как-то оценить данные и что в них лежит. Для этого, давайте воспользуемся функцией head(), она выведет первые несколько строчек

[python]
df.head()
[/python]

Акции GOOGL — это акции класса A и дают право одного голоса владельцу, есть также акции GOOG — это акции класса C и не дают права голоса. Также есть акции класса B, каждая из которых дает 10 голосов, но их нет на публичном рынке.

Теперь оценим вообще размер нашего датасета. Воспользуемся свойством shape и выведем его.

[python]

print(df.shape)

[/python]

Таким образом, в нашем датасете информация о 1258 днях. А что необходимо делать, если в нашем файле отсутствуют headerы? Для этого нужно указать специальный параметр header=None pd.read_csv(‘[PATH]’, header=None,names=(‘column1′,’column2′,’column3’))

Посмотреть на конец датасета можно с помощью функции tail

[python]

df.tail()

[/python]

Чтобы посмотреть только названия столбцов, нужно вывести свойство columns.

[python]

print(df.columns)

[/python]

Посмотреть типы столбцов, а также те, в которых есть пустые значения можно с помощью функции info()

[python]

print(df.info())

[/python]

Давайте преобразуем тип столбца Date из object в datetime

[python]

df[‘Date’] = pd.to_datetime(df[‘Date’])
print(df.info())
[/python]

Узнать основные статистические значения по числовым признакам можно с помощью describe()

[python]

df.describe()
[/python]

Пока глядя на эту таблицу ничего сказать нельзя.
Изменить тип колонки можно также другим способом.

[python]

df[‘Date’] = df[‘Date’].astype(‘datetime64[ns]’)
[/python]

Если Вы хотите, чтобы показались статистики по нечисловым признакам, их нужно указать непосредственно. Указываются их типы.

[python]

df.describe(include=[‘object’, ‘bool’])
[/python]

Как правило, признаки можно разделить на три типа. Числовые, булевые, категориальные. Для последних двух признаков можно воспользоваться методом value_counts().

[python]

df[‘Name’].value_counts()
[/python]

Отсортируем по увеличивающейся цене закрытия и уменьшающейся цене открытия

[python]
df.sort_values(by=[‘Close’, ‘Open’], ascending=[True, False]).head(5)
[/python]

Из предыдущих примеров Вам должно было стать ясно, что извлечь значения одного столбца можно с помощью конструкции вида df[‘Close’]. Таким нехитрым способом можно применять разные функции к одному столбцу. Например, можно найти среднее или медиану.

[python]
df[‘Close’].median()
[/python]

Логическая индексация

Более мощным инструментом является логическая индексация.
df[P(df[‘Name’])] ,где P — это некоторое логическое условие, проверяемое для каждого элемента столбца Name. Итогом индексации является датафрейм, состоящий только из строк, удовлетворяющих условию P по столбцу Name.

Поэтому, давайте узнаем среднюю стоимость акции в 2016 году (по закрытию).

[python]

df[df[‘Date’].dt.year == 2017][‘Close’].mean()

[/python]

Разберем вышеуказанную строчку. Мы из dataframe выбрали все записи, у которых Date имеет год, равный 2017. Далее из этих записей мы выбрали только один столбец — цену закрытия Close. После этого, мы посчитали для этой Series среднее значение.

Теперь нужно сделать второй столбец ‘Change’. Он будет указывать изменение цены закрытия по сравнению с предыдущим днем в процентах.

[python]

df[‘Change’] = (df[‘Close’]-df[‘Close’].shift(+1))*100/df[‘Close’]

[/python]

Создадим также текстовый столбец со значениями RISE/FALL/NOT_CHANGE в зависимости от условий

[python]

def f(row):
if row[‘Change’]>0.2:
return ‘RISE’
elif row[‘Change’]<-0.2:
return ‘FALL’
else:
return ‘NOT_CHANGE’

df[‘State’] = df.apply(f, axis=1)

[/python]

Давайте узнаем максимальную стоимость акции в период с 2016 по 2017 год

[python]

df[(df[‘Date’].dt.year <= 2017) & (df[‘Date’].dt.year>=2016)][‘High’].max()

[/python]

Индексация по названиям и порядковым номерам

Датафреймы можно индексировать как по названию столбца или строки, так и по порядковому номеру.

Индексация по названию — loc. Покажи строчки с 0 до 5 для столбцов от Open до Close.

[python]

df.loc[0:5,’Open’:’Close’]

[/python]

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

[python]

df.iloc[0:5, 0:3]

[/python]

Первую строчку датафрейма можно отобразить с помощью такой конструкции

[python]

df[:1]

[/python]

Последнюю строчку можно отобразить так

[python]

df[-1:]

[/python]

Применение функции к каждому столбцу

[python]
df.apply(np.max)

[/python]

Применение функции к каждой ячейке

Метод map может осуществлять замену значений в колонке. Например:

[python]

# Создадим словарь для map() и передадим его в качестве аргумента

#d = {‘FALL’: False, ‘NOT_CHANGE’: False, ‘RISE’: True}
#df[‘State’] = df[‘State’].map(d)
df.head()

[/python]

Также для замены значений используйте метод replace()

[python]

# df = df.replace({‘State’: d})
# df.head()

[/python]

Группировка данных

В общем случае группировка данных в Pandas выглядит так:
df.groupby(by=grouping_columns)[columns_to_show].function()

  • К датафрейму применяется метод groupby, который разделяет данные по grouping_columns — признаку или набору признаков
  • Выбираем нужные нам столбцы (columns_to_show)
  • К полученным группам применяется функция или несколько функций

Группирование данных в зависимости от значения признака State и вывод статистикпо трем столбцам в каждой группе.

[python]

columns_to_show = [‘Close’, ‘Volume’]
df.groupby([‘State’])[columns_to_show].describe()

[/python]

Глядя на данную таблицу можно сделать вывод, что акция в период роста или падения имеет больший объем сделок ~ на 20%.

То же самое можно было осуществить используя функцию agg()

[python]

columns_to_show = [‘Close’, ‘Volume’]
df.groupby([‘State’])[columns_to_show].agg([np.mean, np.std, np.min, np.max])

[/python]

Сводные таблицы

Что нужно сделать если необходимо посмотреть, как наблюдения в выборке распределены в контексте двух признаков. Для этого можно построить таблицу сопряженности. Сделать это можно с помощью функции crosstab().

[python]

def f(row):
if row[‘Volume’]>2000000:
return ‘HIGH’
else:
return ‘LOW’

df[‘Volume_2’] = df.apply(f, axis=1)
pd.crosstab(df[‘Volume_2’], df[‘State’], normalize=True)

[/python]

Сводные таблицы

В Pandas для этого используется метод pivot_table. В качестве параметров он принимает:

  • values — список переменных, по которым требуется рассчитать требуемые статистики
  • index — список переменных, по которым нужно сгруппировать данные
  • aggfunc — то, что нужно посчитать по группам — сумму, среднее, максимум, минимум и т.д.

[python]

df["VolumeDiv10"]=df["Volume"]/100000;
df["VolumeDiv10"]=df["VolumeDiv10"].astype(int)
df.head()
df.pivot_table([‘Close’, ‘Open’, ‘Change’], [‘VolumeDiv10′], aggfunc=’mean’)

[/python]

Преобразование датафреймов

Еще один столбец можно создать с помощью функции insert()

[python]

volatility = df[‘High’] — df[‘Low’]
df.insert(loc=len(df.columns), column=’Volatility’, value=volatility)

[/python]

  • Первый аргумент — говорит, что мы должны вставить столбик в конец
  • Второй аргумент — название колонки
  • Третий аргумент — значения в колонке

Удаление строк и столбцов

[python]

df = df.drop([‘Change’], axis=1)
df.drop([1, 2]).head(

[/python]

Рекомендации

  1. Для оценки взаимосвязи двух признаков исппользуйте crosstab
  2. Если мы тратим большое количество времени и увеличиваем accuracy всего лишь на 1%, то скорее всего мы делаем что-то не так.
  3. Перед тем как строить и обучать сложные модели, проверьте данные и проверьте простые предположения.
  4. В бизнес-приложениях начинают именно с простых решений, так как важно знать причину появления того или иного результата.

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

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