February 8, 2021

Использование времени в машинных моделях

Время - деньги и важнейший фактор, из которого можно извлечь набор полезных для машинной модели параметров.

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

Наиболее  очевидным является извлечения свойства последовательного изменения  данных с течением времени, что может быть полезно, например, в задачах,  предсказывающих цену (которая, как правило, с ростом времени  увеличивается).

Однако  модели могут нуждаться и в другого рода информации, содержащейся во  временных метках. Например, окружающая температура зависит как от  фактора, отражающего рост времени (тенденция глобального потепления),  так и времени года, что потребует извлечение, например, признака месяца  или квартала из временной метки.

Эффективным инструментом для работы с датой и временем в Python является библиотека Pandas,  которую мы и станем использовать. Будем отталкиваться от ситуации,  когда дата и время представлены в строчном формате, так как это наиболее  распространенная ситуация. Первое, что потребуется сделать - преобразовать данные к типу даты и времени.

Если строчное представление является одним из общепринятых, то вам повезло и преобразование может ограничиться вызовом pandas.to_datetime, которая произведет автоматический разбор строки и трансформирует ее значения в тип даты и времени.

Рассмотрим ее работу на примере таблицы (название - train, загружена как объект DataFrame), содержащей ряд погодных метрик, метки времени и требуемый уровень выработки электроэнергии:

Столбец datetime имеет тип object (соответствует строке):

Преобразование типа

Вызовем pandas.to_datetime для значений столбца datetime:

Если данной функции передается отдельная дата, она возвращает объект Timestamp, если несколько - DatetimeIndex. Следует отметить, что если вы вызовете функцию с аргументом Series, а не массивом numpy (то есть не укажите .values при обращении к столбцу DataFrame), то получите другой результат:

Как видите, итоговый объект будет иметь тип Series, а не DatetimeIndex, соответственно, и методы работы с ними будут отличаться.

Альтернативный способ преобразования типа

Также преобразовать к типу даты и времени можно посредством применения функции strptime из модуля datetime с заданным форматом строки к каждому элементу столбца (как это делается подробнее описано здесь):

Преобразование периодичности

Для объекта DatetimeIndex можно вызвать метод to_period для преобразования к объекту PeriodIndex  с заданной частотой, указав код периодичности. На примере ниже зададим периодичность в один день:

Извлечение признаков из метки

Для извлечения признаков можно перебрать столбец меток и для каждой вернуть нужный результат посредством вызова метода map (ранее описан здесь). Извлечем номер месяца из даты:

Для этого задали функцию get_feat,  которая получает строчное представление даты, формат строки и возвращает число месяца.

Так  как данный атрибут категориальный перед запуском модели его потребуется  преобразовать в индикаторную матрицу с помощью функции pandas.get_dummies, которая для каждой категории формирует отдельный столбец с 0 или 1:

Теперь, немного изменив функцию get_feat, извлечем другой признак - количество секунд, прошедших с 01 января 1970 г.:

Впоследствии  признаки времени присоединяются к общему тренировочному набору для  проведения дальнейших исследований. А с какими интересными признаками,  извлекаемыми из временных меток сталкивались вы?