Python 数据组的特征工具差异

Python featuretools difference by data group

我正在尝试使用 featuretools 来计算时间序列函数。具体来说,我想通过组键 (user_id) 从 previous(x) 中减去 current(x),但是我在实体集中添加这种关系时遇到了麻烦。

df = pd.DataFrame({
    "user_id": [i % 2 for i in range(0, 6)],
    'x': range(0, 6),
    'time': pd.to_datetime(['2014-1-1 04:00', '2014-1-1 05:00', 
                            '2014-1-1 06:00', '2014-1-1 08:00', '2014-1-1 10:00', '2014-1-1 12:00'])
     })

print(df.to_string())
       user_id  x                time
0        0      0 2014-01-01 04:00:00
1        1      1 2014-01-01 05:00:00
2        0      2 2014-01-01 06:00:00
3        1      3 2014-01-01 08:00:00
4        0      4 2014-01-01 10:00:00
5        1      5 2014-01-01 12:00:00


es = ft.EntitySet(id='test')
es.entity_from_dataframe(entity_id='data', dataframe=df,
                         variable_types={
                             'user_id': ft.variable_types.Categorical,
                             'x': ft.variable_types.Numeric,
                             'time': ft.variable_types.Datetime
                         },
                         make_index=True, index='index',
                         time_index='time'
                         )

然后我尝试调用 dfs,但我无法获得正确的关系...

fm, fl = ft.dfs(
    target_entity="data",
    entityset=es,
    trans_primitives=["diff"]
)
print(fm.to_string())
       user_id  x  DIFF(x)
index                     
0            0  0      NaN
1            1  1      1.0
2            0  2      1.0
3            1  3      1.0
4            0  4      1.0
5            1  5      1.0

但我真正想得到的是用户的差异。也就是说,从每个用户的最后一个值开始:

       user_id  x  DIFF(x)
index                     
0            0  0      NaN
1            1  1      NaN
2            0  2      2.0
3            1  3      2.0
4            0  4      2.0
5            1  5      2.0

如何在特征工具中获得这种关系?我尝试了几个教程,但无济于事。我被难住了。

谢谢!

感谢提问。您可以通过为用户规范化实体并通过转换原语应用组来获得预期的输出。我将通过使用此数据的快速示例。

user_id  x                time
      0  0 2014-01-01 04:00:00
      1  1 2014-01-01 05:00:00
      0  2 2014-01-01 06:00:00
      1  3 2014-01-01 08:00:00
      0  4 2014-01-01 10:00:00
      1  5 2014-01-01 12:00:00

首先,创建实体集并为用户规范化实体。

es = ft.EntitySet(id='test')

es.entity_from_dataframe(
    dataframe=df,
    entity_id='data',
    make_index=True,
    index='index',
    time_index='time',
)

es.normalize_entity(
    base_entity_id='data',
    new_entity_id='users',
    index='user_id',
)

然后,在 DFS 中应用 group by transform 原语。

fm, fl = ft.dfs(
    target_entity="data",
    entityset=es,
    groupby_trans_primitives=["diff"],
)

fm.filter(regex="DIFF", axis=1)

你应该得到用户的差异。

       DIFF(x) by user_id
index
0                     NaN
1                     NaN
2                     2.0
3                     2.0
4                     2.0
5                     2.0