вычисление профилей с временными окнами с помощью featuretools dfs

#featuretools

#featuretools

Вопрос:

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

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

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

вот мое определение entityset:

 es = ft.EntitySet('payment')
es = es.entity_from_dataframe(entity_id='tableA',
                           dataframe=tableA_dfpd,
                           index='paymentIndex',
                           time_index='A_time')


es.normalize_entity(base_entity_id='tableA',
               new_entity_id='tableB',
               index='B_index',
               additional_variables=['B_x','B_time'],
               make_time_index='B_time')
               
es.normalize_entity(base_entity_id='tableA',
               new_entity_id='tableC',
               index='C_index',
               additional_variables=["C_x","C_date"],
               make_time_index="C_date")

es.normalize_entity(base_entity_id='tableA',
               new_entity_id='tableD',
               index='D_index',
               additional_variables=["D_x"],
               make_time_index=False)
               
Entityset: payment
  Entities:
    tableA [Rows: 310083, Columns: 8]
    tableB [Rows: 30296, Columns: 3]
    tableC [Rows: 206565, Columns: 3]
    tableD [Rows: 18493, Columns: 2]
  Relationships:
    tableA.B_index -> tableB.B_index
    tableA.C_index -> tableC.C_index
    tableA.D_index -> tableD.D_index
  

как именно я могу выполнить вычисление окна? нужно ли передавать даты отсечения или нет? для метода dfs?
я хочу использовать все оконные вычисления на основе переменной A_time для 60-дневного окна до текущей транзакции, поэтому фактически датой отсечения для каждой транзакции является значение time_A этой транзакции. , не так ли ?

Ответ №1:

Спасибо за вопрос. Вы можете вычислять объекты на основе временного окна, используя окно обучения в DFS. Вы также можете исключить транзакции во время отключения, установив include_cutoff_time=False . Я буду использовать этот набор данных транзакций для рассмотрения примера.

 import featuretools as ft

df = ft.demo.load_mock_customer(return_single_table=True)
df = df[['transaction_id', 'transaction_time', 'customer_id', 'amount']]
df.sort_values(['customer_id', 'transaction_time'], inplace=True)
df.head()
  
  transaction_id    transaction_time  customer_id  amount
            290 2014-01-01 00:44:25            1   21.35
            275 2014-01-01 00:45:30            1  108.11
            101 2014-01-01 00:46:35            1  112.53
             80 2014-01-01 00:47:40            1    6.29
            484 2014-01-01 00:48:45            1   47.95
  

Сначала мы создаем набор сущностей для транзакций и клиентов.

 es = ft.EntitySet()

es.entity_from_dataframe(
    entity_id='transactions',
    index='transaction_id',
    time_index='transaction_time',
    dataframe=df,
)

es.normalize_entity(
    base_entity_id='transactions',
    new_entity_id='customers',
    index='customer_id',
)

es.add_last_time_indexes()
  
 Entityset: None
  Entities:
    transactions [Rows: 500, Columns: 4]
    customers [Rows: 5, Columns: 2]
  Relationships:
    transactions.customer_id -> customers.customer_id
  

Затем мы создаем время отсечения для каждой транзакции для каждого клиента.

 cutoff_time = df[['customer_id', 'transaction_time']]
cutoff_time['time'] = cutoff_time.pop('transaction_time')
cutoff_time.head()
  
  customer_id                time
           1 2014-01-01 00:44:25
           1 2014-01-01 00:45:30
           1 2014-01-01 00:46:35
           1 2014-01-01 00:47:40
           1 2014-01-01 00:48:45
  

Теперь мы можем запустить DFS, используя окно обучения, для вычисления объектов на основе временного окна. В этом примере мы установим окно обучения равным 1 часу. Это будет включать все транзакции в течение 1 часа до времени отключения для каждого клиента.

По умолчанию транзакции во время отключения также включаются в расчет. Мы можем исключить эти транзакции, установив include_cutoff_time=False .

 fm, fd = ft.dfs(
    target_entity='customers',
    entityset=es,
    cutoff_time=cutoff_time,
    include_cutoff_time=False,
    cutoff_time_in_index=True,
    training_window='1h',
    trans_primitives=[],
    agg_primitives=['sum'],
    verbose=True,
)

fm.sort_index().head() 
  
                                  SUM(transactions.amount)
customer_id time                                         
1           2014-01-01 00:44:25                      0.00
            2014-01-01 00:45:30                     21.35
            2014-01-01 00:46:35                    129.46
            2014-01-01 00:47:40                    241.99
            2014-01-01 00:48:45                    248.28
  

Если время отсечения не передается в DFS, то все транзакции для каждого клиента включаются в расчет. Дайте мне знать, если это поможет.