ВВЕДЕНИЕ

Поля DateTime требуют, чтобы функция Feature Engineering превратила их из данных в информативную информацию, которую можно использовать в наших моделях машинного обучения. Этот пост разделен на 3 части и бонусный раздел ближе к концу, мы будем использовать комбинацию встроенных функций pandas и NumPy, а также наши функции для извлечения полезных функций.

  • Часть 1 - Извлечение компонентов даты / времени
  • Часть 2 - Создание логических флагов
  • Часть 3 - Расчет разницы в дате / времени
  • Бонус - разработка функций в 2 строчках кода с использованием fast_ml

ЗАДНИЙ ПЛАН

Когда бы я ни работал с данными, связанными с электронной коммерцией, так или иначе, другой набор данных содержит столбцы DateTime.

  • Дата и время регистрации пользователя
  • Дата и время входа в систему
  • Дата и время транзакции
  • Дата и время оспариваемой транзакции
  • … И многое другое

Вначале это поле даты не дает нам ничего, кроме определенной точки на временной шкале. Но эти поля DateTime - потенциальная сокровищница данных. Эти поля обладают огромной мощью «при правильном использовании» для выявления закономерностей.

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

  • Вопрос 1. Когда вы видите, что создается больше всего тележек?
  • Вопрос 2. Когда вы чаще всего бросаете тележки?
  • Вопрос 3. Когда вы видите самые мошеннические транзакции?
  • Вопрос 4. Когда подписывается максимальное количество пользователей?
  • Вопрос 5. Когда чаще всего покупаются определенные товары?
  • Вопрос 6 - Через сколько дней / часов после регистрации пользователь сделает первый заказ?
  • Вопрос 7 - через сколько дней бездействия клиент больше не возвращается на ваш сайт?
  • … и т.д

Теперь, чтобы ответить на эти вопросы, вы вернетесь к данным для разработки этих полей DateTime. И тогда можно обнаружить множество закономерностей.

В части 1 сообщения вы найдете инструкции по разработке, которые позволят вам ответить на такие вопросы, как 1,2 и 3.

  • Ответ 1. Когда вы видите, что создается больше всего тележек? Первая неделя месяца
  • Ответ 2. Когда вы чаще всего бросаете тележки? среда - вторая половина дня
  • Ответ 3. Когда вы видите самые мошеннические транзакции? Пятница - Поздний вечер

Часть 2 сообщения предоставит вам инструкции по разработке, чтобы ответить на вопросы, подобные в 4 и 5.

  • Ответ 4. Когда подписывается максимальное количество пользователей? В начале года
  • Ответ 5. Когда определенные товары покупаются чаще всего? В начале месяца

Часть 3 сообщения предоставит вам инструкции по разработке, чтобы ответить на вопросы, подобные в 6 и 7.

  • Ответ 6 - Через сколько дней / часов после регистрации пользователь сделает первый заказ? В течение 2 часов
  • Ответ 7 - Через сколько дней бездействия клиент больше не возвращается на ваш сайт? После 14 дней бездействия

Я использовал пример данных электронной коммерции, где я лично нашел множество вариантов использования, но ни в коем случае объем извлечения информации не связан только с этим. В этом посте мы увидим, как можно изучить некоторые модели поведения, задав правильный вопрос, т. Е. правильная разработка функций оказалась полезной во многих отраслях для решения самых разных задач.

ДАВАЙТЕ НАЧНЕМ

Загрузите набор данных

import pandas as pd
df = pd.read_csv('/kaggle/input/loan-data/loan.csv', 
                 parse_dates = ['date_issued', 'date_last_payment'])

Pandas предоставляет очень простой, но очень мощный способ работы с переменными, связанными с DateTime, путем анализа их как дат. Вы можете передать в виде списка все переменные, связанные с датой и временем, в параметре parse_dates.

Допустим, вы не знали о переменных DateTime заранее, и после исследования данных вы обнаружили, что некоторые из переменных являются датой и временем. Поэтому вместо перезагрузки данных pandas предоставляет еще одну полезную функцию to_datetime для преобразования типа данных в DateTime.

df['date_issued'] = pd.to_datetime(df['date_issued'], 
                                   errors = 'coerce')

Часть 1. Извлечение компонента "Дата / время"

Как показано в приведенном выше примере, мы можем извлечь компонент части даты и времени (year, quarter, month, day, day_of_week, day_of_year, week_of_year, time, hour, minute, second, day_part) из заданной переменной даты и времени. . В приведенном ниже списке представлены несколько таких компонентов, которые можно извлечь с помощью встроенных функций pandas.

Синтаксис:

Мы можем извлечь все эти компоненты, используя .dt аксессор. Подробнее об аксессуарах даты здесь

Ниже приведен код, показанный на изображении. Все остальные компоненты также могут быть извлечены аналогичным образом.

#1
df[‘date_issued:year’] = df[‘date_issued’].dt.year
#2
df[‘date_issued:month’] = df[‘date_issued’].dt.month
#3
df[‘date_issued:day_of_week’] = df[‘date_issued’].dt.day_of_week
#4
df[‘date_issued:week_of_year’] = df[‘date_issued’].dt.week_of_year
#5
df[‘date_issued:hour’] = df[‘date_issued’].dt.hour

