如何在特征工具中为具有相同 ID 和时间索引的行创建特征?
How do I create features in featuretools for rows with the same id and a time index?
我有一个这样的数据框
data = {'Customer':['C1', 'C1', 'C1', 'C2', 'C2', 'C2', 'C3', 'C3', 'C3'],
'NumOfItems':[3, 2, 4, 5, 5, 6, 10, 6, 14],
'PurchaseTime':["2014-01-01", "2014-01-02", "2014-01-03","2014-01-01", "2014-01-02", "2014-01-03","2014-01-01", "2014-01-02", "2014-01-03"]
}
df = pd.DataFrame(data)
df
我想创建一个特征,例如到目前为止每个客户的最大值:
'MaxPerID(NumOfItems)':[3, 3, 4, 5, 5, 6, 10, 10, 14] #the output i want
所以我设置了 EntitySet 并将其规范化......
es = ft.EntitySet(id="customer_data")
es = es.entity_from_dataframe(entity_id="customer",
dataframe=df,
index='index',
time_index="PurchaseTime",
make_index=True)
es = es.normalize_entity(base_entity_id="customer",
new_entity_id="sessions",
index="Customer")
但是创建特征矩阵并没有产生我想要的结果。
feature_matrix, features = ft.dfs(entityset=es,
target_entity="customer",
agg_primitives = ["max"],
max_depth = 3
)
feature_matrix.head
sessions.MAX(customer.NumOfItems)
index
0 4
3 6
6 14
1 4
4 6
7 14
2 4
5 6
8 14
返回的特征是 所有 客户每天的最大值(按时间排序),但是如果我 运行 相同的代码没有 time_index = "PurchaseTime"
结果是特定客户的最大值
sessions.MAX(customer.NumOfItems) \
index
0 4
1 4
2 4
3 6
4 6
5 6
6 14
7 14
8 14
我想要这两者的组合:到目前为止特定客户的最大值。
这可能吗?我尝试与 es['customer']['Customer'].interesting_values =['C1', 'C2', 'C3']
一起工作,但它并没有带我到任何地方。我还尝试修改新的规范化实体并为此编写我自己的原语。
我是 featuretools 的新手,所以非常感谢任何帮助。
感谢提问。您可以使用 group by transform primitive 获得预期的输出。
fm, fd = ft.dfs(
entityset=es,
target_entity="customer",
groupby_trans_primitives=['cum_max'],
)
您应该获得每个客户的商品数量的累计最大值。
column = 'CUM_MAX(NumOfItems) by Customer'
actual = fm[[column]].sort_values(column)
expected = {'MaxPerID(NumOfItems)': [3, 3, 4, 5, 5, 6, 10, 10, 14]}
actual.assign(**expected)
CUM_MAX(NumOfItems) by Customer MaxPerID(NumOfItems)
index
0 3.0 3
1 3.0 3
2 4.0 4
3 5.0 5
4 5.0 5
5 6.0 6
6 10.0 10
7 10.0 10
8 14.0 14
我有一个这样的数据框
data = {'Customer':['C1', 'C1', 'C1', 'C2', 'C2', 'C2', 'C3', 'C3', 'C3'],
'NumOfItems':[3, 2, 4, 5, 5, 6, 10, 6, 14],
'PurchaseTime':["2014-01-01", "2014-01-02", "2014-01-03","2014-01-01", "2014-01-02", "2014-01-03","2014-01-01", "2014-01-02", "2014-01-03"]
}
df = pd.DataFrame(data)
df
我想创建一个特征,例如到目前为止每个客户的最大值:
'MaxPerID(NumOfItems)':[3, 3, 4, 5, 5, 6, 10, 10, 14] #the output i want
所以我设置了 EntitySet 并将其规范化......
es = ft.EntitySet(id="customer_data")
es = es.entity_from_dataframe(entity_id="customer",
dataframe=df,
index='index',
time_index="PurchaseTime",
make_index=True)
es = es.normalize_entity(base_entity_id="customer",
new_entity_id="sessions",
index="Customer")
但是创建特征矩阵并没有产生我想要的结果。
feature_matrix, features = ft.dfs(entityset=es,
target_entity="customer",
agg_primitives = ["max"],
max_depth = 3
)
feature_matrix.head
sessions.MAX(customer.NumOfItems)
index
0 4
3 6
6 14
1 4
4 6
7 14
2 4
5 6
8 14
返回的特征是 所有 客户每天的最大值(按时间排序),但是如果我 运行 相同的代码没有 time_index = "PurchaseTime"
结果是特定客户的最大值
sessions.MAX(customer.NumOfItems) \
index
0 4
1 4
2 4
3 6
4 6
5 6
6 14
7 14
8 14
我想要这两者的组合:到目前为止特定客户的最大值。
这可能吗?我尝试与 es['customer']['Customer'].interesting_values =['C1', 'C2', 'C3']
一起工作,但它并没有带我到任何地方。我还尝试修改新的规范化实体并为此编写我自己的原语。
我是 featuretools 的新手,所以非常感谢任何帮助。
感谢提问。您可以使用 group by transform primitive 获得预期的输出。
fm, fd = ft.dfs(
entityset=es,
target_entity="customer",
groupby_trans_primitives=['cum_max'],
)
您应该获得每个客户的商品数量的累计最大值。
column = 'CUM_MAX(NumOfItems) by Customer'
actual = fm[[column]].sort_values(column)
expected = {'MaxPerID(NumOfItems)': [3, 3, 4, 5, 5, 6, 10, 10, 14]}
actual.assign(**expected)
CUM_MAX(NumOfItems) by Customer MaxPerID(NumOfItems)
index
0 3.0 3
1 3.0 3
2 4.0 4
3 5.0 5
4 5.0 5
5 6.0 6
6 10.0 10
7 10.0 10
8 14.0 14