Python を使用してセマンティック モデルから読み取り、Power BI で使用できるデータを書き込む
この記事では、Microsoft Fabric の SemPy Python ライブラリを使用して、セマンティック モデルでデータとメタデータを読み取り、メジャーを評価する方法について説明します。 また、セマンティック モデルで使用できるデータを書き込む方法についても説明します。
前提条件
Microsoft Fabric サブスクリプションを取得します。 または、無料の Microsoft Fabric 試用版にサインアップします。
Microsoft Fabric にサインインします。
ホーム ページの左側にある環境スイッチャーを使って、Synapse Data Science 環境に切り替えます。
- Microsoft Fabric の Data Science エクスペリエンスにアクセスします。
- 新しいノートブックを作成して、コードをコピーしてセルに貼り付けます
- Spark 3.4 以降では、Fabric を使用する場合、セマンティック リンクは既定のランタイムで使用でき、インストールする必要はありません。 Spark 3.3 以前を使用している場合、またはセマンティック リンクの最新バージョンに更新する場合は、次のコマンドを実行できます。
python %pip install -U semantic-link
- レイクハウスをノートブックに追加します
- fabric-samples リポジトリの datasets フォルダーから Customer Profitability Sample.pbix セマンティック モデルをダウンロードし、セマンティック モデルをローカルに保存します
ワークスペースにセマンティック モデルをアップロードする
この記事では、Customer Profitability Sample.pbix セマンティック モデルを使用します。 このセマンティック モデルは、企業の製造マーケティング資料を参照します。 これには、さまざまな事業単位の製品、顧客、および対応する収益データが含まれています。
- Fabric Data Science でワークスペースを開きます
- [アップロード] > [参照] を選択し、Customer Profitability Sample.pbix セマンティック モデルを選択します。
アップロードが完了すると、ワークスペースには、Power BI レポート、ダッシュボード、Customer Profitability Sample という名前のセマンティック モデルという 3 つの新しいアーティファクトが表示されます。 この記事の手順は、そのセマンティック モデルに依存しています。
Python を使用してセマンティック モデルからデータを読み取る
SemPy Python API は、Microsoft Fabric ワークスペースにあるセマンティック モデルからデータとメタデータを取得できます。 この API はそれらに対してクエリを実行することもできます。
ノートブック、Power BI データセット セマンティック モデル、レイクハウスは、同じワークスペースに配置することも、異なるワークスペースに配置することもできます。 既定では、SemPy は次の場所からセマンティック モデルへのアクセスを試みます。
- ノートブックにレイクハウスをアタッチした場合は、レイクハウスのワークスペース。
- レイクハウスがアタッチされていない場合は、ノートブックのワークスペース。
セマンティック モデルがこれらのワークスペースのいずれにも配置されていない場合は、SemPy メソッドを呼び出すときにセマンティック モデルのワークスペースを指定する必要があります。
セマンティック モデルからデータを読み取るには、次のようにします。
ワークスペース内で使用可能なセマンティック モデルを一覧表示します。
import sempy.fabric as fabric df_datasets = fabric.list_datasets() df_datasets
Customer Profitability Sample セマンティック モデルで使用できるテーブルを一覧表示します。
df_tables = fabric.list_tables("Customer Profitability Sample", include_columns=True) df_tables
Customer Profitability Sample セマンティック モデルで定義されているメジャーを一覧表示します。
ヒント
次のサンプル コードでは、SemPy がセマンティック モデルにアクセスするために使用するワークスペースが指定されています。
Your Workspace
は、([ワークスペースにセマンティック モデルをアップロードする] セクションで) セマンティック モデルをアップロードしたワークスペースの名前に置き換えることができます。df_measures = fabric.list_measures("Customer Profitability Sample", workspace="Your Workspace") df_measures
ここでは、Customer テーブルが目的のテーブルであると判断しました。
Customer Profitability Sample セマンティック モデルから Customer テーブルを読み取ります。
df_table = fabric.read_table("Customer Profitability Sample", "Customer") df_table
Note
- データは XMLA を使用して取得されます。 そのためには、少なくとも XMLA 読み取り専用を有効にする必要があります。
- 取得可能なデータの量は、セマンティック モデルをホストする容量 SKU のクエリあたりの最大メモリ、ノートブックを実行している Spark ドライバー ノード (詳細については、「ノード サイズ」を参照してください) によって制限されます。
- すべての要求では、低優先度を使用して Microsoft Azure Analysis Services のパフォーマンスへの影響を最小限に抑え、対話型要求として課金されます。
各顧客の状態と日付に対する Total Revenue メジャーを評価します。
df_measure = fabric.evaluate_measure( "Customer Profitability Sample", "Total Revenue", ["'Customer'[State]", "Calendar[Date]"]) df_measure
Note
- 既定では、データ 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 クエリを使用して、顧客の状態と日付ごとに Total Revenue メジャーを評価することもできます。
df_dax = fabric.evaluate_dax( "Customer Profitability Sample", """ EVALUATE SUMMARIZECOLUMNS( 'State'[Region], 'Calendar'[Date].[Year], 'Calendar'[Date].[Month], "Total Revenue", CALCULATE([Total Revenue])) """)
Note
- データは XMLA を使用して取得されるため、少なくとも XMLA 読み取り専用を有効にする必要があります
- 取得可能なデータの量は、Microsoft Azure Analysis Services と Spark ドライバー ノードで使用可能なメモリによって制限されます (詳細については、「ノードサイズ」を参照してください)。
- すべての要求は低優先度を使用して Analysis Services のパフォーマンスへの影響を最小限に抑え、対話型の要求として課金されます
%%dax
セル マジックを使用して、同じ DAX クエリを評価します。ライブラリをインポートする必要はありません。 このセルを実行して、%%dax
セルマジックを読み込みます。%load_ext sempy
ワークスペース パラメーターは省略可能です。
evaluate_dax
関数のワークスペース パラメーターと同じルールに従います。セル マジックでは、
{variable_name}
構文を使用した Python 変数へのアクセスもサポートされています。 DAX クエリで中かっこを使用するには、もう 1 つの中かっこでエスケープします (例: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()
外部ソースから取得したデータにメジャーを追加できます。 この方法では、次の 3 つのタスクを組み合わせます。
- 列名を 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" の場合、pandas は結果の DataFrame 列を最適な dtypeconvert_dtypes にキャストします。 このパラメーターをオフにすると、関連テーブルの列間で型の非互換性の問題が発生する可能性があります。Power BI モデルでは、DAX の暗黙的な型変換により、これらの問題が検出されない可能性があります。
SemPy read_table
では、Power BI が提供するモデル情報も使用されます。
multiindex_hierarchies
: "True" の場合、Power BI 階層を pandas MultiIndex 構造体に変換します。
セマンティック モデルで使用できるデータを書き込む
レイクハウスに追加された Spark テーブルは、対応する既定のセマンティック モデルに自動的に追加されます。 この例では、アタッチされているレイクハウスにデータを書き込む方法を示します。 FabricDataFrame は pandas DataFrames と同じ入力データを受け入れます。
from sempy.fabric import FabricDataFrame
df_forecast = FabricDataFrame({'ForecastedRevenue': [1, 2, 3]})
df_forecast.to_lakehouse_table("ForecastTable")
Power BI を使用すると、レイクハウス セマンティック モデルを使用して ForecastTable テーブルを複合セマンティック モデルに追加できます。