Migration to Featuretools Version 1.0#

Featuretools version 1.0 contains many significant changes that affect how EntitySets are created, how primitives are defined, and the feature matrices that are created in some cases. This document will outline these major changes to help existing Featuretools users transition to version 1.0.

Background and Introduction#

Why were these changes made?#

The lack of a unified type system across libraries has made it more difficult to share information between them. This issue led to the development of Woodwork. Updating Featuretools to use Woodwork for managing column type information allows for easy sharing of feature matrix column type information with other libraries without the need for expensive conversions of custom type systems. For example, EvalML has also adopted Woodwork, allowing it to directly use Woodwork type information on feature matrices to create machine learning models without first inferring or redefining column types. Other benefits of using Woodwork to manage types in Featuretools include: - Simplified code - Custom type management code has been removed. - Seamless integration of new types and improvements in type integration as Woodwork evolves. - Easily and flexibly store additional information about columns. For instance, we can now store whether a feature was engineered by Featuretools or existed in the original data.

有哪些变化?#

  • Featuretools的传统自定义类型系统已被Woodwork取代,用于管理列类型

  • Featuretools中的EntityVariable类均已移除

  • 几个关键的Featuretools方法已被移动或更新

传统类型系统与Woodwork类型系统的比较#

Featuretools < 1.0

Featuretools 1.0

描述

Entity

Woodwork DataFrame

存储所有列的类型信息

Variable

ColumnSchema

存储单个列的类型信息

Variable子类

LogicalType和semantic_tags

用于定义列类型的元素

重要方法变化摘要#

下表概述了发生的最重要变化。总结:在某些情况下,方法参数也发生了变化,这些变化将在本文档中更详细地说明。

旧版本

Featuretools 1.0

EntitySet.entity_from_dataframe

EntitySet.add_dataframe

EntitySet.normalize_entity

EntitySet.normalize_dataframe

EntitySet.update_data

EntitySet.replace_dataframe

Entity.variable_types

es[‘dataframe_name’].ww

es[‘entity_id’][‘variable_name’]

es[‘dataframe_name’].ww.columns[‘column_name’]

Entity.convert_variable_type

es[‘dataframe_name’].ww.set_types

Entity.add_interesting_values

es.add_interesting_values(dataframe_name=‘df_name’, …)

Entity.set_secondary_time_index

es.set_secondary_time_index(dataframe_name=‘df_name’, …)

Feature(es[‘entity_id’][‘variable_name’])

Feature(es[‘dataframe_name’].ww[‘column_name’])

dfs(target_entity=‘entity_id’, …)

dfs(target_dataframe_name=‘dataframe_name’, …)

有关Woodwork如何管理类型信息的更多信息,请参考Woodwork 理解类型和标签指南。

这些变化对用户意味着什么?删除这些类需要将几个方法从Entity移动到EntitySet对象中。这个变化也影响了关系、特征和基元的定义方式,需要不同于以前所需的参数。另外,由于Woodwork类型系统与旧的Featuretools类型系统不完全相同,因此在某些情况下,返回的特征矩阵可能会略有不同,因为列被识别为不同的类型。所有这些变化以及更多内容将在本文档中详细审查,尽可能提供旧API和新API的示例。#

删除Entity类并更新EntitySet#

在Featuretools的先前版本中,通过添加多个实体然后定义不同实体中变量(列)之间的关系来创建EntitySet。从Featuretools 1.0版本开始,EntitySets现在是通过添加多个数据框并定义数据框中列之间的关系来创建的。虽然在概念上类似,但在过程中有一些细微的差异。

向EntitySet添加数据框#

当向EntitySet添加数据框时,用户可以传入一个带有Woodwork数据框或不带Woodwork类型信息的常规数据框。如果用户提供了一个带有初始化的Woodwork类型信息的数据框,Featuretools将直接使用这些类型信息。如果用户提供了一个没有初始化Woodwork的数据框,Featuretools将在数据框上初始化Woodwork,对于任何未指定类型信息的列执行类型推断。以下是一些示例来说明这个过程。首先,我们将创建两个小数据框用于示例。

[1]:
import pandas as pd


import featuretools as ft

