Использование времени в машинных моделях
Время - деньги и важнейший фактор, из которого можно извлечь набор полезных для машинной модели параметров.
Зачастую данные для анализа сопровождаются временными метками их получения. Что же делать с ними дальше и как сформировать релевантную для поставленной задачи признаковую базу. Для этого надо определиться с тем, как ваши результаты могут зависеть от времени и перечнем потенциальной информации, которую несет метка.
Наиболее очевидным является извлечения свойства последовательного изменения данных с течением времени, что может быть полезно, например, в задачах, предсказывающих цену (которая, как правило, с ростом времени увеличивается).
Однако модели могут нуждаться и в другого рода информации, содержащейся во временных метках. Например, окружающая температура зависит как от фактора, отражающего рост времени (тенденция глобального потепления), так и времени года, что потребует извлечение, например, признака месяца или квартала из временной метки.
Эффективным инструментом для работы с датой и временем в 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 г.:
Впоследствии признаки времени присоединяются к общему тренировочному набору для проведения дальнейших исследований. А с какими интересными признаками, извлекаемыми из временных меток сталкивались вы?