教程:分析语义模型中的功能依赖关系
在本教程中,你将在 Power BI 分析师已经完成的先前工作基础上进行扩展,这些工作已以语义模型(Power BI 数据集)的形式存储。 通过在 Microsoft Fabric 中的 Synapse Data Science 体验中使用 SemPy(预览版),可以分析数据帧列中存在的功能依赖项。 此分析有助于发现非琐碎的数据质量问题,以便获得更准确的见解。
本教程介绍如何执行下列操作:
- 应用域知识来构建有关语义模型中功能依赖关系的假设。
- 熟悉语义链接的 Python 库(SemPy)组件,这些组件支持与 Power BI 集成,并帮助自动执行数据质量分析。 这些组件包括:
- FabricDataFrame - 一种类似 panda 的结构,通过其他语义信息进行了增强。
- 用于将语义模型从 Fabric 工作区拉取到笔记本中的有用函数。
- 有用的函数可自动评估有关功能依赖关系的假设,并确定语义模型中的关系冲突。
先决条件
获取 Microsoft Fabric 订阅。 或者,注册免费的 Microsoft Fabric 试用版。
登录 Microsoft Fabric。
使用主页左侧的体验切换器切换到 Synapse Data Science 体验。
从左侧导航窗格中选择 工作区 以查找并选择工作区。 此工作区将成为当前工作区。
从 fabric-samples GitHub 存储库下载 Customer Profitability Sample.pbix 语义模型,并将其上传到工作区。
在笔记本中继续操作
本教程随附 powerbi_dependencies_tutorial.ipynb 笔记本。
若要打开本教程随附的笔记本,请按照 为数据科学教程准备系统中的说明将笔记本导入工作区。
如果要从此页面复制并粘贴代码,则可以创建新的笔记本。
在开始运行代码之前,请务必将湖屋连接到笔记本。
设置笔记本
在本部分中,你将使用必要的模块和数据设置笔记本环境。
使用笔记本中的
%pip
内联安装功能从 PyPI 安装SemPy
:%pip install semantic-link
导入稍后会用到的模块:
import sempy.fabric as fabric from sempy.dependencies import plot_dependency_metadata
加载和预处理数据
本教程使用标准示例语义模型 客户盈利率示例.pbix。 有关语义模型的说明,请参阅 Power BI的
使用 SemPy 的
read_table
函数将 Power BI 数据加载到 FabricDataFrames 中:dataset = "Customer Profitability Sample" customer = fabric.read_table(dataset, "Customer") customer.head()
将
State
表加载到 FabricDataFrame 中:state = fabric.read_table(dataset, "State") state.head()
虽然此代码的输出类似于 pandas 数据帧,但实际上已初始化名为
FabricDataFrame
的数据结构,该结构支持在 pandas 的基础上执行一些有用的操作。检查
customer
的数据类型:type(customer)
输出确认
customer
的类型为sempy.fabric._dataframe._fabric_dataframe.FabricDataFrame
。'联接
customer
和state
数据帧:customer_state_df = customer.merge(state, left_on="State", right_on="StateCode", how='left') customer_state_df.head()
识别功能依赖项
函数依赖体现为数据帧中两列(或更多列)之间的值的一对多关系。 这些关系可用于自动检测数据质量问题。
在合并的数据帧上运行 SemPy 的
find_dependencies
函数,以标识列中的值之间的任何现有功能依赖关系:dependencies = customer_state_df.find_dependencies() dependencies
使用 SemPy 的
plot_dependency_metadata
函数可视化标识的依赖项:plot_dependency_metadata(dependencies)
如预期的那样,函数依赖项图显示
Customer
列确定某些列,如City
、Postal Code
和Name
。令人惊讶的是,该图不显示
City
和Postal Code
之间的功能依赖关系,可能是因为列之间的关系存在许多冲突。 可以使用 SemPy 的plot_dependency_violations
函数直观显示特定列之间的依赖关系冲突。
浏览数据,寻找质量问题
使用 SemPy 的
plot_dependency_violations
可视化函数绘制图形。customer_state_df.plot_dependency_violations('Postal Code', 'City')
依赖关系冲突的绘图在左侧显示了
Postal Code
的值,在右侧显示了City
的值。 如果存在包含这两个值的行,边缘将左侧的Postal Code
与右侧的City
连接。 边缘使用此类行的计数进行批注。 例如,有两行包含邮政编码 20004,一行包含城市“北塔”,另一行包含城市“华盛顿”。此外,该图还显示了一些冲突和许多空值。
确认
Postal Code
的空值数:customer_state_df['Postal Code'].isna().sum()
50 行的邮政编码为 NA。
删除具有空值的行。 然后,使用
find_dependencies
函数查找依赖项。 请注意额外的参数verbose=1
,该参数可瞥见 SemPy 的内部工作:customer_state_df2=customer_state_df.dropna() customer_state_df2.find_dependencies(verbose=1)
Postal Code
和City
的条件熵为 0.049。 此值指示存在功能依赖项冲突。 在修复违规之前,将条件熵的阈值从默认值0.01
提高到0.05
,这仅仅是为了查看依赖关系。 较低的阈值会导致依赖项减少(或更高的选择性)。将条件萎缩的阈值从默认值
0.01
提高到0.05
:plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
如果你应用了关于哪些实体决定其他实体的值的领域知识,则此依赖关系图会比较准确。
探索检测到的更多数据质量问题。 例如,虚线箭头联接
City
和Region
,指示依赖项只是近似值。 这种近似关系可能意味着存在部分功能依赖关系。customer_state_df.list_dependency_violations('City', 'Region')
仔细查看非空
Region
值导致冲突的每个情况:customer_state_df[customer_state_df.City=='Downers Grove']
结果显示唐纳格罗夫市发生在伊利诺伊州和内布拉斯加州。 然而,Downer's Grove 是伊利诺伊州的一个城市,它不在内布拉斯加州。
看看 Fremont 市:
customer_state_df[customer_state_df.City=='Fremont']
加利福尼亚有一个名为 Fremont 的城市。 然而,对于得克萨斯州,搜索引擎返回 普雷蒙特,而不是弗里蒙特。
看到
Name
和Country/Region
之间的依赖关系冲突也是令人怀疑的,它们在最初的依赖关系冲突图中用虚线表示(在删除具有空值的行之前)。customer_state_df.list_dependency_violations('Name', 'Country/Region')
似乎有一个客户,SDI 设计 存在于两个区域 - 美国和加拿大。 此事件可能不是语义冲突,但可能只是一个不常见的情况。 不过,值得仔细看看:
仔细了解客户 SDI Design:
customer_state_df[customer_state_df.Name=='SDI Design']
进一步的检查表明,它实际上是有着相同名字的两个不同的客户(来自不同行业)。
探索性数据分析是一个令人兴奋的过程,数据清理也是如此。 总有一些东西是这数据在隐藏的,这取决于你如何看待它、你想问什么等。 语义链接为您提供了新的工具,帮助您更好地利用数据。
相关内容
查看有关语义链接/SemPy 的其他教程:
- 教程:使用功能依赖项清理数据
- 教程:从 Jupyter 笔记本中提取和计算 Power BI 度量值
- 教程:使用语义链接 发现语义模型中的关系
- 教程:使用语义链接 发现 Synthea 数据集中的关系
- 教程:使用 SemPy 和 Great Expectations(GX)验证数据