Я генерирую исторические объекты для текущей строки с featuretools
. Например, количество транзакций, выполненных за последний час во время сеанса.
Пакет featuretools
включает параметр cutoff_time
для исключения всех строк, следующих за cutoff_time
во времени.
Я установил cutoff_time
как time_index value - 1 second
, поэтому я ожидаю, что функции будут основаны на исторических данных минус текущая строка. Это позволяет включать переменную ответа из исторических строк.
Проблема в том, что когда этот параметр не равен переменной time_index
, я получаю набор NaN
с в исходных и созданных функциях.
Пример:
#!/usr/bin/env python3
import featuretools as ft
import pandas as pd
from featuretools import primitives, variable_types
data = ft.demo.load_mock_customer()
transactions_df = data['transactions']
transactions_df['cutoff_time'] = transactions_df['transaction_time'] - pd.Timedelta(seconds=1)
es = ft.EntitySet('transactions_set')
es.entity_from_dataframe(
entity_id='transactions',
dataframe=transactions_df,
variable_types={
'transaction_id': variable_types.Index,
'session_id': variable_types.Id,
'transaction_time': variable_types.DatetimeTimeIndex,
'product_id': variable_types.Id,
'amount': variable_types.Numeric,
'cutoff_time': variable_types.Datetime
},
index='transaction_id',
time_index='transaction_time'
)
es.normalize_entity(
base_entity_id='transactions',
new_entity_id='sessions',
index='session_id'
)
es.add_last_time_indexes()
fm, features = ft.dfs(
entityset=es,
target_entity='transactions',
agg_primitives=[primitives.Sum, primitives.Count],
trans_primitives=[primitives.Day],
cutoff_time=transactions_df[['transaction_id', 'cutoff_time']].
rename(index=str, columns={'transaction_id': 'transaction_id', 'cutoff_time': 'time'}),
training_window='1 hours',
verbose=True
)
print(fm)
Вывод (выдержка):
DAY(cutoff_time) sessions.SUM(transactions.amount) \
transaction_id
352 NaN NaN
186 NaN NaN
319 NaN NaN
256 NaN NaN
449 NaN NaN
40 NaN NaN
13 NaN NaN
127 NaN NaN
21 NaN NaN
309 NaN NaN
Столбец sessions.SUM(transactions.amount)
должен быть> = 0. Оригинальные функции session_id product_id amount
также NaN
.
Если transactions_df['cutoff_time'] = transactions_df['transaction_time']
(без разницы во времени), этот код работает, но включает текущую строку.
Как правильно вычислять агрегаты и преобразования, которые исключают текущую строку из вычислений?