提问人:Xue 提问时间:7/26/2023 更新时间:7/27/2023 访问量:24
FeatureTools 基本时间测量
featuretools basic aggegration on time measures
问:
我正在使用 featuretools(1.1x 版本),我阅读了文档,也在这里搜索
但仍然很难找到如何做一些简单的事情,比如 SELECT MIN(datetime_field_1)。
我还检查了list_primitives()那些与时间相关的似乎不是我需要的,
我可以对数字字段执行此操作,但似乎无法在日期时间字段上执行此操作。.
https://featuretools.alteryx.com/en/stable/
我只是想按customer_id获取 min(timestamp)、max(timestamp) 组,但 max/min 原语仅适用于数字
import featuretools as ft
import pandas as pd
import numpy as np
# make some random data
n = 100
events_df = pd.DataFrame({
"id" : range(n),
"customer_id": np.random.choice(["a", "b", "c"], n),
"timestamp": pd.date_range("Jan 1, 2019", freq="1h", periods=n),
"amount": np.random.rand(n) * 100
})
def to_part_of_day(x):
if x < 12:
return "morning"
elif x < 18:
return "afternoon"
else:
return "evening"
es = ft.EntitySet(id='my_set')
es = es.add_dataframe(dataframe = events_df, dataframe_name = 'events', time_index='timestamp', index='index')
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name='events',
agg_primitives=['min','max'],
trans_primitive=[],
primitive_options={
'max':{
"include_groupby_columns":{"events":["customer_id"]}
}
}
)
我应该如何按每个customer_id获取 max(amount)、max(timestamp)?谢谢!在阅读了 featuretools.alteryx.com 和他们的 github 示例后,问这么基本的事情感觉很傻。.
答:
我认为你在这里有几个问题。首先,正如您提到的,and 基元仅对数字列进行操作。如果数据基于日期时间值进行排序,则可以使用 和 聚合基元分别获取第一个和最后一个值,这些值将对应于 和 如果按升序排序。如果这些基元还不够,则需要定义自己的自定义基元。Max
Min
First
Last
Min
Max
其次,默认情况下,Featuretools 不会将日期时间值作为要素返回。为了返回这些值,您需要在对 DFS 的调用中更改 以包含日期时间值。return_types
最后,上面的示例仅使用 .仅当 EntitySet 中存在多个数据帧时,才会应用 Featuretools 聚合。聚合是在定义的关系中执行的。若要为客户定义功能,应以客户表为目标,然后聚合其他表(例如购买)中的值,以获得 或 等功能。EntitySet
MAX(purchases.amount)
FIRST(purchases.date)
下面是一个基于起始数据构建的完整示例:
import featuretools as ft
import pandas as pd
import numpy as np
# make some random data
n = 100
purchases_df = pd.DataFrame({
"id" : range(n),
"customer_id": np.random.choice(["a", "b", "c"], n),
"date": pd.date_range("Jan 1, 2019", freq="1h", periods=n),
"amount": np.random.rand(n) * 100
})
customers_df = pd.DataFrame({
"id": ["a", "b", "c"],
})
es = ft.EntitySet()
es = es.add_dataframe(dataframe=purchases_df, dataframe_name="purchases", time_index="date", index="id")
es = es.add_dataframe(dataframe=customers_df, dataframe_name="customers", index="id")
es.add_relationship("customers", "id", "purchases", "customer_id")
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name='customers',
agg_primitives=["min", "max", "first", "last"],
trans_primitives=["month"],
return_types="all")
FIRST(purchases.amount) FIRST(purchases.date) FIRST(purchases.id) LAST(purchases.amount) LAST(purchases.date) ... MIN(purchases.amount) FIRST(purchases.MONTH(date)) LAST(purchases.MONTH(date)) MONTH(FIRST(purchases.date)) MONTH(LAST(purchases.date))
id ...
a 10.858168 2019-01-01 01:00:00 1 77.302337 2019-01-05 03:00:00 ... 2.639971 1 1 1 1
b 43.035418 2019-01-01 03:00:00 3 63.446195 2019-01-04 23:00:00 ... 3.790079 1 1 1 1
c 29.234700 2019-01-01 00:00:00 0 78.434346 2019-01-05 01:00:00 ... 1.088463 1 1 1 1
如果只想返回某些列类型,则可以将类型列表传递给 而不是 。此外,如果只想应用于日期时间列,则可以通过在对 DFS 的调用中将适当的值传递给 来执行此操作。该文档包含有关如何执行此操作的信息。return_types
"all"
First
Last
primitive_options
评论