教程:使用语义链接发现语义模型中的关系

本教程演示如何从 Jupyter 笔记本与 Power BI 交互,并通过 SemPy 库检测表之间的关系。

本教程介绍如何执行下列操作:

  • 使用语义链接的 Python 库 (SemPy) 发现语义模型(Power BI 数据集)中的关系。
  • 使用支持与 Power BI 集成的 SemPy 组件,帮助实现数据质量分析自动化。 这些组件包括:
    • FabricDataFrame - 一种类似 panda 的结构,通过其他语义信息进行了增强。
    • 用于将语义模型从 Fabric 工作区拉取到笔记本中的函数。
    • 自动评估有关函数依赖项的假设以及标识语义模型中关系的冲突的函数。

先决条件

  • 选择左侧导航窗格中的“工作区”,找到并选中自己的工作区。 此工作区将成为当前工作区。

  • fabric-samples GitHub 存储库下载 Customer Profitability Sample.pbix 和 Customer Profitability Sample (auto).pbix 数据集,并将它们上传到工作区

在笔记本中继续操作

本教程随附 powerbi_relationships_tutorial.ipynb 笔记本。

若要打开本教程随附的笔记本,请按照让系统为数据科学做好准备教程中的说明操作,将该笔记本导入到工作区。

或者,如果要从此页面复制并粘贴代码,则可以创建新的笔记本

在开始运行代码之前,请务必将湖屋连接到笔记本

设置笔记本

在本部分中,你将使用必要的模块和数据设置笔记本环境。

  1. 使用笔记本中的 %pip 内联安装功能从 PyPI 安装 SemPy

    %pip install semantic-link
    
  2. 导入稍后会用到的 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
    
  3. 导入 pandas 以强制执行有助于格式化输出的配置选项:

    import pandas as pd
    pd.set_option('display.max_colwidth', None)
    

探索语义模型

本教程使用标准示例语义模型Customer Profitability Sample.pbix。 有关语义模型的说明,请参阅 Power BI 的 Customer Profitability 示例

  • 使用 SemPy 的 list_datasets 函数来浏览当前工作区中的语义模型:

    fabric.list_datasets()
    

对于此笔记本的其余部分,请使用两个版本的“Customer Profitability Sample”语义模型:

  • Customer Profitability Sample:该语义模型来自具有预定义表关系的 Power BI 样本
  • 客户盈利能力示例(自动):相同的数据,但关系仅限于 Power BI 会自动检测的数据。

使用其预定义的语义模型提取样本语义模型

  1. 使用 SemPy 的 list_relationships 函数来加载预定义并存储在 Customer Profitability Sample 语义模型中的关系。 此函数从表格对象模型列出:

    dataset = "Customer Profitability Sample"
    relationships = fabric.list_relationships(dataset)
    relationships
    
  2. 使用 SemPy 的 plot_relationship_metadata 函数将 relationships DataFrame 可视化为图形:

    plot_relationship_metadata(relationships)
    

    屏幕截图显示语义模型中表之间的关系绘图。

此图显示了该语义模型中各表之间关系的“基本事实”,因为它反映了主题专家在 Power BI 中定义它们的方式。

发现补充关系

如果从 Power BI 自动检测到的关系开始,你的集会相对较小。

  1. 可视化 Power BI 在语义模型中自动检测到的关系:

    dataset = "Customer Profitability Sample (auto)"
    autodetected = fabric.list_relationships(dataset)
    plot_relationship_metadata(autodetected)
    

    屏幕截图显示 Power BI 在语义模型中自动检测到的关系。

    Power BI 的自动检测遗漏了许多关系。 此外,有两个自动检测的关系在语义上不正确:

    • Executive[ID] ->Industry[ID]
    • BU[Executive_id] ->Industry[ID]
  2. 将关系打印为表:

    autodetected
    

    索引为 3 和 4 的行中出现与 Industry 表的不正确关系。 使用此信息删除这些行。

  3. 放弃错误标识的关系。

    autodetected.drop(index=[3,4], inplace=True)
    autodetected
    

    现在,你有正确但不完整的关系。

  4. 使用 plot_relationship_metadata 方法可视化这些不完整的关系:

    plot_relationship_metadata(autodetected)
    

    屏幕截图显示删除不正确的关系后的关系可视化。

  5. 使用 SemPy 的 list_tablesread_table 函数从语义模型加载所有表:

    tables = {table: fabric.read_table(dataset, table) for table in fabric.list_tables(dataset)['Name']}
    
    tables.keys()
    
  6. 使用 find_relationships 查找表之间的关系,并查看日志输出以获取有关此函数工作原理的见解:

    suggested_relationships_all = find_relationships(
        tables,
        name_similarity_threshold=0.7,
        coverage_threshold=0.7,
        verbose=2
    )
    
  7. 可视化新发现的关系:

    plot_relationship_metadata(suggested_relationships_all)
    

    屏幕截图显示新发现关系的可视化。

    SemPy 能够检测所有关系。

  8. 使用 exclude 参数将搜索限制为以前未标识的其他关系:

    additional_relationships = find_relationships(
        tables,
        exclude=autodetected,
        name_similarity_threshold=0.7,
        coverage_threshold=0.7
    )
    
    additional_relationships
    

验证关系

  1. 首先,从 Customer Profitability Sample 语义模型加载数据:

    dataset = "Customer Profitability Sample"
    tables = {table: fabric.read_table(dataset, table) for table in fabric.list_tables(dataset)['Name']}
    
    tables.keys()
    
  2. 使用 list_relationship_violations 函数检查主键和外键值的重叠情况。 将 list_relationships 功能的函数输出作为 list_relationship_violations 的输入:

    list_relationship_violations(tables, fabric.list_relationships(dataset))
    

    关系冲突会提供一些有趣的见解。 例如,Fact[Product Key] 中七个值的一个不存在于 Product[Product Key],并且缺少的键是 50

探索性数据分析是一个令人兴奋的过程,数据清理也是如此。 数据总是隐藏着一些东西,取决于你怎么看它、问怎样的问题等。 语义链接为你提供了新的工具,可用于更充分地利用数据。

查看有关语义链接/SemPy 的其他教程: