Share via


Zelfstudie: Gegevens valideren met Behulp van SemPy en Grote Verwachtingen (GX)

In deze zelfstudie leert u hoe u SemPy samen met Grote verwachtingen (GX) gebruikt om gegevensvalidatie uit te voeren op semantische Power BI-modellen.

In deze zelfstudie leert u het volgende:

  • Valideer beperkingen voor een gegevensset in uw Fabric-werkruimte met de Fabric Data Source van Great Expectations (gebouwd op semantische koppeling).
    • Configureer een GX-gegevenscontext, gegevensassets en verwachtingen.
    • Validatieresultaten weergeven met een GX-controlepunt.
  • Gebruik een semantische koppeling om onbewerkte gegevens te analyseren.

Voorwaarden

  • Selecteer Werkruimten in het linkernavigatiedeelvenster om uw werkruimte te zoeken en te selecteren. Deze werkruimte wordt uw huidige werkruimte.
  • Download het PBIX.pbix-bestand voorbeeld van een retailanalyse.
  • Selecteer in uw werkruimte Importeren>rapport of gepagineerd rapport>Van deze computer om het Retail Analysis Sample PBIX.pbix-bestand naar uw werkruimte te uploaden.

Volg mee in notitieboek

great_expectations_tutorial.ipynb is het notebook dat bij deze tutorial hoort.

Het notebook instellen

In deze sectie stelt u een notebookomgeving in met de benodigde modules en gegevens.

  1. Installeer SemPy en de relevante Great Expectations bibliotheken van PyPI met behulp van de %pip inline-installatiemogelijkheid in het notebook.
# install libraries
%pip install semantic-link 'great-expectations<1.0' great_expectations_experimental great_expectations_zipcode_expectations

# load %%dax cell magic
%load_ext sempy
  1. Voer de benodigde importbewerkingen uit van modules die u later nodig hebt:
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

GX-gegevenscontext en -gegevensbron instellen

Om aan de slag te gaan met Grote Verwachtingen, moet u eerst een GX-Data Context instellen. De context fungeert als een toegangspunt voor GX-bewerkingen en bevat alle relevante configuraties.

context = gx.get_context()

U kunt uw Fabric-gegevensset nu toevoegen aan deze context als een gegevensbron om te beginnen met de interactie met de gegevens. In deze zelfstudie wordt gebruikgemaakt van een standaard semantisch Power BI-voorbeeldmodel PBIX-bestand met een retailanalyse.

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

Gegevensbronnen opgeven

Definieer data-assets om de subset van gegevens op te geven waarmee u wilt werken. De asset kan net zo eenvoudig zijn als volledige tabellen of zo complex zijn als een aangepaste DAX-query (Data Analysis Expressions).

Hier voegt u meerdere assets toe:

Power BI-tabel

Een Power BI-tabel toevoegen als gegevensasset.

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

Power BI-berekening

Als uw gegevensset vooraf geconfigureerde metingen bevat, voegt u de metingen toe als assets na een vergelijkbare API als de evaluate_measurevan SemPy.

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

DAX

Als u uw eigen metingen wilt definiëren of meer controle wilt over specifieke rijen, kunt u een DAX-asset toevoegen met een aangepaste DAX-query. Hier definiëren we een Total Units Ratio meting door twee bestaande metingen te delen.

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-aanvraag

In sommige gevallen kan het handig zijn om DMV-berekeningen (Dynamic Management View) te gebruiken als onderdeel van het gegevensvalidatieproces. U kunt bijvoorbeeld het aantal schendingen van referentiële integriteit in uw gegevensset bijhouden. Zie Gegevens opschonen = snellere rapportenvoor meer informatie.

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

Verwachtingen

Als u specifieke beperkingen aan de assets wilt toevoegen, moet u eerst Expectation Suites configureren. Nadat u afzonderlijke Verwachtingen aan elke suite hebt toegevoegd, kunt u vervolgens de gegevenscontext bijwerken die in het begin is ingesteld met de nieuwe suite. Zie de GX Expectation Galleryvoor een volledige lijst met beschikbare verwachtingen.

