Freigeben über


Tutorial: Überprüfen von Daten mithilfe von SemPy und Great Expectations (GX)

In diesem Tutorial erfahren Sie, wie Sie SemPy zusammen mit Great Expectations (GX) verwenden, um die Datenüberprüfung für Power BI-Semantikmodelle durchzuführen.

In diesem Tutorial lernen Sie:

  • Überprüfen der Einschränkungen für ein Dataset in Ihrem Fabric-Arbeitsbereich mit der Fabric-Datenquelle von Great Expectations (basierend auf semantischer Verknüpfung).
    • Konfigurieren eines Datenkontexts, von Datenressourcen und Erwartungen in GX.
    • Anzeigen von Überprüfungsergebnissen mit einem GX-Prüfpunkt.
  • Verwenden einer semantischen Verknüpfung zum Analysieren von Rohdaten.

Voraussetzungen

  • Wählen Sie im linken Navigationsbereich Arbeitsbereiche aus, um Ihren Arbeitsbereich zu suchen und auszuwählen. Dieser Arbeitsbereich wird zu Ihrem aktuellen Arbeitsbereich.
  • Laden Sie die Datei Retail Analysis Sample PBIX.pbix herunter.
  • Verwenden Sie in Ihrem Arbeitsbereich die Schaltfläche Hochladen, um die Datei Retail Analysis Sample PBIX.pbix in den Arbeitsbereich hochzuladen.

Notebook für das Tutorial

great_expectations_tutorial.ipynb ist das Notebook, das dieses Tutorial begleitet.

Um das zugehörige Notebook für dieses Tutorial zu öffnen, befolgen Sie die Anweisungen unter Vorbereiten Ihres Systems für Data-Science-Tutorials zum Importieren des Notebooks in Ihren Arbeitsbereich.

Wenn Sie den Code lieber von dieser Seite kopieren und einfügen möchten, können Sie auch ein neues Notebook erstellen.

Fügen Sie unbedingt ein Lakehouse an das Notebook an, bevor Sie mit der Ausführung von Code beginnen.

Einrichten des Notebooks

In diesem Abschnitt richten Sie eine Notebookumgebung mit den erforderlichen Modulen und Daten ein.

  1. Installieren Sie SemPy und die entsprechenden Great Expectations-Bibliotheken von PyPI mithilfe der Inlineinstallationsfunktion %pip im Notebook.
# install libraries
%pip install semantic-link great-expectations great_expectations_experimental great_expectations_zipcode_expectations

# load %%dax cell magic
%load_ext sempy
  1. Importieren Sie ggf. die Module, die Sie später benötigen:
import great_expectations as gx
from great_expectations.expectations.expectation import ExpectationConfiguration
from great_expectations_zipcode_expectations.expectations import expect_column_values_to_be_valid_zip5

Einrichten eines GX-Datenkontexts und einer Datenquelle

Um die ersten Schritte mit Great Expectations auszuführen, müssen SIe zunächst einen Datenkontext in GX einrichten. Der Kontext dient als Einstiegspunkt für GX-Vorgänge und enthält alle relevanten Konfigurationen.

context = gx.get_context()

Sie können nun Ihr Fabric-Dataset diesem Kontext als Datenquelle hinzufügen, um mit der Interaktion mit den Daten zu beginnen. In diesem Tutorial wird ein standardmäßiges Power BI-Beispielsemantikmodell (Retail Analysis Sample .pbix file) verwendet.

ds = context.sources.add_fabric_powerbi("Retail Analysis Data Source", dataset="Retail Analysis Sample PBIX")

Angeben von Datenressourcen

Definieren Sie Datenressourcen, um die Teilmenge der Daten anzugeben, mit denen Sie arbeiten möchten. Die Ressource kann so einfach wie vollständige Tabellen oder so komplex wie eine benutzerdefinierte DAX-Abfrage (Data Analysis Expressions) sein.

Hier fügen Sie mehrere Ressourcen hinzu:

  • Power BI-Tabelle
  • Power BI-Measure
  • Benutzerdefinierte DAX-Abfrage
  • DMV-Abfrage (Dynamic Management View, dynamische Verwaltungssicht)

Power BI-Tabelle

Fügen Sie eine Power BI-Tabelle als Datenressource hinzu.

ds.add_powerbi_table_asset("Store Asset", table="Store")

Power BI-Measure

Wenn Ihr Dataset vorkonfigurierte Measures enthält, fügen Sie die Measures als Ressourcen nach einer ähnlichen API zum evaluate_measure-Element von SemPy hinzu.

ds.add_powerbi_measure_asset(
    "Total Units Asset",
    measure="TotalUnits",
    groupby_columns=["Time[FiscalYear]", "Time[FiscalMonth]"]
)

DAX

Wenn Sie eigene Measures definieren oder mehr Kontrolle über bestimmte Zeilen haben möchten, können Sie eine DAX-Ressource mit einer benutzerdefinierten DAX-Abfrage hinzufügen. Hier definieren wir ein Total Units Ratio-Measure, indem wir zwei bestehende Measures unterteilen.

