教程:分析语义模型中的函数依赖关系

在本教程中,你将继续处理 Power BI 分析师先前完成并以语义模型(Power BI 数据集)形式存储的工作。 通过在 Microsoft Fabric 中的 Synapse Data Science 体验中使用 SemPy(预览版),分析 DataFrame 的列中存在的函数依赖关系。 此分析有助于发现非琐碎的数据质量问题,以获得更准确的见解。

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

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

先决条件

在笔记本中继续操作

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

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

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

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

设置笔记本

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

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

    %pip install semantic-link
    
  2. 执行必要的模块导入,你在稍后会用到它们:

    import sempy.fabric as fabric
    from sempy.dependencies import plot_dependency_metadata
    

加载和预处理数据

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

  1. 使用 SemPy 的 read_table 函数将 Power BI 数据加载到 FabricDataFrames 中:

    dataset = "Customer Profitability Sample"
    customer = fabric.read_table(dataset, "Customer")
    customer.head()
    
  2. State 表加载到 FabricDataFrame 中:

    state = fabric.read_table(dataset, "State")
    state.head()
    

    虽然此代码的输出类似于 pandas DataFrame,但实际上你已初始化了一个名为 FabricDataFrame 的数据结构,它支持 pandas 上的一些实用操作。

  3. 检查 customer 的数据类型:

    type(customer)
    

    输出确认 customer 的类型为 sempy.fabric._dataframe._fabric_dataframe.FabricDataFrame

  4. customerstate DataFrame 联接:

    customer_state_df = customer.merge(state, left_on="State", right_on="StateCode",  how='left')
    customer_state_df.head()
    

识别函数依赖关系

函数依赖关系表现为 DataFrame 中两列(或更多)中的值之间的一对多关系。 这些关系可用于自动检测数据质量问题。

  1. 在合并的 DataFrame 上运行 SemPy 的 find_dependencies 函数,以识别列中的值之间的任何现有函数依赖关系:

    dependencies = customer_state_df.find_dependencies()
    dependencies
    
  2. 使用 SemPy 的 plot_dependency_metadata 函数可视化识别出来的依赖关系:

    plot_dependency_metadata(dependencies)
    

    屏幕截图显示依赖项元数据绘图。

    按照预期,函数依赖关系图显示,Customer 列决定了某些列,例如 CityPostal CodeName

    令人惊讶的是,该图没有显示 CityPostal Code 之间的函数依赖关系,可能是因为列之间的关系存在许多冲突。 可以使用 SemPy 的 plot_dependency_violations 函数可视化特定列之间的依赖关系冲突。

浏览数据,寻找质量问题

  1. 使用 SemPy 的 plot_dependency_violations 可视化函数绘制图形。

    customer_state_df.plot_dependency_violations('Postal Code', 'City')
    

    屏幕截图显示依赖项冲突绘图。

    依赖关系冲突的绘图在左侧显示了 Postal Code 的值,在右侧显示了 City 的值。 如果存在包含这两个值的行,则边缘会将左侧的 Postal Code 与右侧的 City 连接。 边缘使用此类行的计数进行批注。 例如,有两行包含邮政编码 20004,一行包含城市“North Tower”,另一行包含城市“Washington”。

    此外,该图还显示了一些冲突和许多空值。

  2. 确认 Postal Code 的空值数:

    customer_state_df['Postal Code'].isna().sum()
    

    50 行的邮政编码为 NA。

  3. 删除具有空值的行。 然后,使用 find_dependencies 函数查找依赖关系。 请注意额外的参数 verbose=1,它提供了对 SemPy 内部工作原理的一瞥:

    customer_state_df2=customer_state_df.dropna()
    customer_state_df2.find_dependencies(verbose=1)
    

    Postal CodeCity 的条件熵为 0.049。 此值表示存在函数依赖关系冲突。 在解决冲突之前,将条件熵的阈值从默认的 0.01 提高到 0.05,这只是为了查看依赖关系。 较低的阈值会导致依赖关系减少(或选择性增高)。

  4. 将条件熵的阈值从默认的 0.01 提高到 0.05

    plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
    

    具有较高熵阈值的依赖项元数据的绘图。

    如果你应用了关于哪些实体决定其他实体的值的领域知识,则此依赖关系图会比较准确。

  5. 浏览检测到的更多数据质量问题。 例如,一个虚线箭头联接了 CityRegion,表示依赖关系只是近似。 这种近似关系可能意味着存在部分函数依赖关系。

    customer_state_df.list_dependency_violations('City', 'Region')
    
  6. 仔细查看非空 Region 值导致冲突的每个情况:

    customer_state_df[customer_state_df.City=='Downers Grove']
    

    结果显示,Downers Grove 市出现在伊利诺伊州和内布拉斯加州。 然而,Downer's Grove 是伊利诺伊州的一个城市,它不在内布拉斯加州。

  7. 看看 Fremont 市:

    customer_state_df[customer_state_df.City=='Fremont']
    

    加利福尼亚有一个名为 Fremont 的城市。 然而,对于得克萨斯州,搜索引擎返回了 Premont,而不是 Fremont。

  8. 看到 NameCountry/Region 之间的依赖关系冲突也是令人怀疑的,它们在最初的依赖关系冲突图中用虚线表示(在删除具有空值的行之前)。

    customer_state_df.list_dependency_violations('Name', 'Country/Region')
    

    似乎有一个客户,SDI Design,存在于两个地区–美国和加拿大。 此事件可能不是语义冲突,而只是一个不常见的情况。 不过,值得仔细看看:

  9. 仔细了解客户 SDI Design

    customer_state_df[customer_state_df.Name=='SDI Design']
    

    进一步的检查表明,它实际上是有着相同名字的两个不同的客户(来自不同行业)。

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

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