本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
转换数据
Amazon SageMaker Data Wrangler 提供了大量 ML 数据转换功能,可简化数据的清理、转换和功能化。当您添加转换时,它会向数据流添加一个步骤。您添加的每个转换都会修改您的数据集并生成一个新的数据框。所有后续转换都适用于生成的数据框。
Data Wrangler 包含内置变换,无需任何代码即可使用它来转换列。您还可以使用 Python(用户定义函数) PySpark、pandas 和 PySpark SQL 添加自定义转换。有些变换就地运行,而另一些则在数据集中创建新的输出列。
您可以一次将转换应用于多列。例如,您可以在一个步骤中删除多列。
只能将 “处理数值” 和 “处理缺失变换” 应用于单列。
使用此页面了解有关这些内置和自定义转换的更多信息。
转换UI
大多数内置转换都位于 Data Wrangler 用户界面的 “准备” 选项卡中。您可以通过数据流视图访问联接和串联转换。使用下表预览这两个视图。
Join(
您可以直接在数据流中加入数据框。当您连接两个数据集时,生成的连接数据集将出现在您的流程中。Data Wrangler 支持以下连接类型。
-
左外-包括左表中的所有行。如果左侧表行上联接的列的值与任何右表行的值都不匹配,则该行包含联接表中所有右表列的空值。
-
Left Anti-包括左表中不包含联接列的右表值的行。
-
L@@ eft semi-为满足联接语句中条件的所有相同行添加左表中的一行。这排除了左侧表中符合联接条件的重复行。
-
右外-包括右侧表中的所有行。如果右侧表行中联接列的值与表左行的任何值都不匹配,则该行包含联接表中所有左表列的空值。
-
内部-包括左表和右表中包含联接列中匹配值的行。
-
完整外部-包括左表和右表中的所有行。如果任一表中联接列的行值不匹配,则会在联接表中创建单独的行。如果某行不包含联接表中某列的值,则为该列插入 null。
-
笛卡尔交叉-包括将第一个表中的每一行与第二个表的每一行组合在一起的行。这是联接中表中的行的笛卡尔乘积
。此乘积的结果是左表的大小乘以右表的大小。因此,我们建议在超大型数据集之间使用这种连接时谨慎行事。
可以按照以下步骤连接两个数据框。
-
选择要加入的左侧数据框旁边的 +。您选择的第一个数据框始终是联接中的左表。
-
选择加入。
-
选择正确的数据框。您选择的第二个数据框始终是连接中的正确表。
-
选择 “配置” 以配置您的加入。
-
使用名称字段为已连接的数据集命名。
-
选择联接类型。
-
从左表和右表中选择一列进行连接。
-
选择 A pply 预览右侧的连接数据集。
-
要将联接表添加到您的数据流中,请选择添加。
串联数据集
连接两个数据集:
-
选择要连接的左侧数据框旁边的 +。您选择的第一个数据框始终是串联中的左表。
-
选择 “串联”。
-
选择正确的数据框。您选择的第二个数据框始终是串联中的正确表。
-
选择 “配置” 以配置您的级联。
-
使用名称字段为串联的数据集命名。
-
(可选)选中旁边的复选框,以删除重复列。
-
(可选)如果要为新数据集中的每一列添加列的来源指示符,请选中 “添加列” 旁边的复选框以指明源数据框。
-
选择 A pply 预览新数据集。
-
选择 “添加” 将新数据集添加到您的数据流中。
余额数据
您可以平衡代表性不足的类别的数据集的数据。平衡数据集可以帮助您为二进制分类创建更好的模型。
注意
您无法平衡包含列向量的数据集。
您可以使用平衡数据操作使用以下运算符之一来平衡数据:
-
随机过度采样-随机重复少数类别的样本。例如,如果您试图检测欺诈行为,则可能只有 10% 的数据中存在欺诈案例。对于相同比例的欺诈和非欺诈案件,该运营商在数据集中随机复制欺诈案件 8 次。
-
随机低采样-大致等同于随机过采样。随机从高代表性类别中移除样本,以获得所需的样本比例。
-
合成少数群体过度采样技术 (SMOTE) — 使用代表性不足类别的样本插值新的合成少数族裔样本。有关 SMOTE 的更多信息,请参阅以下描述。
您可以对包含数值和非数字要素的数据集使用所有变换。SMOTE 使用相邻样本对值进行插值。Data Wrangler 使用 R 平方距离来确定邻域以插值额外样本。Data Wrangler 仅使用数字特征来计算代表性不足的组中样本之间的距离。
对于代表性不足组中的两个实数样本,Data Wrangler 使用加权平均值对数字特征进行插值。它随机为 [0, 1] 范围内的样本分配权重。对于数值特征,Data Wrangler 使用样本的加权平均值对样本进行插值。对于样本 A 和 B,Data Wrangler 可以将 0.7 的权重随机分配给 A,为 B 分配0.3 的权重。插值样本的值为 0.7A + 0.3B。
Data Wrangler 通过复制任一插值的真实样本来插值非数字特征。它以随机分配给每个样本的概率复制样本。对于样本 A 和 B,它可以为 A 分配概率 0.8,为 B 分配概率 0.2。对于它分配的概率,它有 80% 的时间会复制 A。
自定义转换
自定义变换组允许您使用 Python(用户定义函数) PySpark、pandas 或 PySpark (SQL) 来定义自定义转换。对于所有三个选项,您可以使用变量访问df
要对其应用转换的数据框。要将自定义代码应用于数据框,请为数据框分配您对变df
量所做的转换。如果您不使用 Python(用户定义函数),则无需包含 rustun 语句。选择 “预览” 可预览自定义变换的结果。选择 “添加” 将自定义转换添加到您的先前步骤列表中。
您可以使用自定义转换代码块中的import
语句导入常用库,如下所示:
-
NumPy 版本 1.19.0
-
scikit-learn 版本 0.23.2
-
SciPy 版本 1.5.4
-
Pandas 版本 1.0.3
-
PySpark 版本 3.0.0
重要
自定义转换不支持名称中包含空格或特殊字符的列。我们建议您指定仅包含字母数字字符和下划线的列名。您可以使用 “管理列” 转换组中的 “重命名” 列转换来删除列名称中的空格。您还可以添加类似于以下内容的 Python (Pandas) 自定义转换,以在单个步骤中删除多列中的空格。此示例将名为A
column
和B column
的列B_column
分别更改为A_column
和。
df.rename(columns={"A column": "A_column", "B column": "B_column"})
如果在代码块中包含打印语句,则在选择 “预览” 时会显示结果。您可以调整自定义代码转换器面板的大小。调整面板大小可为编写代码提供更多空间。下图显示了面板的大小。

以下部分提供了编写自定义转换代码的其他上下文和示例。
Python(用户定义函数)
Python 函数使您无需了解 Apache Spark 或 Pandas 即可编写自定义转换。Data Wrangler 经过优化,可以快速运行您的自定义代码。使用自定义 Python 代码和 Apache Spark 插件可以获得类似的性能。
要使用 Python(用户定义函数)代码块,请指定以下内容:
-
输入列 — 应用转换的输入列。
-
模式-脚本模式,熊猫模式或 Python 模式。
-
返回类型-您要返回的值的数据类型。
使用熊猫模式可以提供更好的性能。Python 模式使您可以更轻松地使用纯 Python 函数编写转换。
以下视频显示了如何使用自定义代码创建转换的示例。它使用泰坦尼克号数据集

PySpark
以下示例从时间戳中提取日期和时间。
from pyspark.sql.functions import from_unixtime, to_date, date_format df = df.withColumn('DATE_TIME', from_unixtime('TIMESTAMP')) df = df.withColumn( 'EVENT_DATE', to_date('DATE_TIME')).withColumn( 'EVENT_TIME', date_format('DATE_TIME', 'HH:mm:ss'))
大熊猫
以下示例概述了要向其添加转换的数据框。
df.info()
PySpark (SQL)
以下示例创建了一个包含四列的新数据框:姓名、票价、舱位、存活日期。
SELECT name, fare, pclass, survived FROM df
如果您不知道如何使用 PySpark,可以使用自定义代码片段来帮助您入门。
Data Wrangler 有一组可搜索的代码片段。您可以使用代码片段来执行诸如删除列、按列分组或建模之类的任务。
要使用代码片段,请选择搜索示例代码片段并在搜索栏中指定查询。您在查询中指定的文本不必与代码片段的名称完全匹配。
以下示例显示了 “删除重复行” 代码片段,该代码片段可以删除数据集中包含相似数据的行。您可以通过搜索以下内容之一来找到该代码片段:
-
重复
-
相同
-
删除
以下代码段包含注释,可帮助您了解需要进行的更改。对于大多数代码片段,您必须在代码中指定数据集的列名。
# Specify the subset of columns # all rows having identical values in these columns will be dropped subset = ["col1", "col2", "col3"] df = df.dropDuplicates(subset) # to drop the full-duplicate rows run # df = df.dropDuplicates()
要使用代码片段,请将其内容复制并粘贴到自定义转换字段中。您可以将多个代码片段复制并粘贴到自定义转换字段中。
自定义公式
使用自定义公式定义新列,使用 Spark SQL 表达式查询当前数据框中的数据。查询必须使用 Spark SQL 表达式的约定。
重要
自定义公式不支持名称中包含空格或特殊字符的列。我们建议您指定仅包含字母数字字符和下划线的列名。您可以使用 “管理列” 转换组中的 “重命名” 列转换来删除列名称中的空格。您还可以添加类似于以下内容的 Python (Pandas) 自定义转换,以在单个步骤中删除多列中的空格。此示例将名为A
column
和B column
的列B_column
分别更改为A_column
和。
df.rename(columns={"A column": "A_column", "B column": "B_column"})
您可以使用此转换对列执行操作,按名称引用列。例如,假设当前数据框包含名为 col_a 和 col_b 的列,则可以使用以下操作生成一个输出列,该列是这两列的乘积,其代码如下:
col_a * col_b
其他常见操作包括以下内容,假设数据框包含col_a
和col_b
列:
-
连接两列:
concat(col_a, col_b)
-
添加两列:
col_a + col_b
-
减去两列:
col_a - col_b
-
划分两列:
col_a / col_b
-
取列的绝对值:
abs(col_a)
有关更多信息,请参阅有关选择数据的 Spark 文档
降低数据集内的维度
使用主成分分析 (PCA) 降低数据的维度。数据集的维度对应于要素的数量。当你在 Data Wrangler 中使用降维时,你会得到一组名为组件的新功能。每个组成部分都解释了数据中的一些差异。
第一个成分是数据中变异量最大的组成部分。第二个分量占数据的第二大变异量,依此类推。
您可以使用降维来减小用于训练模型的数据集的大小。您可以改用主组件,而不是使用数据集中的功能。
为了执行 PCA,Data Wrangler 会为您的数据创建轴。轴是数据集中各列的仿射组合。第一个主分量是轴上方差最大的值。第二个主分量是轴上方差第二大的值。第 n 个主分量是轴上具有第 n 个最大方差的值。
您可以配置 Data Wrangler 返回的主组件的数量。您可以直接指定主成分的数量,也可以指定方差阈值百分比。每个主成分都解释了数据中的方差量。例如,您可能具有一个值为 0.5 的主成分。该组件将解释数据中50%的变异。当您指定方差阈值百分比时,Data Wrangler 会返回满足您指定百分比的最小分量组件。
以下是主分量示例,其方差量由它们在数据中解释。
-
第 1-0.5
-
第 2 部分 — 0.45
-
第 3 部分 — 0.05
如果您将方差阈值百分比指定为94
或95
,Data Wrangler 将返回组件 1 和组件 2。如果您指定的方差阈值百分比为96
,Data Wrangler 将返回所有三个主分量。
您可以使用以下过程在数据集中运行 PCA 的过程中的过程如下:
要在您的数据集上运行 PCA,请执行以下操作。
-
打开你的 Data Wrangler 数据流。
-
选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择 “降维”。
-
对于输入列,选择要简化为主组件的功能。
-
(可选)对于主成分的数量,选择 Data Wrangler 在您的数据集中返回的主成分的数量。如果为字段指定值,则无法为方差阈值百分比指定值。
-
(可选)对于方差阈值百分比,指定要由主成分解释的数据变异百分比。
95
如果您没有为方差阈值指定值,则 Data Wrangler 将使用默认值。如果您已为主成分数指定了值,则无法指定方差阈值百分比。 -
(可选)取消选择 “中心” 以不使用列的均值作为数据中心。默认情况下,Data Wrangler 在缩放之前将数据以均值居中。
-
(可选)取消选择 “缩放” 以不使用单位标准差缩放数据。
-
(可选)选择 Co l umns 将组件输出到不同的列。选择 Vect or 将分量输出为单个向量。
-
(可选)对于输出列,指定输出列的名称。如果您要将组件输出到单独的列中,则指定的名称是前缀。如果您要将分量输出到向量,则指定的名称是矢量列的名称。
-
(可选)选择 “保留输入列”。如果您计划仅使用主组件来训练模型,我们不建议选择此选项。
-
选择 Preview(预览)。
-
选择 Add(添加)。
对分类进行编码
类别数据通常由有限数量的类别组成,其中每个类别用一个字符串表示。例如,如果您有一个客户数据表,则表示某人居住的国家/地区的列是分类的。类别将是阿富汗、阿尔巴尼亚、阿尔及利亚等。类别数据可以是名义数据也可以是序数数据。序数类别有固有的顺序,而名义类别没有。获得的最高学位(高中、学士、硕士学位等)是序数类别的一个示例。
对分类数据进行编码是为类别创建数字表示的过程。例如,如果您的类别是 “狗” 和 “猫”,则可以将此信息编码为两个向量,[1,0]
分别表示 “狗” 和[0,1]
“猫”。
对序数类别进行编码时,可能需要将类别的自然顺序转换为编码。例如,您可以使用以下地图表示获得的最高学位:{"High school": 1, "Bachelors": 2,
"Masters":3}
。
使用分类编码将字符串格式的分类数据编码为整数数组。
Data Wrangler 分类编码器为定义步骤时列中存在的所有类别创建编码。如果在时间 t 启动 Data Wrangler 作业处理数据集时已向列中添加了新类别,并且此列是时间 t -1 时的 Data Wrangler 分类编码转换的输入,则这些新类别被认为是 Data Wrangler 作业中缺少这些新类别。您为 “无效处理策略” 选择的选项将应用于这些缺失值。何时可能发生这种情况的示例有:
-
当您使用.flow 文件创建 Data Wrangler 作业以处理创建数据流后更新的数据集时。例如,您可以使用数据流定期处理每月的销售数据。如果该销售数据每周更新一次,则可能在定义了编码类别步骤的列中引入新的类别。
-
当您在导入数据集时选择采样时,样本中可能会遗漏某些类别。
在这些情况下,这些新类别被视为 Data Wrangler 作业中的缺失值。
您可以选择并配置序数编码和单热编码。使用以下部分了解有关选项的更多信息,请按照以下部分了解有关选项的更多信息:
两种转换都会创建一个名为输出列名的新列。您可以使用输出样式指定此列的输出格式:
-
选择 Vect or 可生成具有稀疏向量的单列。
-
选择 Columns 为每个类别创建一列,其中包含一个指示变量,用于指示原始列中的文本是否包含等于该类别的值。
序数编码
选择序数编码将类别编码为介于 0 和所选输入列中的类别总数之间的整数。
无效的处理策略:选择一种方法来处理无效或缺失的值。
-
如果要省略缺少值的行,请选择 “跳过”。
-
选择 “保留” 将缺失值保留为最后一个类别。
-
如果您希望 Data Wrangler 在 “输入” 列中遇到缺失值时抛出错误,请选择 “错误”。
-
选择 “用 NaN 替换” 将缺失替换为 NaN。如果您的 ML 算法可以处理缺失值,则建议使用此选项。否则,此列表中的前三个选项可能会产生更好的结果。
一键编码
为 Transf or m 选择 “单热编码” 以使用单热编码。使用以下方法配置此转换:
-
删除最后一个类别:如果是
True
,则最后一个类别在 one-hot 编码中没有相应的索引。当可能缺失值时,缺失类别始终是最后一个类别,将其设置为True
意味着缺失值会导致向量全为零。 -
无效的处理策略:选择一种方法来处理无效或缺失的值。
-
如果要省略缺少值的行,请选择 “跳过”。
-
选择 “保留” 将缺失值保留为最后一个类别。
-
如果您希望 Data Wrangler 在 “输入” 列中遇到缺失值时抛出错误,请选择 “错误”。
-
-
是否对输入序数进行编码:如果输入向量包含序数编码数据,请选择此选项。此选项要求输入数据包含非负整数。如果为 True,则输入 i 被编码为在第 i 个位置为非零的向量。
相似度编码
当你有以下情况时使用相似度编码:
-
大量的类别变量
-
嘈杂的数据
相似度编码器为包含类别数据的列创建嵌入式。嵌入是将离散对象(例如单词)映射到实数向量。它将相似的字符串编码为包含相似值的向量。例如,它为 “加利福尼亚州” 和 “加利福尼亚州” 创建了非常相似的编码。
Data Wrangler 使用 3 克分词器将数据集中的每个类别转换为一组标记。它使用最小哈希编码将令牌转换为嵌入式。
以下示例说明相似度编码器如何从字符串创建向量,如下示例展示了示例:


Data Wrangler 创建的相似度编码:
-
维度低
-
可以扩展到大量类别
-
坚固耐用,耐噪音
出于上述原因,相似度编码比单热编码更通用。
要将相似度编码转换添加到数据集中,请按照以下过程操作:
要使用相似度编码,请执行以下操作。
-
选择打开 Studio。
-
选择 “启动应用程序”。
-
选择工作室。
-
指定您的数据流。
-
选择包含转换的步骤。
-
选择添加步骤。
-
选择按类别编码。
-
指定以下内容:
-
转换-相似度编码
-
输入列-包含您正在编码的类别数据的列。
-
目标维度-(可选)类别嵌入向量的维度。默认值为 30。如果您有一个包含许多类别的大型数据集,我们建议使用更大的目标维度。
-
输出样式-为包含所有编码值的单个向量选择矢量。选择 Co lu mn 可将编码值保存在单独的列中。
-
输出列-(可选)矢量编码输出的输出列的名称。对于列编码的输出,这是列名的前缀,后面是列出的数字。
-
精选文本
使用 Feat urize Text 转换组检查字符串类型的列,并使用文本嵌入来对这些列进行特征化。
该功能组包含两个功能:角色统计和矢量化。使用以下部分来了解有关这些变换的更多信息。对于这两个选项,输入列必须包含文本数据(字符串类型)。
角色统计数据
使用字符统计数据为包含文本数据的列中的每一行生成统计信息。
此转换计算每行的以下比率和计数,并创建一个新列来报告结果。使用输入列名作为前缀和特定于比率或计数的后缀来命名新列。
-
字数:该行中的总字数。此输出列的后缀是
-stats_word_count
。 -
字符数:该行中的字符总数。此输出列的后缀是
-stats_char_count
。 -
大写比例:从 A 到 Z 的大写字符数除以列中的所有字符。此输出列的后缀是
-stats_capital_ratio
。 -
小写@@ 比例:从 a 到 z 的小写字符数除以列中的所有字符。此输出列的后缀是
-stats_lower_ratio
。 -
数字比率:单行中的数字与输入列中数字总和的比率。此输出列的后缀是
-stats_digit_ratio
。 -
特殊字符比例:非字母数字(诸如 #$&%: @ 之类的字符)与输入列中所有字符总和的比率。此输出列的后缀是
-stats_special_ratio
。
矢量化
文本嵌入涉及将词汇表中的单词或短语映射到实数向量。使用 Data Wrangler 文本嵌入转换将文本数据标记化和矢量化为术语频率—反向文档频率 (TF-IDF) 矢量。
当为一列文本数据计算 TF-IDF 时,每个句子中的每个单词都将转换为代表其语义重要性的实数。数字越高,单词频率越低,这往往更有意义。
定义矢量化变换步骤时,Data Wrangler 使用数据集中的数据来定义计数向量器和 TF-IDF 方法。运行 Data Wrangler 作业使用同样的方法。
您可以使用以下方式配置此转换:
-
输出列名:此转换使用文本嵌入创建一个新列。使用此字段为该输出列指定名称。
-
分词器:分词器将句子转换为单词列表或标记。
选择 St andard 可使用按空格分割并将每个单词转换为小写的分词器。例如,
"Good dog"
被标记为["good","dog"]
。选择 “自定义” 以使用自定义分词器。如果选择 “自定义”,则可以使用以下字段来配置分词器:
-
最小令牌长度:令牌有效的最小长度,以字符为单位。默认值为
1
。例如,如果您指定3
了最小标记长度,则会从分词化句子中删除诸如a, at, in
之类的单词。 -
正则@@ 表达式是否应该在空白处分割:如果选中,正则表达式会在空白处拆分。否则,它与代币匹配。默认值为
True
。 -
正则表达式模式:定义标记化过程的正则表达式模式。默认值为
' \\ s+'
。 -
转换为小写:如果选择,Data Wrangler 会在分词之前将所有字符转换为小写。默认值为
True
。
要了解更多信息,请参阅 Tokenizer
上的 Spark 文档。 -
-
矢量化器:矢量器将标记列表转换为稀疏的数字向量。每个标记对应于向量中的索引,非零表示输入句中存在该标记。您可以从两个矢量器选项中进行选择:计数和哈希。
-
Count vectorize 允许进行自定义,以过滤不常见或过于常见的标记。计数矢量化参数包括以下内容:
-
最小术语频率:在每行中,筛选频率较小的术语(标记)。如果您指定整数,则这是绝对阈值(包括)。如果您指定介于 0(含)和 1 之间的分数,则阈值是相对于总术语数的。默认值为
1
。 -
最低文档频率:必须包含术语(标记)的最小行数。如果您指定整数,则这是绝对阈值(包括)。如果您指定介于 0(含)和 1 之间的分数,则阈值是相对于总术语数的。默认值为
1
。 -
最大文档频率:可以包含术语(标记)的最大文档(行)数。如果您指定整数,则这是绝对阈值(包括)。如果您指定介于 0(含)和 1 之间的分数,则阈值是相对于总术语数的。默认值为
0.999
。 -
最大词汇量:词汇量的最大值。词汇表由该列所有行中的所有术语(标记)组成。默认值为
262144
。 -
二进制输出:如果选中,矢量输出不包括某个术语在文档中的出现次数,而是该术语出现的二进制指标。默认值为
False
。
要了解有关此选项的更多信息,请参阅上的 Spark 文档CountVectorizer
。 -
-
哈希的计算速度更快。哈希向量化参数包括以下内容:
-
哈希@@ 期间的要素数量:哈希向量器根据令牌的哈希值将其映射到向量索引。此功能决定了可能的哈希值的数量。值越大,哈希值之间的冲突越少,但输出向量维度越高。
要了解有关此选项的更多信息,请参阅上的 Spark 文档 FeatureHasher
-
-
-
Apply IDF 应用 IDF 变换,将术语频率乘以用于 TF-IDF 嵌入的标准反向文档频率。IDF 参数包括:
-
最低文档频率:必须包含术语(标记)的最小文档(行)数。如果 count_vectorize 是所选的矢量化器,我们建议您保留默认值,仅修改计数矢量化参数中的 min_doc_freq 字段。默认值为
5
。
-
-
输出格式:每行的输出格式。
-
选择 Vect or 可生成具有稀疏向量的单列。
-
选择 “扁平化” 可为每个类别创建一列,其中包含一个指示变量,用于指示原始列中的文本是否包含与该类别相等的值。只有当向量化器设置为计数矢量器时,才能选择扁平化。
-
转换时间序列
在 Data Wrangler 中,您可以转换时间序列数据。时间序列数据集中的值以特定时间为索引。例如,显示一天中每小时商店中客户数量的数据集就是时间序列数据集。下表显示了时间序列数据集的示例。
商店中每小时的客户数 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
客户数 | 时间(小时) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | 09:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | 10:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 | 11:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
25 | 12:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
20 | 13:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18 | 14:00 |
在上表中,客户数量列包含时间序列数据。根据时间(小时)列中的每小时数据对时间序列数据进行索引。
您可能需要对数据进行一系列转换,以使其成为可用于分析的格式。使用时间序列变换组来转换您的时间序列数据。有关您可以执行的转换的更多信息,请参阅以下各节。
主题
按时间序列分组
您可以使用分组按操作对列中特定值的时间序列数据进行分组。
例如,您的下表跟踪了家庭的平均日用电量。
家庭日均用电量 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
家庭身份证 | 每日时间戳 | 用电量 (千瓦时) | 家庭居住者数 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | 2020 年 1 月 1 日 | 30 | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | 2020 年 2 月 1 日 | 40 | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | 2020 年 4 月 1 日 | 35 | 3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | 2020 年 2 月 1 日 | 45 | 3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | 2020 年 3 月 1 日 | 55 | 4 |
如果您选择按 ID 分组,则会得到下表。
按家庭身份证分组的用电量 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
家庭身份证 | 用电量系列 (kWh) | 家庭居住人数系列 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | [30、40、35] | [2、2、3] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | [45、55] | [3、4] |
时间序列中的每个条目都按相应的时间戳排序。序列的第一个元素对应于该系列的第一个时间戳。对于household_0
,30
是用电量序列的第一个值。的值对30
应于的第一个时间戳1/1/2020
。
您可以包括开始时间戳和结束时间戳。下表显示了信息的显示方式,如下表所示。
按家庭身份证分组的用电量 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
家庭身份证 | 用电量系列 (kWh) | 家庭居住人数系列 | 开始时间 | 结束时间 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | [30、40、35] | [2、2、3] | 2020 年 1 月 1 日 | 2020 年 4 月 1 日 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | [45、55] | [3、4] | 2020 年 2 月 1 日 | 2020 年 3 月 1 日 |
您可以使用以下过程按时间序列列分组:
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择时间序列。
-
在 “转换” 下,选择 “分组依据”。
-
在 “按此列分组” 中指定一列。
-
在 “应用于列” 中,指定一个值。
-
选择 “预览” 以生成变换预览。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
对时间序列数据进行重新采样
时间序列数据的观测值通常不是按固定间隔进行的。例如,数据集可能包含一些每小时记录的观测值,而其他观测值则每两小时记录一次。
许多分析,例如预测算法,都要求定期进行观测。重采样使您能够为数据集中的观测值建立固定间隔。
您可以对时间序列进行上采样或向下采样。缩减采样会增加数据集中观测之间的间隔。例如,如果您对每小时或每两小时采集的观测值进行降采样,则数据集中的每个观测值每两小时采集一次。使用诸如均值或中位数之类的聚合方法将每小时的观测值聚合为单个值。
向上采样可缩短数据集中观测之间的间隔。例如,如果您将每两小时采集的观测值提升为每小时的观测值,则可以使用插值方法从每两小时采集的观测值中推断出每小时的观测值。有关插值方法的信息,请参阅 p andas。 DataFrame. 插值
您可以对数字和非数字数据进行重新采样。
使用重采样操作对时间序列数据进行重新采样。如果您的数据集中有多个时间序列,Data Wrangler 会标准化每个时间序列的时间间隔。
下表显示了使用均值作为聚合方法对时间序列数据进行缩减采样的示例。数据从每两小时缩减采样到每小时一次。
缩减采样前一天的每小时温度读数 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
时间戳 | 温度(摄氏度) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12:00 | 30 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1:00 | 32 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2:00 | 35 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3:00 | 32 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4:00 | 30 |
温度读数缩减至每两小时采样一次 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
时间戳 | 温度(摄氏度) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12:00 | 30 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2:00 | 33.5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2:00 | 35 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4:00 | 32.5 |
您可以使用以下过程对时间序列数据重新采样:
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择 “重新采样”。
-
对于时间戳,选择时间戳列。
-
对于频率单位,指定要重新采样的频率。
-
(可选)为频率数量指定一个值。
-
通过指定剩余字段来配置转换。
-
选择 “预览” 以生成变换预览。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
处理丢失的时间序列数据
如果数据中缺少值,则执行以下操作之一:
-
对于具有多个时间序列的数据集,删除缺失值大于您指定阈值的时间序列。
-
使用时间序列中的其他值来估算时间序列中的缺失值。
补偿缺失值包括通过指定值或使用推断方法来替换数据。以下是可用于归纳的方法:
-
常量值-用您指定的值替换数据集中所有缺失的数据。
-
最常见的值-用数据集中频率最高的值替换所有缺失的数据。
-
向前填充-使用向前填充将缺失值替换为缺失值之前的非缺失值。对于序列:[2、4、7、NaN、NaN、NaN、8],所有缺失的值都替换为 7。使用正向填充产生的序列是 [2、4、7、7、7、7、7、8]。
-
向后填充-使用向后填充将缺失值替换为缺失值之后的非缺失值。对于序列:[2、4、7、NaN、NaN、NaN、8],所有缺失的值都替换为 8。使用向后填充产生的序列是 [2、4、7、8、8、8、8]。
-
插值-使用插值函数来估算缺失值。有关可用于插值的函数的更多信息,请参阅 Pandas 的函数的更多信息,请参阅 Pandas。 DataFrame. 插值
。
某些估算方法可能无法归因数据集中的所有缺失值。例如,向前填充无法估算出现在时间序列开头的缺失值。您可以使用向前填充或向后填充来估算值。
可以在单元格内或列内填入缺失值。
以下示例说明如何在单元中输入值,如下示例说明如何将值归入单元格内:
缺失值的用电量 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
家庭身份证 | 用电量系列 (kWh) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | [30、40、35、NaN、NaN] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | [45,NaN,55] |
用电量,其值使用正向填充进行估算 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
家庭身份证 | 用电量系列 (kWh) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | [30、40、35、35、35] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | [45、45、55] |
以下示例说明如何在列中输入值,如下示例说明如何将值归入列中:
缺失值的家庭日均用电量 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
家庭身份证 | 用电量 (千瓦时) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | 30 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | 40 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | NaN | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | NaN | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | NaN |
家庭日均用电量,使用前向填充法估算值 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
家庭身份证 | 用电量 (千瓦时) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | 30 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | 40 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭_0 | 40 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | 40 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
家庭用品_1 | 40 |
您可以使用以下过程处理缺失值,请按照以下过程处理。
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择 “处理缺失”。
-
对于时间序列输入类型,选择是要处理单元格内部还是列上的缺失值。
-
对于填补此列的缺失值,请指定具有缺失值的列。
-
对于估算值的方法,选择一种方法。
-
通过指定剩余字段来配置转换。
-
选择 “预览” 以生成变换预览。
-
如果您有缺失值,则可以在估算值的方法下指定估算值的方法。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
验证您的时间序列数据的时间戳
您的时间戳数据可能无效。您可以使用验证时间戳函数来确定数据集中的时间戳是否有效。您的时间戳可能由于以下一个或多个原因而无效:
-
您的时间戳列缺少值。
-
您的时间戳列中的值格式不正确。
如果数据集中的时间戳无效,则无法成功执行分析。您可以使用 Data Wrangler 识别无效的时间戳,并了解需要在何处清理数据。
时间序列验证采用以下两种方式之一:
可以在 Data Wrangler 配置为在数据中遇到缺失值,以执行以下操作之一:
-
删除缺失值或无效值的行。
-
识别缺失值或无效值的行。
-
如果它在您的数据集中发现任何缺失或无效的值,则抛出错误。
您可以验证具有timestamp
类型或类型的列上的时间戳。string
如果列的string
类型为,则 Data Wrangler 会将该列的类型转换为timestamp
并执行验证。
您可以使用以下过程验证数据集中的时间戳,请按照以下过程验证:
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择 “验证时间戳”。
-
对于时间戳列,选择时间戳列。
-
对于 “策略”,选择是否要处理丢失的时间戳。
-
(可选)对于输出列,指定输出列的名称。
-
如果日期时间列是针对字符串类型进行格式化的,请选择 “转换为日期时间”。
-
选择 “预览” 以生成变换预览。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
标准化时间序列的长度
如果您将时间序列数据存储为数组,则可以将每个时间序列标准化为相同的长度。标准化时间序列数组的长度可能会使您更容易对数据进行分析。
对于需要固定数据长度的数据转换,您可以对时间序列进行标准化。
许多 ML 算法要求您在使用时间序列数据之前将其扁平化。扁平化时间序列数据就是将时间序列的每个值分成数据集中自己的列。数据集中的列数无法更改,因此需要对时间序列的长度进行标准化,然后将每个数组扁平化为一组特征。
每个时间序列都设置为您指定的时间序列集的分位数或百分位数的长度。例如,您可以拥有三个长度如下长度的序列:
-
3
-
4
-
5
您可以将所有序列的长度设置为长度为第 50 个百分位数的序列的长度。
比您指定的长度短的时间序列数组会添加缺失值。以下是将时间序列标准化为更长长度的示例格式:[2、4、5、NaN、NaN、NaN]。
您可以使用不同的方法来处理缺失值。有关这些方法的信息,请参见处理丢失的时间序列数据。
长度超过您指定长度的时间序列数组将被截断。
您可以使用以下过程标准化时间序列的长度:
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择 “标准化长度”。
-
要标准化列的时间序列长度,请选择一列。
-
(可选)对于输出列,指定输出列的名称。如果没有指定名称,则原地完成转换。
-
如果日期时间列是针对字符串类型进行格式化的,请选择 “转换为日期时间”。
-
选择 Cutoff 分位数并指定一个分位数来设置序列的长度。
-
选择 “展平输出”,将时间序列的值输出到单独的列中。
-
选择 “预览” 以生成变换预览。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
从您的时间序列数据中提取特征
如果您正在对时间序列数据运行分类或回归算法,我们建议在运行算法之前从时间序列中提取特征。提取功能可能会提高算法的性能。
使用以下选项选择从数据中提取要素的方式:
-
使用最小子集指定提取 8 个已知在下游分析中有用的特征。当你需要快速执行计算时,你可以使用最小的子集。当你的机器学习算法存在过度拟合的高风险并且你想为其提供更少的特征时,你也可以使用它。
-
使用高效子集指定提取尽可能多的特征,而无需提取分析中计算密集型的特征。
-
使用 “所有功能” 指定从曲调系列中提取所有特征。
-
使用手动子集选择您认为可以很好地解释数据变化的要素列表。
使用以下步骤从时间序列数据中提取要素。
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择 “提取功能”。
-
对于提取此列的要素,请选择一列。
-
(可选)选择 “扁平化” 将要素输出到单独的列中。
-
对于策略,选择提取要素的策略。
-
选择 “预览” 以生成变换预览。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
使用时间序列数据中的延迟特征
对于许多用例,预测时间序列future 行为的最佳方法是使用其最新行为。
延迟功能的最常见用法如下:
-
收集一些过去的值。例如,对于时间,t + 1,您收集 t、t-1、t-2 和 t-3。
-
收集与数据中季节性行为相对应的值。例如,要预测下午 1:00 餐厅的入住率,您可能需要从前一天下午 1:00 开始使用这些功能。在同一天中午 12:00 或上午 11:00 使用这些功能可能不如使用前几天的功能那么具有预测性。
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择延迟功能。
-
对于生成此列的延迟特征,请选择一列。
-
对于时间戳列,选择包含时间戳的列。
-
对于延迟,指定延迟的持续时间。
-
(可选)使用以下选项之一配置输出:
-
包括整个延迟窗口
-
扁平化输出
-
删除没有历史记录的行
-
-
选择 “预览” 以生成变换预览。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
在时间序列中创建日期时间范围
您的时间序列数据可能没有时间戳。如果您知道观测值是定期进行的,则可以在单独的列中为时间序列生成时间戳。要生成时间戳,请指定开始时间戳的值和时间戳的频率。
例如,您可能有以下关于餐厅顾客数量的时间序列数据。
关于餐厅顾客数量的时间序列数据 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
客户数 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
24 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
40 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
20 |
如果您知道餐厅在下午 5:00 营业,并且每小时进行一次观测,则可以添加与时间序列数据对应的时间戳列。可以在下表中看到时间戳列。
关于餐厅顾客数量的时间序列数据 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
客户数 | 时间戳 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | 下午 1:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 | 下午 2:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
24 | 下午 3:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
40 | 下午 4:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30 | 下午 5:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
20 | 下午 6:00 |
使用以下过程将日期时间范围添加到数据中添加日期时间范围:
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择日期时间范围。
-
对于频率类型,选择用于测量时间戳频率的单位。
-
对于起始时间戳,指定开始时间戳。
-
对于输出列,指定输出列的名称。
-
(可选)使用其余字段配置输出。
-
选择 “预览” 以生成变换预览。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
在时间序列中使用滚动窗口
您可以在一段时间内提取要素。例如,对于时间、t 和时间窗长度为 3,对于表示第 t 个时间戳的行,我们追加从时间序列中提取的时间 t-3、t -2 和 t-1 处的特征。有关提取要素的信息,请参见从您的时间序列数据中提取特征。
您可以使用以下步骤提取一段时间内的要素。
-
打开你的 Data Wrangler 数据流。
-
如果您尚未导入数据集,请在导入数据选项卡下将其导入。
-
在数据流中,在 “数据类型” 下,选择 +,然后选择 “添加转换”。
-
选择添加步骤。
-
选择滚动窗口功能。
-
要为该列生成滚动窗口功能,请选择一列。
-
对于时间戳列,选择包含时间戳的列。
-
(可选)对于输出列,指定输出列的名称。
-
对于窗口大小,指定窗口大小。
-
对于策略,选择提取策略。
-
选择 “预览” 以生成变换预览。
-
选择 “添加” 将转换添加到 Data Wrangler 数据流中。
功能化日期时间
使用 Featurize 日期/时间创建表示日期时间字段的矢量嵌入。要使用这种转换,您的日期时间数据必须采用以下格式之一:
-
描述日期时间的字符串:例如,
"January 1st, 2020, 12:44pm"
. -
Unix 时间戳:Unix 时间戳描述了 1970 年 1 月 1 日的秒数、毫秒数、微秒数或纳秒数。
您可以选择推断日期时间格式并提供日期时间格式。如果您提供日期时间格式,则必须使用 Python 文档
-
最手动且计算速度最快的选项是指定日期时间格式,然后为推断日期时间格式选择 “否”。
-
要减少体力劳动,您可以选择推断日期时间格式,而不指定日期时间格式。它也是一个计算速度很快的操作;但是,假定输入列中遇到的第一个日期时间格式是整个列的格式。如果列中有其他格式,则这些值在最终输出中为 NaN。推断日期时间格式可以为您提供未解析的字符串。
-
如果您不指定格式并选择 “否” 作为推断日期时间格式,则会获得最可靠的结果。所有有效的日期时间字符串都将被解析。但是,此操作可能比此列表中的前两个选项慢一个数量级。
使用此转换时,需要指定一个包含上述格式之一的日期时间数据的输入列。转换会创建一个名为输出列名的输出列。输出列的格式取决于您使用以下内容的配置:
-
矢量:将单列输出为矢量。
-
列:为每个要素创建一个新列。例如,如果输出包含年、月和日,则会为年、月和日创建三个单独的列。
此外,必须选择嵌入模式。对于线性模型和深度网络,我们建议选择循环。对于基于树的算法,我们建议选择序数。
格式化字符串
格式化字符串转换包含标准的字符串格式化操作。例如,您可以使用这些操作来删除特殊字符、规范字符串长度和更新字符串大小写。
此功能组包含以下变换。所有转换都会返回 “输入” 列中字符串的副本,并将结果添加到新的输出列中。
名称 | 函数 |
---|---|
左键盘 |
将带有给定填充字符的字符串左键填充到给定的宽度。如果字符串长于宽度,则返回值将缩短为宽度字符。 |
右侧护垫 |
用给定的填充字符将字符串右键填充到给定的宽度。如果字符串长于宽度,则返回值将缩短为宽度字符。 |
居中(两侧都有衬垫) |
将带有给定填充字符的字符串(在字符串的两边添加边距)按给定宽度进行居中填充。如果字符串长于宽度,则返回值将缩短为宽度字符。 |
在零前面加上 |
用零向左填充数字字符串,最大宽度为给定宽度。如果字符串长于宽度,则返回值将缩短为宽度字符。 |
向左和向右剥离 |
返回删除前导和结尾字符的字符串副本。 |
从左边去除字符 |
返回删除前导字符的字符串副本。 |
从右边去除字符 |
返回删除尾部字符的字符串副本。 |
小写字母 |
将文本中的所有字母转换为小写。 |
大写字母 |
将文本中的所有字母转换为大写。 |
资本化 |
将每个句子中的第一个字母大写。 |
交换机壳 | 将给定字符串的所有大写字符转换为小写字符,将所有小写字符转换为大写字符,然后返回。 |
添加前缀或后缀 |
为字符串列添加前缀和后缀。必须指定前缀和后缀中的至少一个。 |
移除符号 |
从字符串中删除给定符号。所有列出的字符都被移除。默认为空格。 |
处理异常值
机器学习模型对特征值的分布和范围很敏感。异常值或稀有值可能会对模型精度产生负面影响,并导致更长的训练时间。使用此功能组检测和更新数据集中的异常值。
当您定义 Hand le 异常值转换步骤时,用于检测异常值的统计数据是在 Data Wrangler 中定义该步骤时提供的数据上生成的。运行 Data Wrangler 作业时使用相同的统计信息。
使用以下部分了解有关该组包含的变换的更多信息。您指定输出名称,这些变换中的每一个都会生成一个包含结果数据的输出列。
稳健的标准差数字异常值
此变换使用对异常值具有可靠性的统计数据来检测和修复数字要素中的异常值。
必须为用于计算异常值的统计数据定义上分位数和下分位数。您还必须指定标准差的数量,值必须与均值不同才能被视为异常值。例如,如果您为标准差指定 3,则值必须与均值相差超过 3 个标准差才能被视为异常值。
修复方法是在检测到异常值时用于处理异常值的方法。可从以下选项中进行选择:
-
剪辑:使用此选项将异常值裁剪到相应的异常值检测界限。
-
删除:使用此选项从数据框中删除带有异常值的行。
-
无效:使用此选项将异常值替换为无效值。
标准差数字异常值
此变换使用均值和标准差检测并修复数字要素中的异常值。
您可以指定标准差的数量,该值必须与均值不同才能被视为异常值。例如,如果您为标准差指定 3,则值必须与均值相差超过 3 个标准差才能被视为异常值。
修复方法是在检测到异常值时用于处理异常值的方法。可从以下选项中进行选择:
-
剪辑:使用此选项将异常值裁剪到相应的异常值检测界限。
-
删除:使用此选项从数据框中删除带有异常值的行。
-
无效:使用此选项将异常值替换为无效值。
分位数异常值
使用此变换使用分位数检测和修复数值特征中的异常值。您可以定义上分位数和下分位数。所有高于上分位数或低于下分位数的值都被视为异常值。
修复方法是在检测到异常值时用于处理异常值的方法。可从以下选项中进行选择:
-
剪辑:使用此选项将异常值裁剪到相应的异常值检测界限。
-
删除:使用此选项从数据框中删除带有异常值的行。
-
无效:使用此选项将异常值替换为无效值。
最小-最大数值异常值
此变换使用上限和下限阈值检测并修复数值要素中的异常值。如果您知道标记异常值的阈值,请使用此方法。
您可以指定上限阈值和下限阈值,如果值分别高于或低于这些阈值,则它们被视为异常值。
修复方法是在检测到异常值时用于处理异常值的方法。可从以下选项中进行选择:
-
剪辑:使用此选项将异常值裁剪到相应的异常值检测界限。
-
删除:使用此选项从数据框中删除带有异常值的行。
-
无效:使用此选项将异常值替换为无效值。
替换稀有
使用 Replace 稀有变换时,需要指定一个阈值,Data Wrangler 会查找所有满足该阈值的值并将其替换为您指定的字符串。例如,您可能需要使用此转换将列中的所有异常值归类为 “其他” 类别。
-
替换字符串:用来替换异常值的字符串。
-
绝对阈值:如果实例数小于或等于该绝对阈值,则类别很少见。
-
分数阈值:如果实例数小于或等于该分数阈值乘以行数,则类别很少见。
-
最大常用类别:操作后剩余的最大非稀有类别上限。如果阈值筛选的类别不足,则出现次数最多的类别将被归类为不罕见。如果设置为 0(默认),则对类别数量没有硬性限制。
处理缺的值
缺失值在机器学习数据集中很常见。在某些情况下,使用计算值(例如平均值或类别公用值)来估算缺失的数据是适当的。您可以使用 “处理缺失值” 转换组处理缺失值。该组包含以下变换。
填补缺的
使用 “填充缺失” 变换将缺失值替换为您定义的填充值。
缺指缺指
使用 Impute miss ing 变换创建一个新列,其中包含在输入类别和数值数据中找到缺失值的估算值。配置取决于您的数据类型。
对于数值数据,选择估算策略,即用于确定要估算的新值的策略。您可以选择将均值或中位数归入数据集中存在的值。Data Wrangler 使用其计算出的值来估算缺失的值。
对于分类数据,Data Wrangler 使用列中最常见的值来估算缺失值。要填充自定义字符串,请改用 “填充缺失” 变换。
添加缺失指标
使用添加缺失转换指示符来创建新的指示器列,"false"
如果行包含值以及行包含缺失值,"true"
则该列包含布尔值。
Drop 缺了
使用 “删除缺失” 选项从输入列中删除包含缺失值的行。
管理列
您可以使用以下转换来快速更新和管理数据集中的列:
名称 | 函数 |
---|---|
删除列 | 删除列。 |
重复列 | 复制一列。 |
重命名列 | 重命名列。 |
移动列 |
在数据集中移动列的位置。选择将您的列移至数据集的开头或结尾、参考列之前或之后,或移至特定索引。 |
管理行
使用此转换组可以快速对行执行排序和随机排序操作。此组包含以下内容:
-
排序:按给定列对整个数据框进行排序。选中此选项的升序旁边的复选框;否则,取消选中该复选框并使用降序排序。
-
随机播放:随机随机对数据集中的所有行进行随机播放。
管理向量
使用此变换组来合并或展平矢量列。该组包含以下变换。
-
汇编:使用此变换将 Spark 向量和数值数据合并为一列。例如,您可以组合三列:两列包含数值数据,一列包含向量。在输入列中添加要合并的所有列,并为合并的数据指定输出列名称。
-
扁平化:使用此变换来展平包含矢量数据的单列。输入列必须包含 PySpark 向量或类似数组的对象。您可以通过指定检测输出数量的方法来控制创建的列数。例如,如果选择 Lengt h of 第一个向量,则该列中找到的第一个有效向量或数组中的元素数量决定了创建的输出列的数量。所有其他包含太多项的输入向量都将被截断。项目太少的输入会被填充 NaNs。
您还可以指定输出前缀,该前缀用作每个输出列的前缀。
处理数字
使用 “处理数字” 功能组来处理数值数据。该组中的每个标量都是使用 Spark 库定义的。支持以下标量:
-
标准缩放器:通过减去每个值的均值并缩放到单位方差来标准化输入列。要了解更多信息,请参阅的 Spark 文档StandardScaler
。 -
强大的缩放器:使用对异常值具有可靠性的统计数据对输入列进行缩放。要了解更多信息,请参阅的 Spark 文档RobustScaler
。 -
最小最大缩放器:通过将每个功能缩放至给定范围来转换输入列。要了解更多信息,请参阅的 Spark 文档MinMaxScaler
。 -
最大绝对缩放器:通过将每个值除以最大绝对值来缩放输入列。要了解更多信息,请参阅的 Spark 文档MaxAbsScaler
。
采样
导入数据后,您可以使用采样转换器对其进行一个或多个样本。当您使用采样转换器时,Data Wrangler 会对您的原始数据集进行采样。
您可以选择以下示例方法之一:
-
限制:从第一行开始对数据集进行采样,直到您指定的限制。
-
随机化:随机抽取您指定大小的样本。
-
分层:取分层的随机样本。
您可以对随机样本进行分层以确保它代表数据集的原始分布。
您可能正在为多个用例进行数据准备。对于每个用例,您可以采集不同的样本并应用一组不同的转换。
以下过程描述了创建随机样本的过程。
从您的数据中随机抽取样本。
-
选择已导入的数据集右侧的 +。您的数据集的名称位于 + 下方。
-
选择 “添加转换”。
-
选择 Sampling (采样)。
-
对于采样方法,选择采样方法。
-
对于近似样本量,请选择样本中所需的近似观测值数。
-
(可选)为随机种子指定一个整数以创建可重现的样本。
以下过程描述了创建分层样本的过程。
从您的数据中提取分层样本。
-
选择已导入的数据集右侧的 +。您的数据集的名称位于 + 下方。
-
选择 “添加转换”。
-
选择 Sampling (采样)。
-
对于采样方法,选择采样方法。
-
对于近似样本量,请选择样本中所需的近似观测值数。
-
对于 Stratify 列,指定要对其进行分层的列的名称。
-
(可选)为随机种子指定一个整数以创建可重现的样本。
搜索和编辑
使用此部分搜索和编辑字符串中的特定模式。例如,您可以查找和更新句子或文档中的字符串、按分隔符拆分字符串以及查找特定字符串的出现次数。
搜索和编辑支持以下转换。所有转换都会返回 “输入” 列中字符串的副本,并将结果添加到新的输出列中。
名称 | 函数 |
---|---|
查找子字符串 |
返回您搜索的子字符串首次出现的索引,您可以分别在 Start 和 End 处开始和结束搜索。 |
查找子字符串(从右起) |
返回您搜索的子字符串最后一次出现的索引。您可以分别在 “开始” 和 “结束” 处开始和结束搜索。 |
匹配前缀 |
如果字符串包含给定模式,则返回布尔值。模式可以是字符序列或正则表达式。或者,您可以使模式区分大小写。 |
查找所有事件 |
返回一个包含所有给定模式出现次数的数组。模式可以是字符序列或正则表达式。 |
使用正则表达式提取 |
返回与给定正则表达式模式匹配的字符串。 |
在分隔符之间提取 |
返回一个字符串,其中包含在左分隔符和右分隔符之间找到的所有字符。 |
从位置提取 |
返回一个从输入字符串的起始位置开始的字符串,该字符串包含起始位置之前的所有字符加上长度。 |
查找和替换子字符串 |
返回一个字符串,该字符串将给定 Pat ter n(正则表达式)的所有匹配项替换为替换字符串。 |
在分隔符之间替换 |
返回一个字符串,其中在左分隔符第一次出现和右分隔符最后一次出现之间找到的子字符串替换为替换字符串。如果未找到匹配项,则不替换任何内容。 |
从位置替换 |
返回一个字符串,其中的子字符串介于起始位置和起始位置之间,加上长度替换为替换字符串。如果起始位置加上长度大于替换字符串的长度,则输出包含...。 |
将正则表达式转换为缺失的正则表达式 |
将字符串转换为 i |
按分隔符拆分字符串 |
返回输入字符串中的字符串数组,按 Delimiter 分割,最多包含最大拆分次数(可选)。分隔符默认为空格。 |
拆分数据
使用拆分数据转换将您的数据集拆分为两个或三个数据集。例如,您可以将数据集拆分为用于训练模型的数据集和用于测试模型的数据集。您可以确定每次拆分的数据集的比例。例如,如果您要将一个数据集拆分成两个数据集,则训练数据集可以包含 80% 的数据,而测试数据集可以包含 20% 的数据。
将数据拆分成三个数据集使您能够创建训练、验证和测试数据集。您可以通过删除目标列来查看模型在测试数据集上的表现如何。
您的用例决定了每个数据集获得的原始数据集的多少以及用于拆分数据的方法。例如,您可能需要使用分层拆分来确保目标列中观测值在数据集中的分布相同。你可以使用以下分割变换:
-
随机分割 — 每个分割都是原始数据集的随机、非重叠样本。对于较大的数据集,使用随机分割的计算成本可能比有序拆分更长,并且花费的时间更长。
-
有序拆分-根据观测值的顺序拆分数据集。例如,对于 80/20 的训练测试分割,占数据集 80% 的第一个观测值进入训练数据集。最后 20% 的观测结果进入测试数据集。有序拆分可以有效保持拆分之间数据的现有顺序。
-
分层分割-拆分数据集以确保输入列中的观测值数量具有比例表示。对于具有观测值 1、1、1、1、1、1、1、2、2、2、2、2、2、3、3、3、3、3、3、3、3、3、3、3、3 的输入列,80/20 拆分表示大约 80% 的 1、80% 的 2 和 80% 的 3 进入训练集。每种类型的观测结果中约有20%进入测试组。
-
按键拆分-避免使用相同密钥的数据在多次拆分中出现。例如,如果您的数据集的列为 “customer_id”,并且将其用作密钥,则在多次拆分中没有客户 ID。
分割数据后,可以对每个数据集应用其他转换。对于大多数使用案例,它们不是必需的。
Data Wrangler 根据性能计算拆分比例。您可以选择错误阈值来设置分割的精度。较低的错误阈值可以更准确地反映您为分割指定的比例。如果设置更高的错误阈值,则性能会更好,但精度会降低。
要实现完美分割数据,请将错误阈值设置为 0。您可以指定介于 0 到 1 之间的阈值以获得更好的性能。如果您指定的值大于 1,则 Data Wrangler 将把值解释为 1 的值。
如果您的数据集有 10000 行,并且指定了 80/20 分割,误差为 0.001,则您将获得近似于以下结果之一的观测值:
-
训练集中有 8010 个观测值,测试集中有 1990 个观测值
-
训练集中有 7990 个观测值,测试集有 2010 个观测值
前面的示例中测试集的观测值在 8010 到 7990 之间的间隔内。
默认情况下,Data Wrangler 使用随机种子来使拆分可重现。您可以为种子指定不同的值,以创建不同的可重现分割。
将值解析为类型
使用此转换将列转换为新类型。支持的 Data Wrangler 数据类型为:
-
长整型
-
Float
-
布尔值
-
日期,格式为 dd-mm-yyyy,分别表示日、月和年。
-
字符串
验证字符串
使用验证字符串转换来创建一个新列,指示一行文本数据满足指定条件。例如,您可以使用验证字符串转换来验证字符串是否仅包含小写字符。验证字符串支持以下转换。
此转换组中包含以下变换。如果变换输出布尔值,True
则用 a 表示1
,False
用 a 表示0
。
名称 | 函数 |
---|---|
字符串长度 |
|
从 开始 |
|
Ends with |
|
是字母数字的 |
|
是 alpha(字母) |
|
是数字 |
|
是空间 |
|
是标题 |
|
是小写的 |
|
是大写的 |
|
是数字的 |
|
是decim |
|
取消嵌套 JSON 数据
如果您有.csv 文件,则数据集中的值可能是 JSON 字符串。同样,您可能在 Parquet 文件或 JSON 文档的列中嵌套数据。
使用 Flatten 结构化运算符将第一级密钥分成单独的列。第一级密钥是不嵌套在值中的键。
例如,您可能有一个数据集,其中包含一个人物列,其中每个人的人口统计信息存储为 JSON 字符串。JSON 字符串可能与以下内容类似。
"{"seq": 1,"name": {"first": "Nathaniel","last": "Ferguson"},"age": 59,"city": "Posbotno","state": "WV"}"
Flatten 结构化运算符将以下第一级密钥转换为数据集中的其他列:
-
seq
-
name
-
年龄
-
city
-
state
Data Wrangler 将键的值作为值放在列下。以下显示了 JSON 的列名和值。
seq, name, age, city, state 1, {"first": "Nathaniel","last": "Ferguson"}, 59, Posbotno, WV
对于包含 JSON 的数据集中的每个值,Flatten 结构化运算符会为第一级键创建列。要为嵌套键创建列,请再次调用运算符。对于上述示例,调用运算符创建了列:
-
名字_第一
-
姓名_最后一个
以下示例显示了再次调用该操作所产生的数据集。
seq, name, age, city, state, name_first, name_last 1, {"first": "Nathaniel","last": "Ferguson"}, 59, Posbotno, WV, Nathaniel, Ferguson
选择要扁平化的密钥以指定要提取为单独列的第一级密钥。如果您不指定任何密钥,则 Data Wrangler 默认提取所有密钥,则 Data Wrangler 将提取所有密钥:
爆炸数组
使用 Explode 数组将数组的值扩展为单独的输出行。例如,该操作可以获取数组中的每个值 [[1、2、3、]、[4、5、6]、[7、8、9]],然后创建一个包含以下行的新列:
[1, 2, 3] [4, 5, 6] [7, 8, 9]
Data Wrangler 将新列命名为 input_column_name_flatten。
您可以多次调用 Explode 数组操作,将数组的嵌套值放入单独的输出列中。以下示例显示了在带有嵌套数组的数据集上多次调用该操作的结果。
将嵌套数组的值放入单独的列中 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | 数组 | id | 数组_项目 | id | 数组_项目_项目 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | [[猫、狗]、[蝙蝠、青蛙]] | 1 | [猫、狗] | 1 | cat | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 |
[[玫瑰,矮牵牛],[莉莉,雏菊]] |
1 | [蝙蝠、青蛙] | 1 | 狗 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | [玫瑰、矮牵牛] | 1 | bat | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | [莉莉,黛西] | 1 | 青蛙 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | 2 | 玫瑰 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | 2 | 矮牵牛 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | 2 | 莉莉 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | 2 | 黛西 |