FeatureTools:time_index 参数中可以有多个列吗?

FeatureTools: Can there be multiple columns in time_index parameters?

我在数据帧中有 2 个时间参数,即 start_date 和 end_date,当从数据帧创建实体集时,它们都是时间参数。

在指定 time_index 时,我们可以指定 2 个不同的列吗?

我不想创建一个合并 2 列的新列,因为我想获得像 "time_since_first"、"time_since_last"、"avg_time_between" 这样的 agg_primitives, "trend" 两列。

请告诉我。

这可以通过将第二个时间列指定为 DatetimeTimeIndex 来完成。这是一个使用演示数据集的示例。

import featuretools as ft
​
df = ft.demo.load_mock_customer(return_single_table=True)
df = df.filter(regex='amount|customer|time')

我创建了第二个时间列。

df['transaction_time_2'] = df['transaction_time']
df.head()
     transaction_time  amount  customer_id  transaction_time_2
0 2014-01-01 00:00:00  127.64            2 2014-01-01 00:00:00
1 2014-01-01 00:09:45   57.39            2 2014-01-01 00:09:45
2 2014-01-01 00:14:05   69.45            2 2014-01-01 00:14:05
3 2014-01-01 02:33:50  123.19            2 2014-01-01 02:33:50
4 2014-01-01 02:37:05   64.47            2 2014-01-01 02:37:05

然后,我创建一个实体集。我使用 variable_types 参数将我的第二个时间列设置为 DatetimeTimeIndex 变量类型。

es = ft.EntitySet()
es.entity_from_dataframe(
    'transactions',
    df,
    time_index='transaction_time',
    index='id',
    make_index=True,
    variable_types={
        'transaction_time_2': ft.variable_types.DatetimeTimeIndex,
    }
)
es.normalize_entity('transactions', 'customers', index='customer_id')

最后,我计算特征矩阵。我们可以看到基于时间的基元被应用于两个时间列。

fm, fd = ft.dfs(
    target_entity='customers',
    entityset=es,
    agg_primitives=[
        "time_since_first",
        "time_since_last",
        "avg_time_between",
        "trend",
    ],
    trans_primitives=[],
)
​
print(fm.iloc[0].to_string())
TIME_SINCE_FIRST(transactions.transaction_time)      1.822703e+08
TIME_SINCE_FIRST(transactions.transaction_time_2)    1.822703e+08
TIME_SINCE_LAST(transactions.transaction_time)       1.822401e+08
TIME_SINCE_LAST(transactions.transaction_time_2)     1.822401e+08
AVG_TIME_BETWEEN(transactions.transaction_time)      3.285326e+02
AVG_TIME_BETWEEN(transactions.transaction_time_2)    3.285326e+02
TREND(transactions.amount, transaction_time)        -5.251887e+01
TREND(transactions.amount, transaction_time_2)      -5.251887e+01

让我知道是否有帮助。