ds.add_powerbi_dax_asset(
    "Total Units YoY Asset",
    dax_string=
    """
    EVALUATE SUMMARIZECOLUMNS(
        'Time'[FiscalYear],
        'Time'[FiscalMonth],
        "Total Units Ratio", DIVIDE([Total Units This Year], [Total Units Last Year])
    )    
    """
)

DMV-Abfrage

In einigen Fällen kann es hilfreich sein, DMV-Berechnungen (dynamische Verwaltungssicht) im Rahmen des Datenüberprüfungsprozesses zu verwenden. Sie können beispielsweise die Anzahl der Verstöße gegen die referenzielle Integrität innerhalb Ihres Datasets nachverfolgen. Weitere Informationen finden Sie unter Clean data = faster reports.

ds.add_powerbi_dax_asset(
    "Referential Integrity Violation",
    dax_string=
    """
    SELECT
        [Database_name],
        [Dimension_Name],
        [RIVIOLATION_COUNT]
    FROM $SYSTEM.DISCOVER_STORAGE_TABLES
    """
)

Erwartungen

Um den Ressourcen bestimmte Einschränkungen hinzuzufügen, müssen Sie zuerst Erwartungssammlungen konfigurieren. Nachdem Sie einzelne Erwartungen zu jeder Sammlung hinzugefügt haben, können Sie anfangs eingerichteten Datenkontext mit der neuen Sammlung aktualisieren. Eine vollständige Liste der verfügbaren Erwartungen finden Sie im GX-Erwartungskatalog.

Beginnen Sie, indem Sie die Sammlung „Retail Store Suite“ mit zwei Erwartungen hinzufügen:

  • gültige Postleitzahl
  • Tabelle mit einer Zeilenanzahl zwischen 80 und 200
suite_store = context.add_expectation_suite("Retail Store Suite")

suite_store.add_expectation(ExpectationConfiguration("expect_column_values_to_be_valid_zip5", { "column": "PostalCode" }))
suite_store.add_expectation(ExpectationConfiguration("expect_table_row_count_to_be_between", { "min_value": 80, "max_value": 200 }))

context.add_or_update_expectation_suite(expectation_suite=suite_store)

TotalUnits-Measure

Fügen Sie die Sammlung „Retail Measure Suite“ mit einer Erwartung hinzu:

  • Spaltenwerte müssen größer als 50.000 sein
suite_measure = context.add_expectation_suite("Retail Measure Suite")
suite_measure.add_expectation(ExpectationConfiguration(
    "expect_column_values_to_be_between", 
    {
        "column": "TotalUnits",
        "min_value": 50000
    }
))

context.add_or_update_expectation_suite(expectation_suite=suite_measure)

DAX Total Units Ratio

Fügen Sie die Sammlung „Retail DAX Suite“ mit einer Erwartung hinzu:

  • Spaltenwerte für das Verhältnis von Einheiten insgesamt sollten zwischen 0,8 und 1,5 liegen
suite_dax = context.add_expectation_suite("Retail DAX Suite")
suite_dax.add_expectation(ExpectationConfiguration(
    "expect_column_values_to_be_between", 
    {
        "column": "[Total Units Ratio]",
        "min_value": 0.8,
        "max_value": 1.5
    }
))

context.add_or_update_expectation_suite(expectation_suite=suite_dax)

Verstöße gegen die referentielle Integrität (DMV)

Fügen Sie die Sammlung „Retail DMV Suite“ mit einer Erwartung hinzu:

  • RIVIOLATION_COUNT muss auf 0 festgelegt sein
suite_dmv = context.add_expectation_suite("Retail DMV Suite")
# There should be no RI violations
suite_dmv.add_expectation(ExpectationConfiguration(
    "expect_column_values_to_be_in_set", 
    {
        "column": "RIVIOLATION_COUNT",
        "value_set": [0]
    }
))
context.add_or_update_expectation_suite(expectation_suite=suite_dmv)

Überprüfen

Um die angegebenen Erwartungen tatsächlich für die Daten auszuführen, erstellen Sie zuerst einen Prüfpunkt, und fügen Sie ihn dem Kontext hinzu. Weitere Informationen zur Prüfpunktkonfiguration finden Sie im Artikel zum Datenüberprüfungsworkflow.

checkpoint_config = {
    "name": f"Retail Analysis Checkpoint",
    "validations": [
        {
            "expectation_suite_name": "Retail Store Suite",
            "batch_request": {
                "datasource_name": "Retail Analysis Data Source",
                "data_asset_name": "Store Asset",
            },
        },
        {
            "expectation_suite_name": "Retail Measure Suite",
            "batch_request": {
                "datasource_name": "Retail Analysis Data Source",
                "data_asset_name": "Total Units Asset",
            },
        },
        {
            "expectation_suite_name": "Retail DAX Suite",
            "batch_request": {
                "datasource_name": "Retail Analysis Data Source",
                "data_asset_name": "Total Units YoY Asset",
            },
        },
        {
            "expectation_suite_name": "Retail DMV Suite",
            "batch_request": {
                "datasource_name": "Retail Analysis Data Source",
                "data_asset_name": "Referential Integrity Violation",
            },
        },
    ],
}
checkpoint = context.add_checkpoint(
    **checkpoint_config
)

