#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, то все транзакции для каждого клиента включаются в расчет. Дайте мне знать, если это поможет.