2024-10-11 14:50:34,909 featuretools - WARNING    While loading primitives via "premium_primitives" entry point, ignored primitive "DiversityScore" from "premium_primitives.diversity_score" because a primitive with that name already exists in "nlp_primitives.diversity_score"
2024-10-11 14:50:34,909 featuretools - WARNING    While loading primitives via "premium_primitives" entry point, ignored primitive "LSA" from "premium_primitives.lsa" because a primitive with that name already exists in "nlp_primitives.lsa"
2024-10-11 14:50:34,909 featuretools - WARNING    While loading primitives via "premium_primitives" entry point, ignored primitive "MeanCharactersPerSentence" from "premium_primitives.mean_characters_per_sentence" because a primitive with that name already exists in "nlp_primitives.mean_characters_per_sentence"
2024-10-11 14:50:34,909 featuretools - WARNING    While loading primitives via "premium_primitives" entry point, ignored primitive "NumberOfSentences" from "premium_primitives.number_of_sentences" because a primitive with that name already exists in "nlp_primitives.number_of_sentences"
2024-10-11 14:50:34,910 featuretools - WARNING    While loading primitives via "premium_primitives" entry point, ignored primitive "PartOfSpeechCount" from "premium_primitives.part_of_speech_count" because a primitive with that name already exists in "nlp_primitives.part_of_speech_count"
2024-10-11 14:50:34,910 featuretools - WARNING    While loading primitives via "premium_primitives" entry point, ignored primitive "PolarityScore" from "premium_primitives.polarity_score" because a primitive with that name already exists in "nlp_primitives.polarity_score"
2024-10-11 14:50:34,910 featuretools - WARNING    While loading primitives via "premium_primitives" entry point, ignored primitive "StopwordCount" from "premium_primitives.stopword_count" because a primitive with that name already exists in "nlp_primitives.stopword_count"
2024-10-11 14:50:34,928 featuretools - WARNING    Featuretools failed to load plugin tsfresh from library featuretools_tsfresh_primitives.__init__. For a full stack trace, set logging to debug.
[2]:
orders_df = pd.DataFrame(
    {"order_id": [0, 1, 2], "order_date": ["2021-01-02", "2021-01-03", "2021-01-04"]}
)
items_df = pd.DataFrame(
    {
        "id": [0, 1, 2, 3, 4],
        "order_id": [0, 1, 1, 2, 2],
        "item_price": [29.95, 4.99, 10.25, 20.50, 15.99],
        "on_sale": [False, True, False, True, False],
    }
)

在较旧版本的Featuretools中,用户首先会创建一个EntitySet对象,然后通过调用entity_from_dataframe方法将数据框添加到EntitySet中,如下所示。

es = ft.EntitySet('old_es')
es.entity_from_dataframe(dataframe=orders_df,
                         entity_id='orders',
                         index='order_id',
                         time_index='order_date')
es.entity_from_dataframe(dataframe=items_df,
                         entity_id='items',
                         index='id')
Entityset: old_es
Entities:
  orders [行数: 3, 列数: 2]
  items [行数: 5, 列数: 3]
Relationships:
  无关系

使用Featuretools 1.0,向EntitySet添加数据框的步骤与以前相同,但一些细节已经更改。首先,像以前一样创建一个EntitySet。要添加数据框,请调用EntitySet.add_dataframe,而不是以前的EntitySet.entity_from_dataframe调用。请注意,数据框的名称是在dataframe_name参数中指定的,该参数以前称为entity_id

[3]:
es = ft.EntitySet("new_es")

es.add_dataframe(
    dataframe=orders_df,
    dataframe_name="orders",
    index="order_id",
    time_index="order_date",
)

[3]:
Entityset: new_es
  DataFrames:
    orders [Rows: 3, Columns: 2]
  Relationships:
    No relationships

您还可以通过首先在数据框上初始化Woodwork,然后将初始化的Woodwork数据框直接传递给add_dataframe调用来定义名称、索引和时间索引。在此示例中,我们将在items_df上初始化Woodwork,将数据框名称设置为items,并指定索引应为id列。

[4]:
items_df.ww.init(name="items", index="id")
items_df.ww

[4]:
Physical Type Logical Type Semantic Tag(s)
Column
id int64 Integer ['index']
order_id int64 Integer ['numeric']
item_price float64 Double ['numeric']
on_sale bool Boolean []