Führen Sie nun den Prüfpunkt aus, und extrahieren Sie die Ergebnisse als Pandas-Datenrahmen zur einfachen Formatierung.

result = checkpoint.run()

Verarbeiten Sie die Ergebnisse, und geben Sie sie aus.

import pandas as pd

data = []

for run_result in result.run_results:
    for validation_result in result.run_results[run_result]["validation_result"]["results"]:
        row = {
            "Batch ID": run_result.batch_identifier,
            "type": validation_result.expectation_config.expectation_type,
            "success": validation_result.success
        }

        row.update(dict(validation_result.result))
        
        data.append(row)

result_df = pd.DataFrame.from_records(data)    

result_df[["Batch ID", "type", "success", "element_count", "unexpected_count", "partial_unexpected_list"]]

In der Tabelle sind die Validierungsergebnisse dargestellt.

Anhand dieser Ergebnisse können Sie sehen, dass alle Ihre Erwartungen die Überprüfung bestanden haben, mit Ausnahme von „Total Units YoY Asset“, die Sie über eine benutzerdefinierte DAX-Abfrage definiert haben.

Diagnose

Mithilfe der semantischen Verknüpfung können Sie die Quelldaten abrufen, um zu verstehen, welche Jahre genau außerhalb des zulässigen Bereichs liegen. Die semantische Verknüpfung bietet einen Inline-Magic-Befehl zum Ausführen von DAX-Abfragen. Verwenden Sie die semantische Verknüpfung, um dieselbe Abfrage auszuführen, die Sie an die GX-Datenressource übergeben haben, und die resultierenden Werte zu visualisieren.

%%dax "Retail Analysis Sample PBIX"

EVALUATE SUMMARIZECOLUMNS(
    'Time'[FiscalYear],
    'Time'[FiscalMonth],
    "Total Units Ratio", DIVIDE([Total Units This Year], [Total Units Last Year])
)

In der Tabelle sind die Ergebnisse der DAX-Abfragezusammenfassung aufgeführt.

Speichern Sie diese Ergebnisse in einem Datenrahmen.

df = _

Stellen Sie die Ergebnisse dar.

import matplotlib.pyplot as plt

df["Total Units % Change YoY"] = (df["[Total Units Ratio]"] - 1)

df.set_index(["Time[FiscalYear]", "Time[FiscalMonth]"]).plot.bar(y="Total Units % Change YoY")

plt.axhline(0)

plt.axhline(-0.2, color="red", linestyle="dotted")
plt.axhline( 0.5, color="red", linestyle="dotted")

None

Plot zeigt die Ergebnisse der DAX-Abfragezusammenfassung an.

Im Plot sehen Sie, dass April und Juli etwas außerhalb des Bereichs lagen. Sie können dann weitere Schritte zur Untersuchung ausführen.

Speichern der GX-Konfiguration

Da sich die Daten in Ihrem Dataset im Laufe der Zeit ändern, sollten Sie die soeben ausgeführten GX-Überprüfungen erneut ausführen. Derzeit ist der Datenkontext (mit verbundenen Datenressourcen, Erwartungssammlungen und Prüfpunkt) kurzlebig, kann jedoch für die zukünftige Verwendung in einen Dateikontext konvertiert werden. Alternativ können Sie einen Dateikontext instanziieren (siehe Instanziieren eines Datenkontexts).

context = context.convert_to_file_context()

Nachdem Sie den Kontext gespeichert haben, kopieren Sie nun das Verzeichnis gx in Ihr Lakehouse.

Wichtig

In dieser Zelle wird davon ausgegangen, dass Sie dem Notebook ein Lakehouse hinzugefügt haben. Wenn kein Lakehouse angefügt ist, wird kein Fehler angezeigt, aber Sie können den Kontext später auch nicht abrufen. Wenn Sie jetzt ein Lakehouse hinzufügen, wird der Kernel neu gestartet, sodass Sie das gesamte Notebook erneut ausführen müssen, um zu diesem Punkt zurückzukehren.

# copy GX directory to attached lakehouse
!cp -r gx/ /lakehouse/default/Files/gx

Jetzt können zukünftige Kontexte mit context = gx.get_context(project_root_dir="<your path here>") erstellt werden, um alle Konfigurationen aus diesem Tutorial zu verwenden.

Fügen Sie beispielsweise in einem neuen Notebook dasselbe Lakehouse an, und verwenden Sie context = gx.get_context(project_root_dir="/lakehouse/default/Files/gx"), um den Kontext abzurufen.

Sehen Sie sich weitere Tutorials zu Semantic Link und SemPy an: