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

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

在本文中,你将使用语义链接执行以下操作:

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

先决条件

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

对于 Spark 3.4 及以上版本,使用 Fabric 时,语义链接在默认运行时中可用,无需安装它。 如果使用的是 Spark 3.3 或更低版本,或者想要更新到最新版本的语义链接,则可以运行以下命令:

%pip install -U semantic-link
``` 

## Find functional dependencies in data

The SemPy `find_dependencies` function detects functional dependencies between the columns of a FabricDataFrame. The function uses a threshold on conditional entropy to discover approximate functional dependencies, where low conditional entropy indicates strong dependence between columns. To make the `find_dependencies` function more selective, you can set a lower threshold on conditional entropy. The lower threshold means that only stronger dependencies will be detected.

This Python code snippet demonstrates how to use `find_dependencies`:

```python
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 函数提供了更多选项来处理缺失值、显示映射到冲突值的值、限制返回的冲突数,以及按计数或决定因子列对结果进行排序。

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 函数提供了更多选项来处理缺失值、显示映射到冲突值的值、限制返回的冲突数,以及按计数或决定因子列对结果进行排序。

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(依赖项)列之间强制实施函数约束。 对于决定因子的每个值,将选取依赖项的最常见值,并删除具有其他值的所有行。 例如,以此数据集为例,CITY=Seattle 的行将被删除,函数依赖项 ZIP - CITY 保留在输出中>

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

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

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