首页 > 解决方案 > 数据组的 Python featuretools 差异

问题描述

我正在尝试使用功能工具来计算时间序列函数。具体来说,我想通过组键(user_id)从上一个(x)中减去当前(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

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

谢谢!

标签: pythondata-sciencefeature-extractionfeature-engineeringfeaturetools

解决方案


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

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 变换原语。

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

推荐阅读