使用功能依赖项清理数据。 当语义模型(Power BI 数据集)中的一列依赖于另一列时,就会存在功能依赖关系。 例如,列 ZIP code 可以确定列中的值 city 。 函数依赖关系显示为一对多关系,介于两列或多列中 DataFrame的值之间。 本教程使用 Synthea 数据集来说明功能依赖项如何帮助检测数据质量问题。
本教程介绍如何:
- 应用域知识以形成有关语义模型中功能依赖关系的假设。
- 熟悉自动化数据质量分析的语义链接 Python 库 (SemPy) 的组件。 这些组件包括:
-
FabricDataFrame- 具有其他语义信息的 pandas 类结构。 - 自动评估有关功能依赖项的假设并在语义模型中识别冲突的函数。
-
先决条件
获取 Microsoft Fabric 订阅。 或者,注册免费的 Microsoft Fabric 试用版。
登录 Microsoft Fabric。
使用主页左下侧的体验切换器切换到 Fabric。
- 在导航窗格中选择 工作区 ,然后选择工作区将其设置为当前工作区。
在笔记本中继续操作
使用 data_cleaning_functional_dependencies_tutorial.ipynb 笔记本按照本教程进行作。
若要打开本教程随附的笔记本,请按照 为数据科学教程准备系统 中的说明将笔记本导入工作区。
如果要复制并粘贴此页面中的代码,可以 创建新的笔记本。
在开始运行代码之前,请务必将湖屋附加到笔记本。
设置笔记本
在本部分中,将设置笔记本环境。
检查 Spark 版本。 如果在 Microsoft Fabric 中使用 Spark 3.4 或更高版本,则默认包含语义链接,因此无需安装它。 如果使用的是 Spark 3.3 或更早版本,或者想要更新到最新的语义链接,请运行以下命令。
%pip install -U semantic-link导入此笔记本中使用的模块。
import pandas as pd import sempy.fabric as fabric from sempy.fabric import FabricDataFrame from sempy.dependencies import plot_dependency_metadata下载示例数据。 在本教程中,使用合成医疗记录的 Synthea 数据集(为了简单起见,小版本)。
download_synthea(which='small')
浏览数据
FabricDataFrame使用 providers.csv 文件的内容初始化。providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv")) providers.head()通过绘制自动检测到的功能依赖项图来检查 SemPy 函数
find_dependencies的数据质量问题。deps = providers.find_dependencies() plot_dependency_metadata(deps)该图显示确定
IdNAME和ORGANIZATION。 此结果预期Id为唯一。确认这是
Id唯一的。providers.Id.is_unique代码返回
True,以确认Id是唯一的。
深入分析功能依赖项
函数依赖项图还显示,ORGANIZATION 按预期确定 ADDRESS 和 ZIP。 但是,你可能预计 ZIP 也会确定 CITY,但虚线箭头表示依赖项只是近似的,指向数据质量问题。
图形中还有其他特点。 例如,NAME 不确定 GENDER、Id、SPECIALITY或 ORGANIZATION。 其中每一个特点都值得调查。
- 更深入地了解 SemPy 函数
list_dependency_violations之间的ZIPCITY近似关系,以列出冲突:
providers.list_dependency_violations('ZIP', 'CITY')
- 使用 SemPy 的
plot_dependency_violations可视化函数绘制图形。 如果冲突数较小,则此图非常有用:
providers.plot_dependency_violations('ZIP', 'CITY')
依赖项冲突的绘图显示左侧的值 ZIP 和右侧的值 CITY 。 如果存在包含这两个值的行,边缘将绘图左侧的邮政编码与右侧的城市连接起来。 边缘使用此类行的计数进行批注。 例如,有两行包含邮政编码 02747-1242,一行包含城市“NORTH DARTHMOUTH”,另一行包含城市“DARTHMOUTH”,如上一个绘图和以下代码所示:
- 通过运行以下代码确认绘图中的观察结果:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
绘图还显示,在具有
CITY“DARTHMOUTH”的行中,9行的行中有ZIP02747-1262 行。 一行的ZIP02747-1242。 一行包含ZIP02747-2537。 使用以下代码确认这些观察:providers[providers.CITY == 'DARTHMOUTH'].ZIP.value_counts()还有其他与“DARTMOUTH”关联的邮政编码,但这些邮政编码不会显示在依赖项冲突的图中,因为它们不会暗示数据质量问题。 例如,邮政编码“02747-4302”与“DARTMOUTH”唯一关联,不会显示在依赖项冲突关系图中。 通过运行以下代码进行确认:
providers[providers.ZIP == '02747-4302'].CITY.value_counts()
汇总使用 SemPy 检测到的数据质量问题
依赖项冲突关系图显示此语义模型中的多个数据质量问题:
- 某些城市名称是大写的。 使用字符串方法解决此问题。
- 某些城市名称具有限定符(或前缀),例如“North”和“East”。 例如,邮政编码“2128”映射到“EAST BOSTON”一次,一次映射到“波士顿”。 在“北达特茅斯”和“达特茅斯”之间发生类似的问题。 删除这些限定符或将邮政编码映射到最常见的城市。
- 某些城市名称中有拼写错误,例如“PITTSFIELD”与“PITTSFILED”和“NEWBURGPORT”与“NEWBURYPORT”。对于“NEWBURGPORT”,请使用最常见的匹配项修复此拼写错误。 对于“PITTSFIELD”,每次只有一个匹配项,如果没有外部知识或语言模型,自动消除歧义就更加困难。
- 有时,前缀(如“West”)缩写为单字母“W”。如果“W”的所有匹配项都代表“West”,请将“W”替换为“West”。
- 邮政编码“02130”映射到“波士顿”一次,“牙买加平原”一次。 此问题并不容易修复。 通过更多数据,映射到最常见的事件。
清理数据
通过将值更改为标题大小写来修复大写。
providers['CITY'] = providers.CITY.str.title()再次运行冲突检测,以确认存在更少的歧义。
providers.list_dependency_violations('ZIP', 'CITY')
使用 SemPy 的函数手动优化数据,或删除违反列之间的功能约束的 drop_dependency_violations 行。
对于确定变量的每个值, drop_dependency_violations 选择依赖变量的最常见值,并删除具有其他值的所有行。 仅当你确信这种统计启发式导致数据的正确结果时,才应用此作。 否则,请编写自己的代码来处理检测到的冲突。
对
drop_dependency_violations列运行函数ZIPCITY。providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')列出和
CITY. 之间的ZIP任何依赖项冲突。providers_clean.list_dependency_violations('ZIP', 'CITY')
该代码返回一个空列表,指示不再违反功能约束 ZIP -> CITY。
相关内容
请参阅有关语义链接或 SemPy 的其他教程: