共用方式為


使用 Python 從語意模型讀取並寫入 Power BI 可取用的資料

在本文中,您將瞭解如何使用 Microsoft Fabric 中的 SemPy Python 程式庫來讀取語意模型中的資料、中繼資料,以及評估量值。 您也會學習撰寫語意模型可以使用的資料。

必要條件

  • 移至 Microsoft Fabric 中的資料科學體驗。
  • 建立 新的筆記本 ,將程式碼複製並貼到儲存格中。
  • 若是 Spark 3.4 和更高版本,使用 Fabric 時,預設執行階段可使用語意連結功能,而且不需要安裝。 如果使用的是 Spark 3.3 或以下版本,或者想要更新為最新版本的語意連結,可以執行命令: python %pip install -U semantic-link
  • 將 Lakehouse 新增至您的筆記本
  • 從 fabric-samples 存放庫的 datasets 資料夾下載 Customer Profitability Sample.pbix 語意模型,並將其儲存在本機。

將語意模型上傳至您的工作區

本文使用 客戶獲利率範例.pbix 語意模型。 語意模型參考了一家製造行銷材料的公司。 它包括不同業務單位的產品、客戶和收入資料。

  1. 在 Fabric Data Science 中開啟 您的工作區
  2. 選取 [從此電腦匯入>報表]、[編頁報表] 或 [活頁簿>],然後選取 [客戶獲利能力範例.pbix] 語意模型。

將語意模型上傳至工作區的介面螢幕擷取畫面。

上傳完成後,您的工作區會包含三個新的成品:Power BI 報表、儀錶板,以及名為 Customer Profitability Sample 的語意模型。 本文中的步驟依賴此語意模型。

上傳至工作區之 Power BI 檔案項目的螢幕擷取畫面。

使用 Python 從語意模型讀取資料

SemPy Python API 可以從位於 Microsoft Fabric 工作區的語意模型擷取數據和元數據。 API 也可以對其執行查詢。

您的筆記本、Power BI 資料集語意模型和 Lakehouse 可位於相同的工作區或不同的工作區。 根據預設,SemPy 會嘗試從以下存取語意模型:

  • 如果您已將湖宅連結至筆記本,那麼這就是湖宅的工作區。
  • 如果未連接資料湖倉,則為筆記本的工作區。

如果您的語意模型不在上述任一工作區,則必須在呼叫 SemPy 方法時,指定語意模型的工作區。

