FeatureTools 基本时间测量

featuretools basic aggegration on time measures

提问人:Xue 提问时间:7/26/2023 更新时间:7/27/2023 访问量:24

问:

我正在使用 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 示例后,问这么基本的事情感觉很傻。.

提取 工程 特征工具

评论


答:

1赞 Nate Parsons 7/26/2023 #1

我认为你在这里有几个问题。首先,正如您提到的,and 基元仅对数字列进行操作。如果数据基于日期时间值进行排序,则可以使用 和 聚合基元分别获取第一个和最后一个值,这些值将对应于 和 如果按升序排序。如果这些基元还不够,则需要定义自己的自定义基元MaxMinFirstLastMinMax

其次,默认情况下,Featuretools 不会将日期时间值作为要素返回。为了返回这些值,您需要在对 DFS 的调用中更改 以包含日期时间值。return_types

最后,上面的示例仅使用 .仅当 EntitySet 中存在多个数据帧时,才会应用 Featuretools 聚合。聚合是在定义的关系中执行的。若要为客户定义功能,应以客户表为目标,然后聚合其他表(例如购买)中的值,以获得 或 等功能。EntitySetMAX(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"FirstLastprimitive_options