featuretools cutoff_time 无法正常工作
featuretools cutoff_time does not work properly
我尝试将 cutoff_time 数据框添加到 featuretool 的 dfs 函数中,这样我的数据框中的每一行都会有一个特定的截止点 time.But 我无法使 cutoff_time 数据框作为预计
文档说 cutoff_time 的第一列应该是 'instance_id'。我不确定那是什么意思..我尝试了目标实体(交易)的索引和customer_id(id) 来自目标实体(交易)。他们两个都会搞砸 feature_matrix
merkle_fake = pd.DataFrame()
transaction_fake['order_date'] = ['2019-01-01','2018-01-01','2017-01-01','2018-05-23','2019-02-02','2018-12-21']
transaction_fake['product_category'] = ['cat2','cat3','cat2','cat1','cat2','cat2']
transaction_fake['id'] = ['1','2','1','3','1','2']
transaction_fake['order_date'] = pd.to_datetime(transaction_fake['order_date'])
transaction_fake['index'] = transaction_fake.index.tolist()
merkle_fake['cust_id'] = ['1','2','3']
es_demo = ft.EntitySet(id = 'demo')
es_demo.entity_from_dataframe(entity_id='transaction', dataframe= transaction_fake,time_index = 'order_date',index = 'index')
es_demo.entity_from_dataframe(entity_id='merkle', dataframe= merkle_fake,index = 'cust_id')
relationship_fake = ft.Relationship(es_demo["merkle"]["cust_id"],es_demo["transaction"]["id"])
es_demo = es_demo.add_relationship(relationship_fake)
cutoff_times_demo = pd.DataFrame()
cutoff_times_demo['instance_id'] = es_demo['transaction'].df['id']
cutoff_times_demo['time'] = es_demo['transaction'].df['order_date']
feature_matrix_demo, feature_defs_demo = ft.dfs(entityset=es_demo,
agg_primitives=['count'],
trans_primitives=[],
target_entity='transaction',
cutoff_time= cutoff_times_demo,
features_only = False)
feature_matrix_demo
我希望输出是这样的:
product_category id merkle.COUNT(transaction)
2 cat2 1 1
1 cat3 2 1
3 cat1 3 1
5 cat2 2 2
0 cat2 1 2
4 cat2 1 3
但它给了我:
product_category id merkle.COUNT(transaction)
index
1 NaN NaN 0
2 cat2 1 1
3 cat1 3 1
2 cat2 1 1
1 cat3 2 2
1 cat3 2 2
当您为 cutoff_time 传入带有“instance_id”和“时间”列的 DataFrame 时,dfs 将计算每个实例,由其“instance_id”标识,最多并包括相应的“时间”。 “instance_id”标识目标实体中的行。
因此,当您为 cutoff_times_demo['instance_id']
传入 es_demo['transaction'].df['id']
时,您是在告诉 dfs()
在“2017-01-01”计算第 1 行,在“2018-”计算第 2 行01-01','2018-05-23' 的第 3 行,'2018-12-21' 的第 2 行等。这会为返回的 feature_matrix 中的第一行生成一个 NaN 值,因为没有2017-01-01 之前和之前第 1 行的数据。
要获得预期的输出,请将 instance_id 列的设置更改为:
cutoff_times_demo['instance_id'] = es_demo['transaction'].df['index']
我尝试将 cutoff_time 数据框添加到 featuretool 的 dfs 函数中,这样我的数据框中的每一行都会有一个特定的截止点 time.But 我无法使 cutoff_time 数据框作为预计
文档说 cutoff_time 的第一列应该是 'instance_id'。我不确定那是什么意思..我尝试了目标实体(交易)的索引和customer_id(id) 来自目标实体(交易)。他们两个都会搞砸 feature_matrix
merkle_fake = pd.DataFrame()
transaction_fake['order_date'] = ['2019-01-01','2018-01-01','2017-01-01','2018-05-23','2019-02-02','2018-12-21']
transaction_fake['product_category'] = ['cat2','cat3','cat2','cat1','cat2','cat2']
transaction_fake['id'] = ['1','2','1','3','1','2']
transaction_fake['order_date'] = pd.to_datetime(transaction_fake['order_date'])
transaction_fake['index'] = transaction_fake.index.tolist()
merkle_fake['cust_id'] = ['1','2','3']
es_demo = ft.EntitySet(id = 'demo')
es_demo.entity_from_dataframe(entity_id='transaction', dataframe= transaction_fake,time_index = 'order_date',index = 'index')
es_demo.entity_from_dataframe(entity_id='merkle', dataframe= merkle_fake,index = 'cust_id')
relationship_fake = ft.Relationship(es_demo["merkle"]["cust_id"],es_demo["transaction"]["id"])
es_demo = es_demo.add_relationship(relationship_fake)
cutoff_times_demo = pd.DataFrame()
cutoff_times_demo['instance_id'] = es_demo['transaction'].df['id']
cutoff_times_demo['time'] = es_demo['transaction'].df['order_date']
feature_matrix_demo, feature_defs_demo = ft.dfs(entityset=es_demo,
agg_primitives=['count'],
trans_primitives=[],
target_entity='transaction',
cutoff_time= cutoff_times_demo,
features_only = False)
feature_matrix_demo
我希望输出是这样的:
product_category id merkle.COUNT(transaction)
2 cat2 1 1
1 cat3 2 1
3 cat1 3 1
5 cat2 2 2
0 cat2 1 2
4 cat2 1 3
但它给了我:
product_category id merkle.COUNT(transaction)
index
1 NaN NaN 0
2 cat2 1 1
3 cat1 3 1
2 cat2 1 1
1 cat3 2 2
1 cat3 2 2
当您为 cutoff_time 传入带有“instance_id”和“时间”列的 DataFrame 时,dfs 将计算每个实例,由其“instance_id”标识,最多并包括相应的“时间”。 “instance_id”标识目标实体中的行。
因此,当您为 cutoff_times_demo['instance_id']
传入 es_demo['transaction'].df['id']
时,您是在告诉 dfs()
在“2017-01-01”计算第 1 行,在“2018-”计算第 2 行01-01','2018-05-23' 的第 3 行,'2018-12-21' 的第 2 行等。这会为返回的 feature_matrix 中的第一行生成一个 NaN 值,因为没有2017-01-01 之前和之前第 1 行的数据。
要获得预期的输出,请将 instance_id 列的设置更改为:
cutoff_times_demo['instance_id'] = es_demo['transaction'].df['index']