共用方式為


使用 Python 從語意模型讀取和寫入 Power BI 消耗性資料

在本文中,您將了解如何使用 Microsoft Fabric 中的 SemPy Python 程式庫,讀取資料和中繼資料,並在語意模型中評估量值。 您也將了解如何撰寫語意模型可取用的資料。

必要條件

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

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

在本文中,我們會使用 Customer Profitability Sample.pbix 語意模型。 此語意模型參考公司製造行銷資料,並包含各種營業單位的產品、客戶和對應收入的相關資料。

  1. 在 Fabric 資料科學中開啟工作區
  2. 選取 [上傳 > 瀏覽],然後選取 [Customer Profitability Sample.pbix] 語意模型。

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

上傳完成後,您的工作區將會有三個新的成品:Power BI 報表、儀表板,以及名為 Customer Profitability Sample 的語意模型。 您將針對本文中的步驟來使用此語意模型。

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

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

SemPy Python API 可以從位於 Microsoft Fabric 工作區的語意模型擷取資料和中繼資料,並對其執行查詢。

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

  • 如果您將 Lakehouse 連結至筆記本,則為 Lakehouse 的工作區。
  • 如果沒有連結 Lakehouse,則為筆記本的工作區。

如果您的語意模型不在上述任一工作區,則必須在呼叫 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
    

    現在我們已判定客戶資料表是感興趣的資料表。

  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
    

    注意

  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
    

    workspace 參數是選擇性的,且遵循與 evaluate_dax 函數工作區參數相同的規則。 cell magic 也支援使用 {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 方法有可用來操作輸出的更多參數。 這些參數包括:

  • fully_qualified_columns:如果值為 "True",則方法會以 TableName[ColumnName] 格式傳回資料行名稱。
  • num_rows:結果中要輸出的資料列數目。
  • pandas_convert_dtypes:如果值為 "True",則產生的 DataFrame 資料行會使用 pandas convert_dtypes 轉換成最佳可能的 dtype。 如果關閉此參數,則相關資料表列之間可能會產生類型不相容問題,由於 DAX 隱含類型轉換的關係,Power BI 模型中可能無法偵測到這些問題。

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

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

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

新增至 Lakehouse 的 Spark 資料表會自動新增至對應的預設語意模型。 此範例示範了如何將資料寫入連結的 Lakehouse。 FabricDataFrame 接受與 Pandas DataFrame 相同的輸入資料。

from sempy.fabric import FabricDataFrame

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

df_forecast.to_lakehouse_table("ForecastTable")

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