在Woodwork初始化后,当调用add_dataframe时,我们不再需要为dataframe_nameindex参数指定值,因为Featuretools将简单地使用在初始化Woodwork时已经指定的值。

[5]:
es.add_dataframe(dataframe=items_df)

[5]:
Entityset: new_es
  DataFrames:
    orders [Rows: 3, Columns: 2]
    items [Rows: 5, Columns: 4]
  Relationships:
    No relationships

访问列类型信息以前,可以通过Entity.variable_types来访问整个实体的列变量类型信息,或者通过首先通过es['entity_id']['col_id']选择单个列来访问单个列的信息。pythones['items'].variable_types``````{'id': featuretools.variable_types.variable.Index, 'order_id': featuretools.variable_types.variable.Numeric, 'item_price': featuretools.variable_types.variable.Numeric}``````pythones['items']['item_price']``````<Variable: item_price (dtype = numeric)>通过更新后的Featuretools版本,可以通过数据框的.ww命名空间查看单个数据框中所有列的逻辑类型和语义标签。首先,通过es['dataframe_name']选择实体集中的数据框,然后通过在末尾链接.ww调用来访问类型信息,如下所示。#

[6]:
es["items"].ww

[6]:
Physical Type Logical Type Semantic Tag(s)
Column
id int64 Integer ['index']
order_id int64 Integer ['numeric']
item_price float64 Double ['numeric']
on_sale bool Boolean []

可以从存储在数据框上的Woodwork列字典中获取单个列的逻辑类型和语义标签,返回一个存储类型信息的Woodwork.ColumnSchema对象:

[7]:
es["items"].ww.columns["item_price"]

[7]:
<ColumnSchema (Logical Type = Double) (Semantic Tags = ['numeric'])>

类型推断和更新列类型#

Featuretools将尝试为用户未定义类型的任何列推断类型。在版本1.0之前,Featuretools实现了自定义类型推断代码,以确定应将哪种变量类型分配给每个列。您可以通过查看Entity.variable_types字典的内容来查看推断的变量类型。从Featuretools 1.0开始,列类型推断由Woodwork处理。当向EntitySet添加数据框时,如果用户未分配逻辑类型,则Woodwork将推断出这些列的逻辑类型。与以前一样,可以通过在调用EntitySet.add_dataframe时传递适当的逻辑类型字典来跳过数据框中的任何列的类型推断。例如,我们可以创建一个新数据框并将其添加到EntitySet,指定用户的全名的逻辑类型为Woodwork的PersonFullName逻辑类型。

[8]:
users_df = pd.DataFrame(
    {"id": [0, 1, 2], "name": ["John Doe", "Rita Book", "Teri Dactyl"]}
)

[9]:
es.add_dataframe(
    dataframe=users_df,
    dataframe_name="users",
    index="id",
    logical_types={"name": "PersonFullName"},
)

es["users"].ww

[9]:
Physical Type Logical Type Semantic Tag(s)
Column
id int64 Integer ['index']
name string PersonFullName []

从上面的类型信息中,我们可以看到name列的逻辑类型被设置为PersonFullName,就像我们指定的那样。会出现一些情况,类型推断会将某列识别为错误的逻辑类型。在这些情况下,可以使用Woodwork的set_types方法来更新逻辑类型。假设我们希望orders数据框的order_id列具有Categorical逻辑类型,而不是推断出的Integer类型。以前,可以通过Entity.convert_variable_type方法来实现这一点。

from featuretools.variable_types import Categorical

es['items'].convert_variable_type(variable_id='order_id', new_type=Categorical)

现在,我们可以使用Woodwork执行相同的更新:

[10]:
es["items"].ww.set_types(logical_types={"order_id": "Categorical"})
es["items"].ww

[10]:
Physical Type Logical Type Semantic Tag(s)
Column
id int64 Integer ['index']
order_id category Categorical ['category']
item_price float64 Double ['numeric']
on_sale bool Boolean []

有关Woodwork类型及其在Featuretools中的使用的更多信息,请参考Featuretools中的Woodwork类型

添加有趣的值#

有趣的值可以添加到EntitySet中的所有数据框,EntitySet中的单个数据框,或EntitySet中数据框的单个列中。要为EntitySet中的所有数据框添加有趣的值,只需调用EntitySet.add_interesting_values,可选择指定要为每列添加的最大值数量。这与Featuretools的旧版本到1.0版本的发布没有变化。

