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中的
Entity
和Variable
类均已移除几个关键的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_name
或index
参数指定值,因为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.dfs
和featuretools.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_dataframes
,ignore_variables
已更名为 ignore_columns
。类似地,如果指定原始选项,则应将所有对 entities
的引用替换为 dataframes
,将对 variables
的引用替换为 columns
。例如,include_groupby_entities
的原始选项现在是 include_groupby_dataframes
,include_variables
现在是 include_columns
。如果传入一个 EntitySet 以及要计算的特征列表,那么对 featuretools.calculate_feature_matrix
的基本调用保持不变。然而,通过传入一个 entities
和 relationships
列表来调用 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_price
和orders.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_types
和woodwork.list_semantic_tags
。从 Featuretools 1.0 开始,应使用 Woodwork 实用程序函数来获取可以应用于数据框列的逻辑类型和语义标签的信息。