使用 Python 從語意模型讀取和寫入 Power BI 消耗性數據
在本文中,您將瞭解如何使用 Microsoft Fabric 中的 SemPy Python 連結庫來讀取數據和元數據,並在語意模型中評估量值。 您也將瞭解如何撰寫語意模型可取用的數據。
必要條件
取得 Microsoft Fabric 訂用帳戶。 或者,註冊免費的 Microsoft Fabric 試用版。
登入 Microsoft Fabric。
使用首頁左側的體驗切換器,切換至 Synapse 資料科學 體驗。
- 移至 Microsoft Fabric 中的 資料科學 體驗。
- 建立 新的筆記本 ,以將程式代碼複製/貼到儲存格中。
- 針對 Spark 3.4 和更新版本,使用 Fabric 時,預設運行時間提供語意連結,而且不需要安裝它。 如果您使用 Spark 3.3 或更新版本,或想要更新為最新版本的 Semantic Link,您可以執行 命令:
python %pip install -U semantic-link
- 將 Lakehouse 新增至您的筆記本。
- 從網狀架構範例存放庫的數據集資料夾下載客戶獲利率 Sample.pbix 語意模型,並將語意模型儲存在本機。
將語意模型上傳至您的工作區
在本文中,我們會使用 客戶獲利率範例.pbix 語意模型。 此語意模型參考公司製造營銷數據,並包含各種業務單位產品、客戶和對應營收的相關數據。
上傳完成後,您的工作區將會有三個新的成品:Power BI 報表、儀錶板,以及名為「客戶獲利率範例」的語意模型。 您將針對本文中的步驟使用此語意模型。
使用 Python 從語意模型讀取數據
SemPy Python API 可以從位於 Microsoft Fabric 工作區的語意模型擷取數據和元數據,並對其執行查詢。
您的筆記本、語意模型(Power BI 數據集)和 Lakehouse 可以位於相同的工作區或不同的工作區中。 根據預設,SemPy 會嘗試從中存取您的語意模型:
- 如果您已將 Lakehouse 附加至筆記本,則為 Lakehouse 的工作區。
- 筆記本的工作區,如果沒有連結的 Lakehouse。
如果您的語意模型不在 SemPy 嘗試存取的預設工作區中,則必須在呼叫 SemPy 方法時指定語意模型的工作區。
若要從語意模型讀取數據:
列出工作區中可用的語意模型。
import sempy.fabric as fabric df_datasets = fabric.list_datasets() df_datasets
列出客戶獲利率範例語意模型中可用的數據表。
df_tables = fabric.list_tables("Customer Profitability Sample", include_columns=True) df_tables
列出客戶獲利率範例語意模型中定義的 量值 。
提示
在下列程式代碼中,我們已指定 SemPy 的工作區,以用來存取語意模型。 您可以將 取代
Your Workspace
為您上傳語意模型的工作區名稱(從 將語意模型上傳至工作區區 段)。df_measures = fabric.list_measures("Customer Profitability Sample", workspace="Your Workspace") df_measures
現在我們已判斷 Customer 數據表是感興趣的數據表。
從客戶獲利率範例語意模型讀取 Customer 數據表。
df_table = fabric.read_table("Customer Profitability Sample", "Customer") df_table
注意
- 使用 XMLA 擷取數據,因此至少 需要啟用 XMLA 只讀 。
- 可擷取的數據量受限於 裝載語意模型之容量 SKU 的每個查詢 的最大記憶體,以及執行筆記本的 Spark 驅動程式節點(請參閱 節點大小)。
- 所有要求都會使用低優先順序來將對 Microsoft Azure Analysis Services 效能的影響降到最低,並且會以互動式要求計費。
評估每個客戶狀態和日期的總營收量值。
df_measure = fabric.evaluate_measure( "Customer Profitability Sample", "Total Revenue", ["'Customer'[State]", "Calendar[Date]"]) df_measure
注意
- 根據預設,不會使用 XMLA 擷取數據,因此不需要啟用 XMLA 只讀。
- 此外,數據不會受限於Power BI 後端限制。
- 可擷取的數據量受限於 裝載語意模型之容量 SKU 的每個查詢 的最大記憶體,以及執行筆記本的 Spark 驅動程式節點(請參閱 節點大小)。
- 所有要求都會以互動式要求計費。
您可以藉由指定可在特定資料列中的值清單,將篩選新增至量值計算。
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
您也可以使用 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 效能的影響降到最低,並且會以互動式要求的形式計費。
您可以使用數據格 magic 來評估相同的 DAX 查詢,
%%dax
而不需要匯入連結庫。 讓我們執行下方的數據格來載入%%dax
數據格magic。%load_ext sempy
workspace 參數是選擇性的,且遵循與函式工作區參數
evaluate_dax
相同的規則。 數據格 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()
或者,您可以將量值新增至從外部來源擷取的數據。 此方法結合了三項工作:它會將數據行名稱解析為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_table
和 evaluate_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 數據框架相同的輸入數據。
from sempy.fabric import FabricDataFrame
df_forecast = FabricDataFrame({'ForecastedRevenue': [1, 2, 3]})
df_forecast.to_lakehouse_table("ForecastTable")
藉由使用 Power BI,ForecastTable 數據表可以使用 Lakehouse 語意模型新增至複合語意模型。
相關內容
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應