若要從語意模型讀取資料,請遵循下列步驟:

  1. 列出工作區中可用的語意模型。

    import sempy.fabric as fabric
    
    df_datasets = fabric.list_datasets()
    df_datasets
    
  2. 列出 Customer Profitability Sample 語意模型中可用的資料表。

    df_tables = fabric.list_tables("Customer Profitability Sample", include_columns=True)
    df_tables
    
  3. 列出 Customer Profitability Sample 語意模型中定義的措施。

    提示

    在下列程式代碼範例中,我們指定了 SemPy 用於存取語意模型的工作區。 您可以將 <Your Workspace> 取代為您上傳語意模型的工作區名稱 (來自 將語意模型上傳至您的工作區區段)。

    df_measures = fabric.list_measures("Customer Profitability Sample", workspace="<Your Workspace>")
    df_measures
    

    在這裡,我們判斷 Customer 數據表是感興趣的數據表。

  4. Customer Profitability Sample 語意模型讀取客戶資料表。

    df_table = fabric.read_table("Customer Profitability Sample", "Customer")
    df_table
    

    注意

    • 使用 XMLA 擷取資料,這至少需要啟用 XMLA 唯讀
    • 可擷取的資料量受限於:- 裝載語意模型之容量 SKU 的 每個查詢記憶體上限 。 - 執行筆記本的 Spark 執行元節點 (請造訪 節點大小 以取得詳細資訊)。
    • 所有要求都會使用低優先順序,以將對 Microsoft Azure Analysis Services 效能的影響降到最低,並以 互動式要求計費。
  5. 評估每個客戶狀態和日期的總營收量值。

    df_measure = fabric.evaluate_measure(
        "Customer Profitability Sample",
        "Total Revenue",
        ["'Customer'[State]", "Calendar[Date]"])
    df_measure
    

    注意

    • 根據預設, 不會 使用 XMLA 擷取資料,因此不需要啟用 XMLA 唯讀。
    • 資料不受 Power BI 後端限制的限制。
    • 可擷取的資料數量受以下限制:- 裝載語意模型之容量 SKU 的 每個查詢記憶體上限 。 - 執行筆記本環境的 Spark driver 節點(請造訪 節點大小 以取得詳細資訊)。
    • 所有請求都以 互動式請求計費。
    • evaluate_dax 式不會自動重新整理語意模型。 如需詳細資訊,請瀏覽 此頁面
  6. 若要將篩選新增至量值計算,請指定特定數據行的允許值清單。

    filters = {
        "State[Region]": ["East", "Central"],
        "State[State]": ["FLORIDA", "NEW YORK"]
    }
    df_measure = fabric.evaluate_measure(
        "Customer Profitability Sample",
        "Total Revenue",
        ["Customer[State]", "Calendar[Date]"],
        filters=filters)
    df_measure
    
  7. 使用 DAX 查詢評估每個客戶狀態和日期的總收入量值。

    df_dax = fabric.evaluate_dax(
        "Customer Profitability Sample",
        """
        EVALUATE SUMMARIZECOLUMNS(
            'State'[Region],
            'Calendar'[Date].[Year],
            'Calendar'[Date].[Month],
            "Total Revenue",
            CALCULATE([Total Revenue]))
        """)
    

    注意

    • 使用 XMLA 擷取數據,因此至少需要啟用 XMLA 只讀
    • 可擷取的數據量受限於 Microsoft azure Analysis Services 和 Spark 驅動程式節點中的可用記憶體數量(如需詳細資訊,請造訪 節點大小
    • 所有要求都會使用低優先順序將 Analysis Services 效能的影響降到最低,並以互動式要求的形式計費
  8. 使用 %%dax cell magic 來評估相同的 DAX 查詢,而不需要匯入程式庫。 執行此儲存格以載入 %%dax cell magic:

    %load_ext sempy
    

    工作區參數是選擇性的。 它會遵循與函式工作區參數 evaluate_dax 相同的規則。

    Python 魔法命令也支援使用 {variable_name} 語法來存取 Python 變數。 若要在 DAX 查詢中使用大括弧,請使用另一個大括弧來跳脫它(例如:EVALUATE {{1}})。

    %%dax "Customer Profitability Sample" -w "<Your Workspace>"
    EVALUATE SUMMARIZECOLUMNS(
        'State'[Region],
        'Calendar'[Date].[Year],
        'Calendar'[Date].[Month],
        "Total Revenue",
        CALCULATE([Total Revenue]))
    

    產生的 FabricDataFrame 可透過 _ 變數取得。 該變數會擷取最後一個執行之單元格的輸出。

    df_dax = _
    
    df_dax.head()
    
  9. 您可以將量值新增至從外部來源擷取的數據。 此方法結合了三項工作:

    • 它會將欄位名稱解析為 Power BI 維度
    • 它會依欄位定義群組
    • 它會篩選度量,並忽略指定語意模型中無法解析的任何欄位名稱(如需詳細資訊,請造訪支援的資源 DAX 語法)。
    from sempy.fabric import FabricDataFrame
    
    df = FabricDataFrame({
            "Sales Agent": ["Agent 1", "Agent 1", "Agent 2"],
            "Customer[Country/Region]": ["US", "GB", "US"],
            "Industry[Industry]": ["Services", "CPG", "Manufacturing"],
        }
    )
    
    joined_df = df.add_measure("Total Revenue", dataset="Customer Profitability Sample")
    joined_df
    

特殊參數

SemPy read_tableevaluate_measure 方法有可用來操作輸出的更多參數。 這些參數包括:

  • pandas_convert_dtypes:如果設定為 True,pandas 會將產生的 DataFrame 資料行轉換成最佳 dtype。 在 convert_dtypes中了解更多信息。 如果關閉此參數,則相關資料表的資料行之間可能會發生類型不相容問題。 Power BI 模型可能無法偵測到這些問題,因為 DAX 隱含類型轉換

SemPy read_table 也會使用 Power BI 提供的模型資訊。

  • multiindex_hierarchies:如果設定為 True,則會將 Power BI 階層 轉換成 pandas MultiIndex 結構。

寫入語意模型可取用的資料

新增至 Lakehouse 的 Spark 資料表會自動新增至對應的預設語意模型。 本文示範如何將資料寫入附加的 Lakehouse。 FabricDataFrame 接受與 Pandas 資料框相同的輸入資料。

from sempy.fabric import FabricDataFrame

df_forecast = FabricDataFrame({'ForecastedRevenue': [1, 2, 3]})

df_forecast.to_lakehouse_table("ForecastTable")

使用 Power BI,ForecastTable 資料表可以新增至包含 Lakehouse 語意模型的複合語意模型。