添加单个数据框或单个列的值已更改。以前,要为Entity添加有趣的值,用户会调用Entity.add_interesting_values()

es['items'].add_interesting_values()

现在,为了指定单个数据框的有趣值,您需要在EntitySet上调用add_interesting_values,并传递要添加有趣值的数据框的名称:

[11]:
es.add_interesting_values(dataframe_name="items")

以前,要手动为列添加感兴趣的值,只需将它们分配给变量的属性:python es['items']['order_id'].interesting_values = [1, 2] 现在,可以通过EntitySet.add_interesting_values来实现,传入数据框的名称和将列名映射到要为该列分配的感兴趣的值的字典。例如,要将items数据框的order_id列的感兴趣值[1, 2]分配给它,可以使用以下方法:

[12]:
es.add_interesting_values(dataframe_name="items", values={"order_id": [1, 2]})

可以通过向传递给values参数的字典添加更多条目,为同一数据框中的多个列分配有趣的值。访问有趣的值也发生了变化。以前,可以从变量中查看有趣的值:pythones['items']['order_id'].interesting_values有趣的值现在存储在数据框中列的Woodwork元数据中:

[13]:
es["items"].ww.columns["order_id"].metadata["interesting_values"]

[13]:
[1, 2]

设置次要时间索引#

在Featuretools的早期版本中,可以通过调用 Entity.set_secondary_time_index 在实体上设置次要时间索引。

es_flight = ft.demo.load_flight(nrows=100)
arr_time_columns = ['arr_delay', 'dep_delay', 'carrier_delay', 'weather_delay',
                    'national_airspace_delay', 'security_delay',
                    'late_aircraft_delay', 'canceled', 'diverted',
                    'taxi_in', 'taxi_out', 'air_time', 'dep_time']
es_flight['trip_logs'].set_secondary_time_index({'arr_time': arr_time_columns})

由于Featuretools 1.0中已经移除了 Entity 类,现在需要通过 EntitySet 来完成这个操作:

[14]:
es_flight = ft.demo.load_flight(nrows=100)

arr_time_columns = [
    "arr_delay",
    "dep_delay",
    "carrier_delay",
    "weather_delay",
    "national_airspace_delay",
    "security_delay",
    "late_aircraft_delay",
    "canceled",
    "diverted",
    "taxi_in",
    "taxi_out",
    "air_time",
    "dep_time",
]
es_flight.set_secondary_time_index(
    dataframe_name="trip_logs", secondary_time_index={"arr_time": arr_time_columns}
)

