次の方法で共有


Python を使用してセマンティック モデルから読み取り、Power BI で使用できるデータを書き込む

この記事では、Microsoft Fabric の SemPy Python ライブラリを使用して、セマンティック モデルでデータ、メタデータを読み取り、メジャーを評価する方法について説明します。 また、セマンティック モデルが使用できるデータを記述する方法についても学習します。

前提条件

  • Microsoft Fabric のデータ サイエンス エクスペリエンスに移動します。
  • コードをコピーしてセルに貼り付ける 新しいノートブック を作成します。
  • Spark 3.4 以降では、Fabric を使用する場合、セマンティック リンクは既定のランタイムで使用でき、インストールする必要はありません。 Spark 3.3 以前を使用している場合、またはセマンティック リンクの最新バージョンに更新する場合は、次のコマンドを実行できます。 python %pip install -U semantic-link
  • レイクハウスをノートブックに追加します
  • ファブリック サンプル リポジトリのデータセット フォルダーから Customer Profitability Sample.pbix セマンティック モデルをダウンロードし、ローカルに保存します。

ワークスペースにセマンティック モデルをアップロードする

この記事では、Customer Profitability Sample.pbix セマンティック モデルを使用します。 セマンティック モデルは、マーケティング資料を製造する会社を参照します。 これには、さまざまな事業単位の製品、顧客、および収益データが含まれます。

  1. Fabric Data Science で ワークスペース を開きます。
  2. このコンピューターから Import Report、Paginated Report、または Workbook を選択し、顧客収益性サンプル.pbixのセマンティック モデルを選択します。

セマンティック モデルをワークスペースにアップロードするためのインターフェイスのスクリーンショット。

アップロードが完了すると、ワークスペースには、Power BI レポート、ダッシュボード、 および Customer Profitability Sample という名前のセマンティック モデルという 3 つの新しい成果物がワークスペースに含まれます。 この記事の手順は、このセマンティック モデルに依存します。

ワークスペースにアップロードされた Power BI ファイルの項目のスクリーンショット。

Python を使用してセマンティック モデルからデータを読み取る

SemPy Python API は、Microsoft Fabric ワークスペースにあるセマンティック モデルからデータとメタデータを取得できます。 この API はそれらに対してクエリを実行することもできます。

ノートブック、Power BI データセット セマンティック モデル、レイクハウスは、同じワークスペースに配置することも、異なるワークスペースに配置することもできます。 既定では、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 セマンティック モデルから Customer テーブルを読み取ります。

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

    • データは XMLA を使用して取得されます。この場合、少なくとも XMLA 読み取り専用 を有効にする必要があります。
    • 取得可能なデータの量は、セマンティック モデルをホストする容量 SKU の クエリあたりの最大メモリ 数によって制限されます。 - ノートブックを実行する Spark ドライバー ノード (詳細については 、ノード のサイズ を参照してください)。
    • すべての要求で優先順位が低く、Microsoft Azure Analysis Services のパフォーマンスへの影響を最小限に抑え、 対話型の要求として課金されます。
  5. 各顧客の状態と日付に対する Total Revenue メジャーを評価します。

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

    • 既定では、データは XMLA を使用して取得 されないため 、XMLA の読み取り専用を有効にする必要はありません。
    • データは 、Power BI バックエンドの制限の対象ではありません。
    • 取得可能なデータの量は、セマンティック モデルをホストする容量 SKU の クエリあたりの最大メモリ 数によって制限されます。 - ノートブックを実行する Spark ドライバー ノード (詳細については 、ノード のサイズ を参照してください)。
    • すべての要求は 対話型要求として課金されます。
    • 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 クエリを使用して、顧客の状態と日付ごとの 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]))
        """)
    

    • データは XMLA を使用して取得されるため、少なくとも XMLA 読み取り専用を有効にする必要があります
    • 取得可能なデータの量は、Microsoft Azure Analysis Services と Spark ドライバー ノードで使用可能なメモリによって制限されます (詳細については、「ノードサイズ」を参照してください)。
    • すべての要求は低優先度を使用して Analysis Services のパフォーマンスへの影響を最小限に抑え、対話型の要求として課金されます
  8. %%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()
    
  9. 外部ソースから取得したデータにメジャーを追加できます。 この方法では、次の 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 メソッドには、他にも出力の操作に役立つパラメータがあります。 これらのパラメーターには、以下のものがあります。

  • pandas_convert_dtypes: Trueに設定すると、pandas は結果の DataFrame 列を可能な限り最適な dtype にキャストします。 詳細については、 convert_dtypesを参照してください。 このパラメーターをオフにすると、関連テーブルの列間で型の非互換性の問題が発生する可能性があります。 DAX の暗黙的な型変換により、Power BI モデルでこれらの問題が検出されない場合があります。

SemPy read_table では、Power BI が提供するモデル情報も使用されます。

  • multiindex_hierarchies: Trueに設定すると、 Power BI 階層が pandas MultiIndex 構造体に変換されます。

セマンティック モデルで使用できるデータを書き込む

レイクハウスに追加された Spark テーブルは、対応する既定のセマンティック モデルに自動的に追加されます。 この記事では、接続されている Lakehouse にデータを書き込む方法について説明します。 FabricDataFrameは Pandas データフレームと同じ入力データを受け入れます。

from sempy.fabric import FabricDataFrame

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

df_forecast.to_lakehouse_table("ForecastTable")

Power BI では、Lakehouse セマンティック モデルを含む複合セマンティック モデルに ForecastTable テーブルを追加できます。