Python featuretools按数据组划分的差异

2024-09-28 23:53:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用featuretools来计算时间序列函数。具体来说,我想用组键(user_id)从前面的(x)中减去当前(x),但在entityset中添加这种关系时遇到了麻烦

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

如何在featuretools中获得这种关系?我试过几个教程,但都没用。我被难住了

谢谢


Tags: toiddfindexestime关系nan
1条回答
网友
1楼 · 发布于 2024-09-28 23:53:35

谢谢你的提问。通过为用户规范化实体并应用group by transform原语,可以获得预期的输出。我将使用这些数据快速浏览一个示例

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

相关问题 更多 >