Begin met het toevoegen van een 'Retail Store Suite' met twee verwachtingen:

  • een geldige postcode
  • een tabel met het aantal rijen tussen 80 en 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)

meting voor TotalUnits

Voeg een 'Retail Measure Suite' toe met één verwachting:

  • Kolomwaarden moeten groter zijn dan 50.000
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)

Total Units Ratio DAX

Voeg een 'Retail DAX Suite' toe met één verwachting:

  • Kolomwaarden voor de verhouding totale eenheden moeten tussen 0,8 en 1,5 zijn
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)

Schendingen van referentiële integriteit (DMV)

Voeg een 'Retail DMV Suite' toe met één verwachting:

  • de RIVIOLATION_COUNT moet 0 zijn
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)

Validering

Als u de opgegeven verwachtingen daadwerkelijk wilt uitvoeren op basis van de gegevens, maakt u eerst een Controlepunt en voegt u deze toe aan de context. Zie werkstroom voor gegevensvalidatievoor meer informatie over de configuratie van controlepunten.

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
)

Voer nu het controlepunt uit en extraheer de resultaten als een Pandas DataFrame voor eenvoudige opmaak.

result = checkpoint.run()

Uw resultaten verwerken en afdrukken.

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"]]

Tabel toont de validatieresultaten.

In deze resultaten kunt u zien dat al uw verwachtingen de validatie hebben doorstaan, met uitzondering van de 'Total Units YoY Asset' die u hebt gedefinieerd via een aangepaste DAX-query.

Diagnostiek

Met behulp van een semantische koppeling kunt u de brongegevens ophalen om te begrijpen welke exacte jaren buiten het bereik vallen. Semantische koppeling biedt een inline tovenarij voor het uitvoeren van DAX-query's. Gebruik een semantische koppeling om dezelfde query uit te voeren die u hebt doorgegeven aan de GX-gegevensasset en de resulterende waarden te visualiseren.

%%dax "Retail Analysis Sample PBIX"

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

Tabel bevat de resultaten van de samenvatting van de DAX-query.

Sla deze resultaten op in een DataFrame.

df = _

De resultaten tekenen.

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 toont de resultaten van de samenvatting van de DAX-query.

In de plot kunt u zien dat april en juli enigszins buiten het bereik liggen, waarna u verdere stappen kunt ondernemen om dit te onderzoeken.

GX-configuratie opslaan

Naarmate de gegevens in uw gegevensset na verloop van tijd veranderen, wilt u mogelijk de GX-validaties die u zojuist hebt uitgevoerd, opnieuw uitvoeren. Op dit moment leeft de gegevenscontext (met de verbonden gegevensassets, verwachtingensuites en controlepunten) kortstondig, maar kan deze worden geconverteerd naar een bestandscontext voor toekomstig gebruik. U kunt ook een instantie maken van een File Context (zie Een Data Context instantiëren).

context = context.convert_to_file_context()

Nu je de context hebt opgeslagen, kopieer de gx-directory naar je lakehouse.

Belangrijk

In deze cel wordt ervan uitgegaan dat u een lakehouse- aan het notitieblok hebt toegevoegd. Als er geen lakehouse is gekoppeld, ziet u geen fout, maar kunt u de context later ook niet meer ophalen. Als u nu een lakehouse toevoegt, wordt de kernel opnieuw opgestart, dus moet u het hele notebook opnieuw uitvoeren om terug te keren naar dit punt.

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

Toekomstige contexten kunnen nu worden gemaakt met context = gx.get_context(project_root_dir="<your path here>") om alle configuraties uit deze zelfstudie te gebruiken.

Voeg bijvoorbeeld in een nieuw notitieblok hetzelfde lakehouse toe en gebruik context = gx.get_context(project_root_dir="/lakehouse/default/Files/gx") om de context op te halen.

Bekijk andere handleidingen voor semantische koppeling / SemPy: