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

本教程演示如何从 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)
    

探索语义模型

本教程使用标准示例语义模型 客户盈利性示例.pbix。 有关语义模型的说明,请参阅 Power BI 客户盈利率示例。

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

    fabric.list_datasets()
    

对于此笔记本的其余部分,请使用两个版本的“客户盈利率示例”语义模型:

  • 客户盈利率示例:语义模型来自具有预定义表关系的 Power BI 示例
  • 客户盈利率示例(自动):相同的数据,但关系仅限于 Power BI 自动检测的那些数据。

使用其预定义语义模型提取示例语义模型

  1. 使用 SemPy 的 list_relationships 函数加载预定义并存储在 客户盈利率示例 语义模型中的关系。 此函数将从表格对象模型中列出内容:

    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] 中的 7 个值中的一个不存在于 Product[Product Key]中,这个缺失的键是 50

探索性数据分析是一个令人兴奋的过程,数据清理也是如此。 数据总有一些隐藏的内容,这取决于你查看数据的方式、你想提问的问题等。 语义链接为您提供了可用于实现更多数据价值的新工具。

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