Downloading data ...
/Users/code/fin_tool/github/featuretools/featuretools/demo/flight.py:288: PerformanceWarning: Adding/subtracting object-dtype array to TimedeltaArray not vectorized.
  clean_data.loc[:, "dep_time"] = clean_data["scheduled_dep_time"] + pd.to_timedelta(
/Users/code/fin_tool/github/featuretools/featuretools/demo/flight.py:293: PerformanceWarning: Adding/subtracting object-dtype array to TimedeltaArray not vectorized.
  clean_data.loc[:, "arr_time"] = clean_data["dep_time"] + pd.to_timedelta(
/Users/code/fin_tool/github/featuretools/featuretools/demo/flight.py:299: PerformanceWarning: Adding/subtracting object-dtype array to TimedeltaArray not vectorized.
  clean_data["scheduled_dep_time"] + clean_data["scheduled_elapsed_time"]
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/logical_types.py:897: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  series = series.replace(ww.config.get_option("nan_values"), np.nan)
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/logical_types.py:897: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  series = series.replace(ww.config.get_option("nan_values"), np.nan)
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/type_sys/utils.py:40: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/logical_types.py:897: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  series = series.replace(ww.config.get_option("nan_values"), np.nan)
/Users/code/fin_tool/github/featuretools/venv/lib/python3.11/site-packages/woodwork/logical_types.py:897: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  series = series.replace(ww.config.get_option("nan_values"), np.nan)

以前,可以直接从实体中访问二级时间索引,方法是 es_flight['trip_logs'].secondary_time_index。从Featuretools 1.0开始,二级时间索引及其关联的列存储在Woodwork数据框的元数据中,可以按如下所示访问。

[15]:
es_flight["trip_logs"].ww.metadata["secondary_time_index"]

[15]:
{'arr_time': ['arr_delay',
  'dep_delay',
  'carrier_delay',
  'weather_delay',
  'national_airspace_delay',
  'security_delay',
  'late_aircraft_delay',
  'canceled',
  'diverted',
  'taxi_in',
  'taxi_out',
  'air_time',
  'dep_time',
  'arr_time']}

实体/数据框的规范化#

在Featuretools 1.0中,EntitySet.normalize_entity已经更名为EntitySet.normalize_dataframe。新方法的工作方式与旧方法相同,但是一些参数已更名。下表显示了旧名称和新名称以供参考。调用此方法时,需要使用新的参数名称。

旧参数名称

新参数名称

base_entity_id

base_dataframe_name

new_entity_id

new_dataframe_name

additional_variables

additional_columns

copy_variables

copy_columns

new_entity_time_index

new_dataframe_time_index

new_entity_secondary_time_index

new_dataframe_secondary_time_index

定义和添加关系#

在Featuretools的早期版本中,关系是通过创建一个Relationship对象来定义的,该对象接受两个Variables作为输入。要定义订单实体和商品实体之间的关系,我们首先会创建一个Relationship,然后将其添加到EntitySet中:

relationship = ft.Relationship(es['orders']['order_id'], es['items']['order_id'])
es.add_relationship(relationship)

在Featuretools 1.0中,这个过程类似,但是有两种不同的方法可以将关系添加到EntitySet中。一种方法是将数据框和列名传递给EntitySet.add_relationship,另一种方法是将先前创建的Relationship对象传递给relationship关键字参数。下面演示了这两种方法。

[16]:
# 撤消上述更改,并将子列的逻辑类型更改为与父列匹配,以防止警告# 注意:此单元格在文档构建中被隐藏es["items"].ww.set_types(logical_types={"order_id": "Integer"})

[17]:
es.add_relationship(
    parent_dataframe_name="orders",
    parent_column_name="order_id",
    child_dataframe_name="items",
    child_column_name="order_id",
)

/Users/code/fin_tool/github/featuretools/featuretools/entityset/entityset.py:383: UserWarning: Logical type Categorical for child column order_id does not match parent column order_id logical type Integer. Changing child logical type to match parent.
  warnings.warn(
[17]:
Entityset: new_es
  DataFrames:
    orders [Rows: 3, Columns: 2]
    items [Rows: 5, Columns: 4]
    users [Rows: 3, Columns: 2]
  Relationships:
    items.order_id -> orders.order_id
[18]:
# 重置关系,以便我们可以再次添加它
es.relationships = []

另一种方法是首先创建一个Relationship,然后将其传递给EntitySet.add_relationship。在定义Relationship时,我们需要传入它所属的EntitySet以及父数据框和父列的名称,以及子数据框和子列的名称。

[19]:
relationship = ft.Relationship(
    entityset=es,
    parent_dataframe_name="orders",
    parent_column_name="order_id",
    child_dataframe_name="items",
    child_column_name="order_id",
)
es.add_relationship(relationship=relationship)

[19]:
Entityset: new_es
  DataFrames:
    orders [Rows: 3, Columns: 2]
    items [Rows: 5, Columns: 4]
    users [Rows: 3, Columns: 2]
  Relationships:
    items.order_id -> orders.order_id

更新实体集中数据框的数据以前,要更新(替换)与实体关联的数据,用户可以调用Entity.update_data并传入新的数据框。例如,让我们更新我们的users实体中的数据:#

new_users_df = pd.DataFrame({
    'id': [3, 4],
    'name': ['Anne Teak', 'Art Decco']
})
es['users'].update_data(df=new_users_df)

为了在Featuretools 1.0中完成这个任务,我们将使用EntitySet.replace_dataframe方法:

[20]:
new_users_df = pd.DataFrame({"id": [0, 1], "name": ["Anne Teak", "Art Decco"]})

es.replace_dataframe(dataframe_name="users", df=new_users_df)
es["users"]

[20]:
id name
0 0 Anne Teak
1 1 Art Decco

定义特征#

在Featuretools 1.0中,定义特征的语法略有变化。以前,可以通过传入应该用于构建特征的变量来定义身份特征。

feature = ft.Feature(es['items']['item_price'])

从Featuretools 1.0开始,可以使用类似的语法,但是因为 es['items'] 现在将返回一个Woodwork数据框而不是一个 Entity,我们需要稍微更新语法以访问Woodwork列。要进行更新,只需在数据框名称选择器和列选择器之间添加 .ww,如下所示。

[21]:
feature = ft.Feature(es["items"].ww["item_price"])

定义基元#

在Featuretools的早期版本中,基元的输入和返回类型是通过指定适当的Variable类来定义的。从1.0版本开始,输入和返回类型是通过Woodwork ColumnSchema对象来定义的。为了说明这一变化,让我们更仔细地看一下Age转换基元。这个基元接受代表出生日期的日期时间,并返回对应于一个人年龄的数值。在Featuretools的先前版本中,输入类型是通过指定DateOfBirth变量类型来定义的,返回类型是通过指定Numeric变量类型来指定:

input_types = [DateOfBirth]
return_type = Numeric

Woodwork没有特定的DateOfBirth逻辑类型,而是通过将逻辑类型指定为Datetime并使用语义标签date_of_birth来标识列作为出生日期列。Woodwork中也没有Numeric逻辑类型,而是通过使用语义标签numeric来标识所有可以用于数值操作的列。此外,我们知道Age基元将返回一个浮点数,这对应于Woodwork的逻辑类型Double。有了这些信息,我们可以使用ColumnSchema对象重新定义Age的输入类型和返回类型如下:

input_types = [ColumnSchema(logical_type=Datetime, semantic_tags={'date_of_birth'})]
return_type = ColumnSchema(logical_type=Double, semantic_tags={'numeric'})

除了改变输入和返回类型的定义方式外,定义基元的其余过程保持不变。

从旧Featuretools变量类型到Woodwork ColumnSchemas的映射#

Woodwork定义的类型与Featuretools 1.0版本之前定义的旧变量类型不同。虽然旧变量类型与ColumnSchema对象定义的新Woodwork类型之间没有直接映射,但下表显示了近似的映射。

Featuretools变量

Woodwork Column Schema

布尔型

ColumnSchema(logical_type=Boolean) 或 ColumnSchema(logical_type=BooleanNullable)

分类

ColumnSchema(logical_type=Categorical)

国家代码

ColumnSchema(logical_type=CountryCode)

日期时间

ColumnSchema(logical_type=Datetime)

出生日期

ColumnSchema(logical_type=Datetime, semantic_tags={‘date_of_birth’})

日期时间索引

ColumnSchema(logical_type=Datetime, semantic_tags={‘time_index’})

离散型

ColumnSchema(semantic_tags={‘category’})

电子邮件地址

ColumnSchema(logical_type=EmailAddress)

文件路径

ColumnSchema(logical_type=Filepath)

全名

ColumnSchema(logical_type=PersonFullName)

ID

ColumnSchema(semantic_tags={‘foreign_key’})

索引

ColumnSchema(semantic_tags={‘index’})

IP地址

ColumnSchema(logical_type=IPAddress)

纬度经度

ColumnSchema(logical_type=LatLong)

自然语言

ColumnSchema(logical_type=NaturalLanguage)

数值型

ColumnSchema(semantic_tags={‘numeric’})

数值型时间索引

ColumnSchema(semantic_tags={‘numeric’, ‘time_index’})

顺序型

ColumnSchema(logical_type=Ordinal)

电话号码

ColumnSchema(logical_type=PhoneNumber)

子区域代码

ColumnSchema(logical_type=SubRegionCode)

时间间隔

ColumnSchema(logical_type=Timedelta)

时间索引

ColumnSchema(semantic_tags={‘time_index’})

URL

ColumnSchema(logical_type=URL)

未知

ColumnSchema(logical_type=Unknown)

邮政编码

ColumnSchema(logical_type=PostalCode)

更改Deep Feature Synthesis#

在Featuretools 1.0中,featuretools.dfsfeaturetools.calculate_feature_matrix的参数名称略有更改。在之前的版本中,用户可以使用默认的基元和选项生成特征列表,如下所示:

features = ft.dfs(entityset=es,
                  target_entity='items',
                  features_only=True)

在Featuretools 1.0中,target_entity参数已更名为target_dataframe_name,但除此之外,此基本调用保持不变。

[22]:
features = ft.dfs(entityset=es, target_dataframe_name="items", features_only=True)
features

[22]:
[<Feature: order_id>,
 <Feature: item_price>,
 <Feature: on_sale>,
 <Feature: orders.COUNT(items)>,
 <Feature: orders.MAX(items.item_price)>,
 <Feature: orders.MEAN(items.item_price)>,
 <Feature: orders.MIN(items.item_price)>,
 <Feature: orders.PERCENT_TRUE(items.on_sale)>,
 <Feature: orders.SKEW(items.item_price)>,
 <Feature: orders.STD(items.item_price)>,
 <Feature: orders.SUM(items.item_price)>,
 <Feature: orders.DAY(order_date)>,
 <Feature: orders.MONTH(order_date)>,
 <Feature: orders.WEEKDAY(order_date)>,
 <Feature: orders.YEAR(order_date)>]

此外,dfs 参数中的 ignore_entities 已更名为 ignore_dataframesignore_variables 已更名为 ignore_columns。类似地,如果指定原始选项,则应将所有对 entities 的引用替换为 dataframes,将对 variables 的引用替换为 columns。例如,include_groupby_entities 的原始选项现在是 include_groupby_dataframesinclude_variables 现在是 include_columns。如果传入一个 EntitySet 以及要计算的特征列表,那么对 featuretools.calculate_feature_matrix 的基本调用保持不变。然而,通过传入一个 entitiesrelationships 列表来调用 calculate_feature_matrix 的用户应注意,entities 参数已更名为 dataframes,字典值现在应包含 Woodwork 逻辑类型,而不是 Featuretools 的 Variable 类。

[23]:
feature_matrix = ft.calculate_feature_matrix(features=features, entityset=es)
feature_matrix

/Users/code/fin_tool/github/featuretools/featuretools/computational_backends/feature_set_calculator.py:756: FutureWarning: The provided callable <function min at 0x1056a5260> is currently using SeriesGroupBy.min. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "min" instead.
  ).agg(to_agg)
/Users/code/fin_tool/github/featuretools/featuretools/computational_backends/feature_set_calculator.py:756: FutureWarning: The provided callable <function mean at 0x1056a5b20> is currently using SeriesGroupBy.mean. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "mean" instead.
  ).agg(to_agg)
/Users/code/fin_tool/github/featuretools/featuretools/computational_backends/feature_set_calculator.py:756: FutureWarning: The provided callable <function max at 0x1056a5120> is currently using SeriesGroupBy.max. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "max" instead.
  ).agg(to_agg)
/Users/code/fin_tool/github/featuretools/featuretools/computational_backends/feature_set_calculator.py:756: FutureWarning: The provided callable <function std at 0x1056a5c60> is currently using SeriesGroupBy.std. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "std" instead.
  ).agg(to_agg)
/Users/code/fin_tool/github/featuretools/featuretools/computational_backends/feature_set_calculator.py:756: FutureWarning: The provided callable <function sum at 0x1056a4a40> is currently using SeriesGroupBy.sum. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "sum" instead.
  ).agg(to_agg)
[23]:
order_id item_price on_sale orders.COUNT(items) orders.MAX(items.item_price) orders.MEAN(items.item_price) orders.MIN(items.item_price) orders.PERCENT_TRUE(items.on_sale) orders.SKEW(items.item_price) orders.STD(items.item_price) orders.SUM(items.item_price) orders.DAY(order_date) orders.MONTH(order_date) orders.WEEKDAY(order_date) orders.YEAR(order_date)
id
0 0 29.95 False 1 29.95 29.950 29.95 0.0 NaN NaN 29.95 2 1 5 2021
1 1 4.99 True 2 10.25 7.620 4.99 0.5 NaN 3.719382 15.24 3 1 6 2021
2 1 10.25 False 2 10.25 7.620 4.99 0.5 NaN 3.719382 15.24 3 1 6 2021
3 2 20.50 True 2 20.50 18.245 15.99 0.5 NaN 3.189052 36.49 4 1 0 2021
4 2 15.99 False 2 20.50 18.245 15.99 0.5 NaN 3.189052 36.49 4 1 0 2021

除了参数名称的更改之外,用户还应该注意返回的特征矩阵中的另外一些变化。首先,由于Woodwork定义列类型的方式与先前的Featuretools实现方式略有不同,因此在旧版本和新版本之间生成的特征可能会有一些差异。最显著的影响在于外键列的处理方式。以前,Featuretools将所有外键(之前是Id)列视为分类列,并会从这些列生成适当的特征。从版本1.0开始,外键列不再被限制为分类列,如果它们是其他类型,如Integer,则不会从这些列生成特征。像上面展示的手动将外键列转换为Categorical将会产生与之前版本中实现的特征非常接近的特征。另外,由于Woodwork的类型推断过程与先前的Featuretools类型推断过程不同,一个EntitySet可能会有不同的列类型被识别出来。列类型的这种差异可能会影响生成的特征。如果重要的是要有相同的特征集,可以检查EntitySet数据框中的所有逻辑类型,并根据需要更新为期望的类型。最后,由Featuretools计算的特征矩阵现在将会被初始化为Woodwork。这意味着用户可以通过Woodwork命名空间查看特征矩阵列的类型信息,如下所示。

[24]:
feature_matrix.ww

[24]:
Physical Type Logical Type Semantic Tag(s)
Column
order_id int64 Integer ['numeric', 'foreign_key']
item_price float64 Double ['numeric']
on_sale bool Boolean []
orders.COUNT(items) Int64 IntegerNullable ['numeric']
orders.MAX(items.item_price) float64 Double ['numeric']
orders.MEAN(items.item_price) float64 Double ['numeric']
orders.MIN(items.item_price) float64 Double ['numeric']
orders.PERCENT_TRUE(items.on_sale) float64 Double ['numeric']
orders.SKEW(items.item_price) float64 Double ['numeric']
orders.STD(items.item_price) float64 Double ['numeric']
orders.SUM(items.item_price) float64 Double ['numeric']
orders.DAY(order_date) category Ordinal: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] ['category']
orders.MONTH(order_date) category Ordinal: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] ['category']
orders.WEEKDAY(order_date) category Ordinal: [0, 1, 2, 3, 4, 5, 6] ['category']
orders.YEAR(order_date) category Ordinal: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999] ['category']

Featuretools现在通过数据框中是否最初存在来标记特征,或者是由Featuretools创建的。这些信息存储在Woodwork的origin属性中。原始数据中存在的列将被标记为base,而由Featuretools创建的特征将被标记为engineered。作为如何访问这些信息的演示,让我们比较特征矩阵中的两个特征:item_priceorders.MEAN(items.item_price)item_price在原始数据中存在,而orders.MEAN(items.item_price)是由Featuretools创建的。

[25]:
feature_matrix.ww["item_price"].ww.origin

[25]:
'base'
[26]:
feature_matrix.ww["orders.MEAN(items.item_price)"].ww.origin

[26]:
'engineered'

其他更改#

除了上面概述的更改之外,Featuretools 1.0 中还有一些其他较小的更改,现有用户应该注意以下内容。

  • 在 EntitySet 中,数据框的列顺序可能与以前不同。以前,Featuretools 会重新排列列,使索引列始终成为数据框中的第一列。这种行为已被移除,索引列不再保证是数据框中的第一列。现在,索引列将保持在数据框添加到 EntitySet 时的位置。

  • 对于 LatLong 列,Featuretools 的旧版本会将列中单个 nan 值替换为元组 (nan, nan)。现在不再这样,单个 nan 值将保留在 LatLong 列中。根据 Woodwork 的行为,LatLong 列中的任何 (nan, nan) 值将被替换为单个 nan 值。

  • 由于 Featuretools 不再定义具有彼此之间关系的 Variable 对象,因此已删除了 featuretools.variable_types.graph_variable_types 函数。

  • 已删除 featuretools.variable_types.list_variable_types 实用程序函数,并用两个相应的 Woodwork 函数替换:woodwork.list_logical_typeswoodwork.list_semantic_tags。从 Featuretools 1.0 开始,应使用 Woodwork 实用程序函数来获取可以应用于数据框列的逻辑类型和语义标签的信息。