Примечание.

  • На понедельник: day_of_week = 0,
  • Вторник: day_of_week=1,
  • Воскресенье: day_of_week=6

Создание дневной части:

#day_part function
def day_part(hour):
    if hour in [4,5]:
        return "dawn"
    elif hour in [6,7]:
        return "early morning"
    elif hour in [8,9,10]:
        return "late morning"
    elif hour in [11,12,13]:
        return "noon"
    elif hour in [14,15,16]:
        return "afternoon"
    elif hour in [17, 18,19]:
        return "evening"
    elif hour in [20, 21, 22]:
        return "night"
    elif hour in [23,24,1,2,3]:
        return "midnight"
    
    
#Run function with apply method
df['date_issued:day_part'] = df['date_issued:hour'].apply(day_part)
df.head()

Часть 2. Создание логических флагов

Как показано в приведенном выше примере, мы можем извлечь множество логических флагов (is_month_start, is_month_end, is_quarter_start, is_quarter_end, is_year_start, is_year_end, is_weekend) из заданной переменной даты и времени. В приведенном ниже списке представлены несколько таких компонентов, которые можно извлечь с помощью встроенных функций pandas, а также путем создания некоторых из наших функций.

Синтаксис:

Опять же, мы можем использовать метод доступа .dt для извлечения большого количества этих логических флагов.

#1
df['date_issued:is_year_start'] = df['date_issued'].dt.is_year_start
#2
df['date_issued:is_quarter_start'] = df['date_issued'].dt.is_quarter_start
#3
df['date_issued:is_month_start'] = df['date_issued'].dt.is_month_start
#4
df['date_issued:is_month_end'] = df['date_issued'].dt.is_month_end

Создание флага выходного дня:

Если мы проверим календарь, то увидим, что 26 октября 2013 года была суббота - выходной.

df['date_issued:is_weekend'] = np.where(df['date_issued:day_of_week'].isin([5,6]), 1,0)

Часть 3. Расчет разницы в дате и времени

Часто ваши вопросы / анализ будут относиться к другой точке отсчета. Нравится,

  1. Через сколько дней / часов после регистрации пользователь делает первый заказ? Дата_ регистрации и дата_первого_порядка
  2. За сколько дней / часов жалоба клиента была решена? жалоба_дата и разрешение_дата
  3. С сегодняшнего дня, как недавно клиент делал заказы с вашего сайта? сегодня и дата_последнего_порядка
  4. …и т.д

В нашем примере набора данных у нас есть два столбца date_last_payment и date_issued. Давайте посмотрим, что произойдет, если мы просто возьмем разницу этих двух столбцов.

Панды по умолчанию показывают разницу в «днях». Обратите внимание на dtype: timedelta64[ns].

Из документации numpy:

«Поскольку в ядре NumPy нет системы физических величин, тип данных timedelta64 был создан для дополнения datetime64»

Теперь, если нам нужна только числовая часть, а не вся строка 947 days, мы можем сделать это с помощью метода доступа .dt.

К сожалению, мы не можем получить месяцы подобным образом.

Здесь timedelta64 от NumPy становится очень полезным.

Синтаксис:

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

(df['date_last_payment'] - df['date_issued'])/np.timedelta64(1, 'M')

timedelta64 может принимать следующие параметры для вычисления разницы между двумя датами:

  • ‘D’ → на дней
  • ‘W’ → на недель
  • ‘M’ → для месяцев
  • ‘Y’ → для лет
  • ‘H’ → для часов

БОНУС!

Вы можете использовать fast_ml для создания всех этих функций datetime

Сначала установите пакет fast_ml

!pip install fast_ml — upgrade

А затем из модуля feature_engineering импортируйте метод для инженерных функций даты и времени.

from fast_ml.feature_engineering import FeatureEngineering_DateTime

Теперь это работает точно так же, как и другие преобразователи, препроцессоры из sklearn.

  • Создать экземпляр
  • Соответствовать
  • Преобразовать
#Instantiate
dt_fe = FeatureEngineering_DateTime()
#Fit
dt_fe.fit(df, datetime_variables=['date_issued'], 
          prefix = 'date_issued:')
#Transform
df = dt_fe.transform(df)
df.head()

На скриншоте не видны все столбцы. Давайте просто посмотрим на столбцы набора данных

df.columns
---Output---
Index(['customer_id', 'disbursed_amount', 'interest', 'market', 'employment', 'time_employed', 'householder', 'income', 'date_issued', 'target', 'loan_purpose', 'number_open_accounts', 'date_last_payment', 'number_credit_lines_12',
(Notice from here ------->)
'date_issued:year', 'date_issued:quarter', 'date_issued:month', 'date_issued:day', 'date_issued:day_of_week', 'date_issued:day_of_year', 'date_issued:weekofyear', 'date_issued:is_month_end', 'date_issued:is_month_start', 'date_issued:is_quarter_end', 'date_issued:is_quarter_start', 'date_issued:is_year_end', 'date_issued:is_year_start', 'date_issued:time', 'date_issued:hour', 'date_issued:minute', 'date_issued:second', 'date_issued:is_weekend', 'date_issued:day_part'],
dtype='object')

Спасибо за чтение!!

Ноутбук с полнофункциональным кодом доступен по следующему адресу: