教程:使用语义链接发现语义模型中的关系
本教程演示如何从 Jupyter 笔记本与 Power BI 交互,并通过 SemPy 库帮助检测表之间的关系。
本教程介绍如何:
- 使用语义链接的 Python 库(SemPy)发现语义模型中的关系(Power BI 数据集)。
- 使用支持与 Power BI 集成的 SemPy 组件,并帮助自动执行数据质量分析。 这些组件包括:
- FabricDataFrame - 一种类似 panda 的结构,通过其他语义信息进行了增强。
- 用于将语义模型从 Fabric 工作区拉取到笔记本中的函数。
- 自动评估有关功能依赖关系的假设的函数,以及识别语义模型中关系冲突的函数。
先决条件
获取 Microsoft Fabric 订阅。 或者,注册免费的 Microsoft Fabric 试用版。
登录 Microsoft Fabric。
使用主页左下侧的体验切换器切换到 Fabric。
从左侧导航窗格中选择 工作区 以查找并选择工作区。 此工作区将成为当前工作区。
从 fabric-samples GitHub 存储库下载 Customer Profitability Sample.pbix 和 Customer Profitability Sample (auto).pbix 数据集,并将它们上传到工作区。
在笔记本中继续操作
本教程随附 powerbi_relationships_tutorial.ipynb 笔记本。
若要打开本教程随附的笔记本,请按照 为数据科学教程准备系统 中的说明将笔记本导入工作区。
如果要复制并粘贴此页面中的代码,可以 创建新的笔记本。
在开始运行代码之前,请务必将湖屋附加到笔记本。
设置笔记本
在本部分中,你将使用必要的模块和数据设置笔记本环境。
使用笔记本中的
%pip
内联安装功能从 PyPI 安装SemPy
:%pip install semantic-link
导入稍后会用到的 SemPy 模块:
import sempy.fabric as fabric from sempy.relationships import plot_relationship_metadata from sempy.relationships import find_relationships from sempy.fabric import list_relationship_violations
导入 Pandas 以强制执行有助于格式化输出的配置选项:
import pandas as pd pd.set_option('display.max_colwidth', None)
探索语义模型
本教程使用标准示例语义模型 客户盈利性示例.pbix。 有关语义模型的说明,请参阅 Power BI 的客户盈利率示例。
使用 SemPy 的
list_datasets
函数浏览当前工作区中的语义模型:fabric.list_datasets()
对于此笔记本的其余部分,请使用两个版本的“客户盈利率示例”语义模型:
- 客户盈利率示例:语义模型来自具有预定义表关系的 Power BI 示例
- 客户盈利率示例(自动):相同的数据,但关系仅限于 Power BI 自动检测的那些数据。
使用其预定义语义模型提取示例语义模型
使用 SemPy 的
list_relationships
函数加载预定义并存储在 客户盈利率示例 语义模型中的关系。 此函数将从表格对象模型中列出内容:dataset = "Customer Profitability Sample" relationships = fabric.list_relationships(dataset) relationships
使用 SemPy 的
plot_relationship_metadata
函数将relationships
DataFrame 可视化为图形:plot_relationship_metadata(relationships)
此图显示了此语义模型中表之间的关系的“基本事实”,因为它反映了主题专家在 Power BI 中定义它们的方式。
发现补充关系
如果从 Power BI 自动检测到的关系入手,你将拥有一个较小的数据集。
可视化 Power BI 在语义模型中自动检测到的关系:
dataset = "Customer Profitability Sample (auto)" autodetected = fabric.list_relationships(dataset) plot_relationship_metadata(autodetected)
Power BI 的自动检测遗漏了许多关系。 此外,两个自动检测的关系在语义上不正确:
Executive[ID]
->Industry[ID]
BU[Executive_id]
->Industry[ID]
将关系打印为表:
autodetected
索引 3 和 4 的行中出现了与
Industry
表的不正确关系。 使用此信息删除这些行。删除错误识别的关系。
autodetected.drop(index=[3,4], inplace=True) autodetected
现在,你有了正确但不完整的关系。
使用
plot_relationship_metadata
可视化这些不完整的关系:plot_relationship_metadata(autodetected)
使用 SemPy 的
list_tables
和read_table
函数从语义模型加载所有表:tables = {table: fabric.read_table(dataset, table) for table in fabric.list_tables(dataset)['Name']} tables.keys()
使用
find_relationships
查找表之间的关系,并查看日志输出,以便深入了解此函数的工作原理:suggested_relationships_all = find_relationships( tables, name_similarity_threshold=0.7, coverage_threshold=0.7, verbose=2 )
可视化新发现的关系:
plot_relationship_metadata(suggested_relationships_all)
SemPy 能够检测所有关系。
使用
exclude
参数将搜索限制为以前未标识的其他关系:additional_relationships = find_relationships( tables, exclude=autodetected, name_similarity_threshold=0.7, coverage_threshold=0.7 ) additional_relationships
验证关系
首先,从 Customer Profitability Sample 语义模型加载数据:
dataset = "Customer Profitability Sample" tables = {table: fabric.read_table(dataset, table) for table in fabric.list_tables(dataset)['Name']} tables.keys()
使用
list_relationship_violations
函数检查主键和外键值的重叠情况。 将list_relationships
函数的输出作为输入提供给list_relationship_violations
:list_relationship_violations(tables, fabric.list_relationships(dataset))
关系冲突会提供一些有趣的见解。 例如,
Fact[Product Key]
中的 7 个值中的一个不存在于Product[Product Key]
中,这个缺失的键是50
。
探索性数据分析是一个令人兴奋的过程,数据清理也是如此。 数据总有一些隐藏的内容,这取决于你查看数据的方式、你想提问的问题等。 语义链接为您提供了可用于实现更多数据价值的新工具。
相关内容
查看有关语义链接/SemPy 的其他教程:
- 教程:使用功能依赖项清理数据
- 教程:分析示例语义模型中的功能依赖项
- 教程:从 Jupyter 笔记本中提取和计算 Power BI 度量值
- 教程:使用语义链接 发现 Synthea 数据集中的关系
- 教程:使用 SemPy 和 Great Expectations(GX) 验证数据