定制逻辑类型和类型推断#
Woodwork 中的默认类型系统包含许多内置逻辑类型,适用于各种数据集。对于内置逻辑类型不足以满足需求的情况,Woodwork 允许您创建自定义逻辑类型。
Woodwork 还拥有一组标准的类型推断函数,可以帮助自动识别数据中正确的逻辑类型。Woodwork 也允许您覆盖这些现有函数,或添加新函数来推断任何已添加的自定义逻辑类型。
本指南概述了如何创建自定义逻辑类型以及如何覆盖和添加新的类型推断函数。如果您需要了解更多关于 Woodwork 中现有类型和标签的信息,请参阅理解逻辑类型和语义标签指南以获取更多详细信息。如果您需要了解如何在 DataFrame 上设置和更新这些类型和标签,请参阅使用类型和标签指南以获取更多详细信息。
查看内置逻辑类型#
要查看 Woodwork 中的所有默认逻辑类型,请使用 list_logical_types
函数。如果现有类型不足以满足您的需求,您可以创建并注册新的逻辑类型,以便与 Woodwork 初始化的 DataFrame 和 Series 一起使用。
[1]:
import woodwork as ww
ww.list_logical_types()
[1]:
名称 | 类型字符串 | 描述 | 物理类型 | 标准标签 | 是否为默认类型 | 是否已注册 | 父类型 | |
---|---|---|---|---|---|---|---|---|
0 | 地址 | 地址 | 表示包含地址信息的逻辑类型... | 字符串 | {} | True | True | None |
1 | 年龄 | 年龄 | 表示包含整数年龄的逻辑类型... | int64 | {numeric} | True | True | 整数 |
2 | 分数年龄 | 分数年龄 | 表示包含非负年龄(可含小数)的逻辑类型... | float64 | {numeric} | True | True | 双精度浮点数 |
3 | 可空年龄 | 可空年龄 | 表示包含整数年龄的逻辑类型... | Int64 | {numeric} | True | True | 可空整数 |
4 | 布尔 | 布尔 | 表示包含二进制值(True/False)的逻辑类型... | bool | {} | True | True | 可空布尔 |
5 | 可空布尔 | 可空布尔 | 表示包含二进制值(True/False)的逻辑类型... | 布尔 | {} | True | True | None |
6 | 类别 | 类别 | 表示包含无序分类值的逻辑类型... | 类别 | {category} | True | True | None |
7 | 国家代码 | 国家代码 | 表示使用 ISO-3166 标准的国家代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
8 | 货币代码 | 货币代码 | 表示使用 ISO-4217 标准的货币代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
9 | 日期时间 | 日期时间 | 表示包含日期和时间信息的逻辑类型... | datetime64[ns] | {} | True | True | None |
10 | 双精度浮点数 | 双精度浮点数 | 表示包含正实数的逻辑类型... | float64 | {numeric} | True | True | None |
11 | 电子邮件地址 | 电子邮件地址 | 表示包含电子邮件地址的逻辑类型... | 字符串 | {} | True | True | 未知 |
12 | 文件路径 | 文件路径 | 表示指定文件或目录位置的逻辑类型... | 字符串 | {} | True | True | None |
13 | IP 地址 | ip_address | 表示包含 IP 地址的逻辑类型... | 字符串 | {} | True | True | 未知 |
14 | 整数 | 整数 | 表示包含正实数的逻辑类型... | int64 | {numeric} | True | True | 可空整数 |
15 | 可空整数 | 可空整数 | 表示包含正实数的逻辑类型... | Int64 | {numeric} | True | True | None |
16 | 经纬度 | 经纬度 | 表示包含经度和纬度信息的逻辑类型... | 对象 | {} | True | True | None |
17 | 自然语言 | 自然语言 | 表示包含文本或自然语言数据的逻辑类型... | 字符串 | {} | True | True | None |
18 | 有序类别 | 有序类别 | 表示包含有序分类值的逻辑类型... | 类别 | {category} | True | True | 类别 |
19 | 人名全称 | 人名全称 | 表示可能包含名字、中间名和姓氏的逻辑类型... | 字符串 | {} | True | True | None |
20 | 电话号码 | 电话号码 | 表示包含数字电话号码的逻辑类型... | 字符串 | {} | True | True | 未知 |
21 | 邮政编码 | 邮政编码 | 表示包含一系列字符(如邮政编码)的逻辑类型... | 类别 | {category} | True | True | 类别 |
22 | 子区域代码 | 子区域代码 | 表示使用 ISO-3166 标准的国家代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
23 | 时间差 | 时间差 | 表示包含时间间隔或持续时间的逻辑类型... | timedelta64[ns] | {} | True | True | 未知 |
24 | URL | url | 表示包含 URL 的逻辑类型,通常以 scheme (如 http) 开头... | 字符串 | {} | True | True | 未知 |
25 | 未知 | 未知 | 表示无法通过推断确定的逻辑类型... | 字符串 | {} | True | True | None |
注册新逻辑类型#
注册新逻辑类型的第一步是定义新类型的类。这通过继承内置的 LogicalType
类来完成。定义这个新类时,应该设置一些类属性。下面将详细介绍每个属性。
在本示例中,我们将通过一个包含 UPC 代码的数据集示例。首先创建一个新的 UPCCode
逻辑类型。在本示例中,将 UPC 代码视为一种类别变量。
[2]:
from woodwork.logical_types import LogicalType
class UPCCode(LogicalType):
"""Represents Logical Types that contain 12-digit UPC Codes."""
primary_dtype = "category"
standard_tags = {"category", "upc_code"}
定义 UPCCode
逻辑类型类时,设置了三个类属性。这三个属性都是可选的,如果在定义新类型时未设置,将默认为 LogicalType
类上定义的值。
primary_dtype
:此值指定数据的存储方式。如果 DataFrame 的列不是此类型,Woodwork 会将数据转换为此 dtype。应指定为表示有效 pandas dtype 的字符串。如果未指定,则默认为'string'
。standard_tags
:这是一组要应用于使用指定逻辑类型设置的任何列的语义标签。如果未指定,standard_tags
将默认为空集。docstring:为类添加 docstring 是可选的,但如果指定,此文本将用作
ww.list_logical_types()
返回的可用类型列表中该类型的描述。
注意
在底层,Woodwork 使用 category
和 numeric
语义标签分别确定列是类别列还是数字列。如果您定义的新逻辑类型表示类别或数字类型,应在为 standard_tags
指定的标签集中包含相应的标签。
创建新逻辑类型后,您可以将其注册到 Woodwork 类型系统,以便使用。所有对类型系统的修改都通过调用 ww.type_system
对象上的相应方法来执行。
[3]:
ww.type_system.add_type(UPCCode, parent="Categorical")
如果再次列出可用的逻辑类型,您将看到创建的新类型已添加到列表中,包括定义 UPCCode
逻辑类型时指定的 description、physical_type 和 standard_tags 的值。
[4]:
ww.list_logical_types()
[4]:
名称 | 类型字符串 | 描述 | 物理类型 | 标准标签 | 是否为默认类型 | 是否已注册 | 父类型 | |
---|---|---|---|---|---|---|---|---|
0 | 地址 | 地址 | 表示包含地址信息的逻辑类型... | 字符串 | {} | True | True | None |
1 | 年龄 | 年龄 | 表示包含整数年龄的逻辑类型... | int64 | {numeric} | True | True | 整数 |
2 | 分数年龄 | 分数年龄 | 表示包含非负年龄(可含小数)的逻辑类型... | float64 | {numeric} | True | True | 双精度浮点数 |
3 | 可空年龄 | 可空年龄 | 表示包含整数年龄的逻辑类型... | Int64 | {numeric} | True | True | 可空整数 |
4 | 布尔 | 布尔 | 表示包含二进制值(True/False)的逻辑类型... | bool | {} | True | True | 可空布尔 |
5 | 可空布尔 | 可空布尔 | 表示包含二进制值(True/False)的逻辑类型... | 布尔 | {} | True | True | None |
6 | 类别 | 类别 | 表示包含无序分类值的逻辑类型... | 类别 | {category} | True | True | None |
7 | 国家代码 | 国家代码 | 表示使用 ISO-3166 标准的国家代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
8 | 货币代码 | 货币代码 | 表示使用 ISO-4217 标准的货币代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
9 | 日期时间 | 日期时间 | 表示包含日期和时间信息的逻辑类型... | datetime64[ns] | {} | True | True | None |
10 | 双精度浮点数 | 双精度浮点数 | 表示包含正实数的逻辑类型... | float64 | {numeric} | True | True | None |
11 | 电子邮件地址 | 电子邮件地址 | 表示包含电子邮件地址的逻辑类型... | 字符串 | {} | True | True | 未知 |
12 | 文件路径 | 文件路径 | 表示指定文件或目录位置的逻辑类型... | 字符串 | {} | True | True | None |
13 | IP 地址 | ip_address | 表示包含 IP 地址的逻辑类型... | 字符串 | {} | True | True | 未知 |
14 | 整数 | 整数 | 表示包含正实数的逻辑类型... | int64 | {numeric} | True | True | 可空整数 |
15 | 可空整数 | 可空整数 | 表示包含正实数的逻辑类型... | Int64 | {numeric} | True | True | None |
16 | 经纬度 | 经纬度 | 表示包含经度和纬度信息的逻辑类型... | 对象 | {} | True | True | None |
17 | 自然语言 | 自然语言 | 表示包含文本或自然语言数据的逻辑类型... | 字符串 | {} | True | True | None |
18 | 有序类别 | 有序类别 | 表示包含有序分类值的逻辑类型... | 类别 | {category} | True | True | 类别 |
19 | 人名全称 | 人名全称 | 表示可能包含名字、中间名和姓氏的逻辑类型... | 字符串 | {} | True | True | None |
20 | 电话号码 | 电话号码 | 表示包含数字电话号码的逻辑类型... | 字符串 | {} | True | True | 未知 |
21 | 邮政编码 | 邮政编码 | 表示包含一系列字符(如邮政编码)的逻辑类型... | 类别 | {category} | True | True | 类别 |
22 | 子区域代码 | 子区域代码 | 表示使用 ISO-3166 标准的国家代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
23 | 时间差 | 时间差 | 表示包含时间间隔或持续时间的逻辑类型... | timedelta64[ns] | {} | True | True | 未知 |
24 | UPC 代码 | upc_code | 表示包含 12 位数字 UPC 代码的逻辑类型... | 类别 | {upc_code, category} | False | True | 类别 |
25 | URL | url | 表示包含 URL 的逻辑类型,通常以 scheme (如 http) 开头... | 字符串 | {} | True | True | 未知 |
26 | 未知 | 未知 | 表示无法通过推断确定的逻辑类型... | 字符串 | {} | True | True | None |
逻辑类型关系#
将新类型添加到类型系统时,可以指定可选的父逻辑类型,如上所示。执行类型推断时,给定的数据集可能匹配多个不同的逻辑类型。Woodwork 使用注册类型时定义的父子关系来确定在这种情况下应推断哪种类型。
当发现多个匹配项时,Woodwork 将返回找到的最具体的类型匹配。通过在注册 UPCCode
逻辑类型时将父类型设置为 Categorical
,您是在告诉 Woodwork,如果在推断过程中数据列同时匹配 Categorical
和 UPCCode
,则该列应被视为 UPCCode
,因为这比 Categorical
更具体。Woodwork 始终假设子类型是父类型更具体的版本。
使用自定义逻辑类型#
接下来,您将创建一个小的示例 DataFrame 来演示新自定义类型的用法。这个示例 DataFrame 包含一个 id 列、一个包含有效 UPC 代码的列,以及一个包含非数字值因此不应被视为 UPC 代码的列。
[5]:
import pandas as pd
df = pd.DataFrame(
{
"id": [0, 1, 2, 3],
"code": ["012345412359", "122345712358", "012345412359", "012345412359"],
"not_upc": ["abcdefghijkl", "122345712358", "012345412359", "022323413459"],
}
)
使用一个带有设置覆盖的 with 块来更新 Woodwork 区分 Unknown
和 Categorical
列的默认阈值,以便 Woodwork 能够正确地将 code
列识别为 Categorical
列。设置阈值后,初始化 Woodwork 并验证 Woodwork 已将我们的列识别为 Categorical
。
[6]:
with ww.config.with_options(categorical_threshold=0.5):
df.ww.init()
df.ww
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
[6]:
物理类型 | 逻辑类型 | 语义标签 | |
---|---|---|---|
列 | |||
id | int64 | 整数 | ['numeric'] |
code | int64 | 整数 | ['numeric'] |
not_upc | 字符串 | 未知 | [] |
Woodwork 未将 code
列识别为 UPCCode
逻辑类型的原因是,您尚未为此类型定义推理函数。推理函数是告诉 Woodwork 如何将列与特定逻辑类型进行匹配的功能。
即使没有推理函数,您也可以手动告诉 Woodwork code
列的类型应该是 UPCCode
。这将正确设置物理类型并应用您定义的标准语义标签。
[7]:
df.ww.init(logical_types={"code": "UPCCode"})
df.ww
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
[7]:
物理类型 | 逻辑类型 | 语义标签 | |
---|---|---|---|
列 | |||
id | int64 | 整数 | ['numeric'] |
code | 类别 | UPC 代码 | ['upc_code', 'category'] |
not_upc | 字符串 | 未知 | [] |
接下来,添加一个新的推理函数,让 Woodwork 自动为 code
列设置正确的类型。
定义自定义推理函数#
为 UPCCode
逻辑类型添加推理函数的第一步是定义一个适当的函数。推理函数总是接受一个参数,即一个 pandas.Series
。如果该 Series 与函数关联的逻辑类型匹配,则函数应返回 True
,如果 Series 不匹配,则返回 False
。
对于 UPCCode
逻辑类型,定义一个函数来检查列中的所有值是否都是只包含数字的 12 个字符的字符串。请注意,此函数仅用于演示目的,可能无法捕捉到正确识别 UPC 代码所需考虑的所有情况。
[8]:
def infer_upc_code(series):
# Make sure series contains only strings:
if not series.apply(type).eq(str).all():
return False
# Check that all items are 12 characters long
if all(series.str.len() == 12):
# Try to convert to a number
try:
series.astype("int")
return True
except Exception:
return False
return False
定义新的 UPC 代码推理函数后,将其添加到 Woodwork 类型系统,以便在推断列类型时使用。
[9]:
ww.type_system.update_inference_function("UPCCode", inference_function=infer_upc_code)
更新推理函数后,您可以在 DataFrame 上重新初始化 Woodwork。请注意,Woodwork 已正确识别 code
列的逻辑类型为 UPCCode
,并正确设置了物理类型并将标准标签添加到该列的语义标签中。
另请注意,not_upc
列被识别为 Categorical
。尽管此列包含 12 位数字字符串,但某些值包含字母,我们的推理函数正确地告诉 Woodwork 这对于 UPCCode
逻辑类型无效。
[10]:
df.ww.init()
df.ww
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
[10]:
物理类型 | 逻辑类型 | 语义标签 | |
---|---|---|---|
列 | |||
id | int64 | 整数 | ['numeric'] |
code | 类别 | 类别 | ['category'] |
not_upc | 字符串 | 未知 | [] |
覆盖默认推理函数#
覆盖默认推理函数是使用 update_inference_function
类型系统方法完成的。只需传入要覆盖其函数的逻辑类型以及要使用的新函数即可。
例如,您可以告诉 Woodwork 为内置的 Categorical
逻辑类型使用新的 infer_upc_code
函数。
[11]:
ww.type_system.update_inference_function(
"Categorical", inference_function=infer_upc_code
)
如果在更新 Categorical
函数后在 DataFrame 上初始化 Woodwork,您会看到 not_upc
列不再被识别为 Categorical
列,而是设置为默认的 Unknown
逻辑类型。这是因为 not_upc
列第一行中的字母导致我们的推理函数为此列返回 False
,而默认的 Categorical
函数允许存在非数字值。更新推理函数后,此列不再被视为与 Categorical
类型匹配,也不与任何其他逻辑类型匹配。因此,逻辑类型被设置为 Unknown
,这是找不到类型匹配时使用的默认类型。
[12]:
df.ww.init()
df.ww
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
[12]:
物理类型 | 逻辑类型 | 语义标签 | |
---|---|---|---|
列 | |||
id | int64 | 整数 | ['numeric'] |
code | 字符串 | 未知 | [] |
not_upc | 字符串 | 未知 | [] |
更新逻辑类型关系#
如果需要更改已注册逻辑类型的父类型,可以使用 update_relationship
方法。将新的 UPCCode
逻辑类型更新为 NaturalLanguage
的子类型。
[13]:
ww.type_system.update_relationship("UPCCode", parent="NaturalLanguage")
逻辑类型的父类型也可以设置为 None
,表示这是根级别的逻辑类型,不是任何其他现有逻辑类型的子类型。
[14]:
ww.type_system.update_relationship("UPCCode", parent=None)
正确设置逻辑类型之间的父子关系很重要。因为 Woodwork 在推断过程中会返回找到的最具体的逻辑类型匹配,如果关系设置不正确,可能会发生不当的推断。
例如,如果在将 UPCCode
逻辑类型的父类型设置为 None
后初始化 Woodwork,您会看到 UPC 代码列现在被推断为 Categorical
,而不是 UPCCode
。将父类型设置为 None
后,UPCCode
和 Categorical
在关系图现在是同级,而不是像之前那样存在父子关系。当 Woodwork 在关系图的同一级别找到多个匹配项时,返回第一个匹配项,在本例中是 Categorical
。如果没有设置正确的父子关系,Woodwork 将无法确定哪个逻辑类型最具体。
[15]:
df.ww.init()
df.ww
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
[15]:
物理类型 | 逻辑类型 | 语义标签 | |
---|---|---|---|
列 | |||
id | int64 | 整数 | ['numeric'] |
code | 字符串 | 未知 | [] |
not_upc | 字符串 | 未知 | [] |
移除逻辑类型#
如果不再需要或不希望使用某个逻辑类型,可以使用 remove_type
方法将其从类型系统中移除。当逻辑类型被移除后,该类型的 is_registered
列将显示 False
值。如果移除具有子类型的逻辑类型,则所有子类型的父类型将设置为被移除逻辑类型的父类型(假设父类型已定义)。
移除自定义的 UPCCode
类型,并通过列出可用的逻辑类型来确认它已从类型系统中移除。您可以通过查看 is_registered
列中显示为 False
来确认 UPCCode
类型将不再使用。
[16]:
ww.type_system.remove_type("UPCCode")
ww.list_logical_types()
[16]:
名称 | 类型字符串 | 描述 | 物理类型 | 标准标签 | 是否为默认类型 | 是否已注册 | 父类型 | |
---|---|---|---|---|---|---|---|---|
0 | 地址 | 地址 | 表示包含地址信息的逻辑类型... | 字符串 | {} | True | True | None |
1 | 年龄 | 年龄 | 表示包含整数年龄的逻辑类型... | int64 | {numeric} | True | True | 整数 |
2 | 分数年龄 | 分数年龄 | 表示包含非负年龄(可含小数)的逻辑类型... | float64 | {numeric} | True | True | 双精度浮点数 |
3 | 可空年龄 | 可空年龄 | 表示包含整数年龄的逻辑类型... | Int64 | {numeric} | True | True | 可空整数 |
4 | 布尔 | 布尔 | 表示包含二进制值(True/False)的逻辑类型... | bool | {} | True | True | 可空布尔 |
5 | 可空布尔 | 可空布尔 | 表示包含二进制值(True/False)的逻辑类型... | 布尔 | {} | True | True | None |
6 | 类别 | 类别 | 表示包含无序分类值的逻辑类型... | 类别 | {category} | True | True | None |
7 | 国家代码 | 国家代码 | 表示使用 ISO-3166 标准的国家代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
8 | 货币代码 | 货币代码 | 表示使用 ISO-4217 标准的货币代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
9 | 日期时间 | 日期时间 | 表示包含日期和时间信息的逻辑类型... | datetime64[ns] | {} | True | True | None |
10 | 双精度浮点数 | 双精度浮点数 | 表示包含正实数的逻辑类型... | float64 | {numeric} | True | True | None |
11 | 电子邮件地址 | 电子邮件地址 | 表示包含电子邮件地址的逻辑类型... | 字符串 | {} | True | True | 未知 |
12 | 文件路径 | 文件路径 | 表示指定文件或目录位置的逻辑类型... | 字符串 | {} | True | True | None |
13 | IP 地址 | ip_address | 表示包含 IP 地址的逻辑类型... | 字符串 | {} | True | True | 未知 |
14 | 整数 | 整数 | 表示包含正实数的逻辑类型... | int64 | {numeric} | True | True | 可空整数 |
15 | 可空整数 | 可空整数 | 表示包含正实数的逻辑类型... | Int64 | {numeric} | True | True | None |
16 | 经纬度 | 经纬度 | 表示包含经度和纬度信息的逻辑类型... | 对象 | {} | True | True | None |
17 | 自然语言 | 自然语言 | 表示包含文本或自然语言数据的逻辑类型... | 字符串 | {} | True | True | None |
18 | 有序类别 | 有序类别 | 表示包含有序分类值的逻辑类型... | 类别 | {category} | True | True | 类别 |
19 | 人名全称 | 人名全称 | 表示可能包含名字、中间名和姓氏的逻辑类型... | 字符串 | {} | True | True | None |
20 | 电话号码 | 电话号码 | 表示包含数字电话号码的逻辑类型... | 字符串 | {} | True | True | 未知 |
21 | 邮政编码 | 邮政编码 | 表示包含一系列字符(如邮政编码)的逻辑类型... | 类别 | {category} | True | True | 类别 |
22 | 子区域代码 | 子区域代码 | 表示使用 ISO-3166 标准的国家代码的逻辑类型... | 类别 | {category} | True | True | 类别 |
23 | 时间差 | 时间差 | 表示包含时间间隔或持续时间的逻辑类型... | timedelta64[ns] | {} | True | True | 未知 |
24 | UPC 代码 | upc_code | 表示包含 12 位数字 UPC 代码的逻辑类型... | 类别 | {upc_code, category} | False | False | None |
25 | URL | url | 表示包含 URL 的逻辑类型,通常以 scheme (如 http) 开头... | 字符串 | {} | True | True | 未知 |
26 | 未知 | 未知 | 表示无法通过推断确定的逻辑类型... | 字符串 | {} | True | True | None |
将类型系统重置为默认值#
最后,如果您对默认的 Woodwork 类型系统进行了多次更改,并且希望将一切重置回默认状态,可以使用如下所示的 reset_defaults
方法。这将取消注册您注册的任何新类型,将所有关系重置为默认值,并将所有推理函数设置回其默认函数。
[17]:
ww.type_system.reset_defaults()
覆盖默认逻辑类型#
有时您可能希望覆盖 Woodwork 的默认逻辑类型。一个例子是,您可能希望为 Integer
逻辑类型使用可空的 Int64
dtype,而不是默认的 int64
dtype。在这种情况下,您希望 Woodwork 停止推断默认的 Integer
逻辑类型,而是推断一个兼容的逻辑类型。您可以通过以下两种方式之一解决此问题。
首先,您可以创建一个全新的逻辑类型,并为其指定自己的名称,例如 MyInteger
,然后将其注册到类型系统中。如果您想用它代替正常的 Integer
逻辑类型进行推断,您需要从类型系统中移除 Integer
,并对 MyInteger
使用 Integer
的默认推理函数。这样做可以使 MyInteger
在之前会推断为 Integer
的任何地方被推断。请注意,因为 Integer
的父逻辑类型是 IntegerNullable
,所以在注册 MyInteger
时,您也需要将其父类型设置为 IntegerNullable
。
[18]:
from woodwork.logical_types import LogicalType
class MyInteger(LogicalType):
primary_dtype = "Int64"
standard_tags = {"numeric"}
int_inference_fn = ww.type_system.inference_functions[ww.logical_types.Integer]
ww.type_system.remove_type(ww.logical_types.Integer)
ww.type_system.add_type(MyInteger, int_inference_fn, parent="IntegerNullable")
df.ww.init()
df.ww
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
[18]:
物理类型 | 逻辑类型 | 语义标签 | |
---|---|---|---|
列 | |||
id | Int64 | MyInteger | ['numeric'] |
code | 字符串 | 未知 | [] |
not_upc | 字符串 | 未知 | [] |
如上所示,之前被推断为 Integer
的 id
列现在被推断为物理类型为 Int64
的 MyInteger
。在 ww.list_logical_types()
返回的完整逻辑类型列表中,Integer
和 MyInteger
都将出现,但 Integer
的 is_registered
将为 False,而 MyInteger
的 is_registered
将设置为 True。
覆盖默认逻辑类型的第二种选择允许您创建一个与现有逻辑类型同名的新逻辑类型。这可能是您希望的,因为它将允许 Woodwork 将字符串 'Integer'
解释为您新的逻辑类型,从而使之前可能选择了 'Integer'
的代码无需更新对像 MyInteger
这样的新逻辑类型的引用即可继续使用。
在将一个名称已存在的逻辑类型添加到类型系统中之前,必须先取消注册默认逻辑类型。
为了避免在 Integer 逻辑类型之间使用相同的本地命名空间,建议将 Woodwork 的默认逻辑类型引用为 ww.logical_types.Integer
。
[19]:
ww.type_system.reset_defaults()
class Integer(LogicalType):
primary_dtype = "Int64"
standard_tags = {"numeric"}
int_inference_fn = ww.type_system.inference_functions[ww.logical_types.Integer]
ww.type_system.remove_type(ww.logical_types.Integer)
ww.type_system.add_type(Integer, int_inference_fn, parent="IntegerNullable")
df.ww.init()
display(df.ww)
ww.type_system.reset_defaults()
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
/home/docs/checkouts/readthedocs.org/user_builds/feature-labs-inc-datatables/envs/stable/lib/python3.9/site-packages/woodwork/type_sys/utils.py:33: 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(
物理类型 | 逻辑类型 | 语义标签 | |
---|---|---|---|
列 | |||
id | Int64 | 整数 | ['numeric'] |
code | 字符串 | 未知 | [] |
not_upc | 字符串 | 未知 | [] |
注意 id
现在如何被推断为物理类型为 Int64
的 Integer
逻辑类型!