使用语义链接检测、探索和验证数据中的函数依赖关系

函数依赖项是表中各列之间的关系,其中一列中的值用于确定另一列中的值。 了解这些依赖项有助于发现数据中的模式和关系,这对于特征工程、数据清理和模型构建非常有用。 函数依赖关系充当有效的不变量,可用于发现并修复可能难以发现的数据质量问题。

在本文中,你将使用 Semantic Link 执行以下操作:

  • 查找 FabricDataFrame 列之间的依赖项
  • 可视化依赖项
  • 识别数据质量问题
  • 可视化数据质量问题
  • 在数据集中的列之间强制实施函数约束

先决条件

  • 转到 Microsoft Fabric 中的数据科学体验。
  • 创建新的笔记本,将代码复制/粘贴到单元格中。
  • 对于 Spark 3.4 及以上版本,使用 Fabric 时,语义链接在默认运行时中可用,无需安装它。 如果使用的是 Spark 3.3 或更低版本,或者想要更新到最新版本的语义链接,则可以运行以下命令: python %pip install -U semantic-link  
  • 将 Lakehouse 添加到笔记本。 对于 Spark 3.4 及以上版本,使用 Fabric 时,语义链接在默认运行时中可用,无需安装。 如果使用的是 Spark 3.3 或更低版本,或者想要更新到最新版本的语义链接,则可以运行以下命令:

python %pip install -U semantic-link  

查找数据中的函数依赖项

SemPy 中的 find_dependencies 函数检测 FabricDataFrame 列之间的函数依赖项。 该函数使用条件熵阈值来发现近似的函数依赖项,其中低条件熵表示列之间的强依赖性。 若要使 find_dependencies 函数更具选择性,可以针对条件熵设置较低的阈值。 较低的阈值意味着只会检测到更强的依赖项。

下面的 Python 代码片段展示了如何使用 find_dependencies

from sempy.fabric import FabricDataFrame
from sempy.dependencies import plot_dependency_metadata
import pandas as pd


df = FabricDataFrame(pd.read_csv("your_data.csv"))

deps = df.find_dependencies()

find_dependencies 函数返回一个 FabricDataFrame,其中检测到列之间的依赖项。 具有 1:1 映射的列将表示为列表。 该函数还尝试通过删除可传递边缘来清除潜在的依赖项。

指定 dropna=True 选项时,将从计算中消除任一列中具有 NaN 值的行。 这可能会导致依赖关系不可传递,如以下示例所示:

A B C
1 1 1
1 1 1
1 NaN 9
2 NaN 2
2 2 2

在某些情况下,在指定 dropna=True 选项时,依赖项链可以形成周期,如以下示例所示:

A B C
1 1 NaN
2 1 NaN
NaN 1 1
NaN 2 1
1 NaN 1
1 NaN 2

可视化数据中的依赖项

在数据集中查找函数依赖项(使用 find_dependencies),可以使用 plot_dependency_metadata 函数可视化依赖项。 此函数从 find_dependencies 获取生成的 FabricDataFrame,并创建列和列组之间的依赖项的视觉展示。

下面的 Python 代码片段展示了如何使用 plot_dependencies

from sempy.fabric import FabricDataFrame
from sempy.dependencies import plot_dependency_metadata
from sempy.samples import download_synthea

download_synthea(which='small')

df = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))

deps = df.find_dependencies()
plot_dependency_metadata(deps)

plot_dependency_metadata 函数生成一个可视化效果,显示列的 1:1 分组。 属于单个组的各列将放入单个单元格中。 如果未找到合适的候选项,则返回空的 FabricDataFrame。

屏幕截图显示 plot_dependencies 函数的输出。

识别数据质量问题

数据质量问题可能以各种形式出现,例如缺失值、不一致或不准确。 识别和解决这些问题对于确保基于数据构建的任何分析或模型的可靠性和有效性至关重要。 检测数据质量问题的一种方法是检查数据集中各列之间的函数依赖项冲突。

list_dependency_violations 函数可帮助识别数据集中各列之间的函数依赖项冲突。 给定决定因子列和依变项列后,此函数会显示违反函数依赖项的值及其各自的匹配项计数。 这可用于检查近似依赖项并识别数据质量问题。

以下代码显示如何使用 list_dependency_violations 函数的示例:

from sempy.fabric import FabricDataFrame
from sempy.samples import download_synthea

download_synthea(which='small')

df = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))

violations = df.list_dependency_violations(determinant_col="ZIP", dependent_col="CITY")

在此示例中,该函数假定 ZIP(决定因子)和 CITY(依变项)列之间存在函数依赖项。 如果数据集存在数据质量问题,例如向多个城市分配了同一个邮政编码,则该函数将输出冲突值:

ZIP CITY count
12345 波士顿 2
12345 Seattle 1

此输出指示相同的邮政编码 (12345) 附加到两个不同的城市(波士顿和西雅图),表明数据集中存在数据质量问题。

list_dependency_violations 函数提供了更多选项来处理缺失值、显示映射到冲突值的值、限制返回的冲突数,以及按计数或决定因子列对结果进行排序。 (TODO:链接到 API 文档)

list_dependency_violations 的输出可帮助识别数据集中的数据质量问题。 但是,必须仔细检查结果,并考虑数据的上下文,以确定解决所发现问题的最合适操作过程。 此操作过程可能涉及进一步的数据清理、验证或探索,以确保分析或模型的可靠性和有效性。

可视化数据质量问题

数据质量问题可能会对基于数据构建的任何分析或模型的可靠性和有效性产生负面影响。 识别和解决这些问题对于确保结果的准确性至关重要。 检测数据质量问题的一种方法是检查数据集中各列之间的函数依赖项冲突。 可视化这些冲突可以更好地了解问题,并帮助你更有效地解决这些问题。

plot_dependency_violations 函数可帮助可视化数据集中各列之间的函数依赖项冲突。 给定决定因子列和依变项列后,此函数以图形格式显示冲突值,使理解数据质量问题的性质和范围变得更加容易。

以下代码显示如何使用 plot_dependency_violations 函数的示例:

from sempy.fabric import FabricDataFrame
from sempy.dependencies import plot_dependency_violations
from sempy.samples import download_synthea

download_synthea(which='small')

df = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))

df.plot_dependency_violations(determinant_col="ZIP", dependent_col="CITY")

在此示例中,该函数假定 ZIP(决定因子)和 CITY(依变项)列之间存在函数依赖项。 如果数据集存在数据质量问题,例如向多个城市分配了同一个邮政编码,则该函数将生成冲突值的图形。

plot_dependency_violations 函数提供了更多选项来处理缺失值、显示映射到冲突值的值、限制返回的冲突数,以及按计数或决定因子列对结果进行排序。 (TODO:链接到 API 文档)

plot_dependency_violations 生成的可视化效果可以帮助你识别数据集中的数据质量问题并了解其性质和范围。 通过检查图形,可以深入了解决定因子列和依变项列之间的关系,并识别数据中可能存在的错误或不一致。

屏幕截图显示 plot_dependency_violations 函数的输出。

强制实施函数约束

数据质量对于确保基于数据集构建的任何分析或模型的可靠性和有效性至关重要。 提高数据质量的一种方法是在数据集中的各列之间强制实施函数约束。 函数约束有助于确保各列之间的关系一致且准确,这可能导致分析或模型中的结果更准确。

drop_dependency_violations 函数可以通过删除违反给定约束的行来帮助在数据集中的各列之间强制实施函数约束。 给定决定因子列和依变项列后,此函数将删除不遵循两列之间的函数约束的值的行。

以下代码显示如何使用 drop_dependency_violations 函数的示例:

from sempy.fabric import FabricDataFrame
from sempy.samples import download_synthea

download_synthea(which='small')

df = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))

cleaned_df = df.drop_dependency_violations(determinant_col="ZIP", dependent_col="CITY")

在此示例中,该函数在 ZIP(决定因子)和 CITY(依变项)列之间强制实施函数约束。 对于决定因子的每个值,将选取依赖项的最常见值,并删除具有其他值的所有行。 例如,如果给定以下数据集:

ZIP CITY
12345 Seattle
12345 波士顿
12345 波士顿
98765 Baltimore
00000 旧金山

将删除 CITY=Seattle 的行,并且函数依赖项 ZIP -> CITY 保存在输出中。

drop_dependency_violations 函数提供用于控制输出详细程度的 verbose 选项。 通过设置 verbose=1,可以看到已删除的行数,verbose=2 允许查看已删除行的整个行内容。

通过使用 drop_dependency_violations 函数,可以在数据集中的各列之间强制实施函数约束,这有助于提高数据质量,并导致分析或模型中的结果更准确。 但是,请务必仔细考虑数据上下文和选择强制实施的函数约束,以确保不会无意中删除数据集中的宝贵信息。