Delen via


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

In deze zelfstudie leert u hoe u SemPy samen met GX (Great Expectations ) kunt gebruiken om gegevensvalidatie uit te voeren op semantische Power BI-modellen.

In deze handleiding ontdekt u hoe u:

  • Valideer beperkingen voor een gegevensset in uw Fabric-werkruimte met de Fabric-gegevensbron van grote verwachtingen (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.

Vereisten

  • Selecteer Werkruimten in het linkernavigatiedeelvenster om uw werkruimte te zoeken en te selecteren. Deze werkruimte wordt uw huidige werkruimte.
  • Download het PBIX.pbix-bestand met het voorbeeld van een retailanalyse.
  • Gebruik in uw werkruimte de knop Uploaden om het PBIX.pbix-bestand met een retailanalyse te uploaden naar de werkruimte.

Volgen in notitieblok

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

Als u het bijbehorende notitieblok voor deze zelfstudie wilt openen, volgt u de instructies in Uw systeem voorbereiden voor zelfstudies voor gegevenswetenschap om het notebook te importeren in uw werkruimte.

Als u liever de code van deze pagina kopieert en plakt, kunt u een nieuw notitieblok maken.

Zorg ervoor dat u een lakehouse aan het notebook koppelt voordat u begint met het uitvoeren van code.

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 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 Great Expectations, moet u eerst een GX-gegevenscontext instellen. De context fungeert als een toegangspunt voor GX-bewerkingen en bevat alle relevante configuraties.

context = gx.get_context()

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

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

Gegevensassets opgeven

Definieer gegevensassets om de subset van de 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-meting

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

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

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 rapporten voor 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 Gallery voor 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)

TotalUnits Maatregel

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)

Validatie

Als u de opgegeven verwachtingen daadwerkelijk wilt uitvoeren op basis van de gegevens, maakt u eerst een controlepunt en voegt u dit toe aan de context. Zie de werkstroom voor gegevensvalidatie voor meer informatie over de controlepuntconfiguratie.

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

In de tabel worden de validatieresultaten weergegeven.

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

In de tabel ziet u 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 ziet u dat april en juli enigszins buiten het bereik liggen en vervolgens verdere stappen kunnen ondernemen om 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 bestandscontext instantiëren (zie Een gegevenscontext instantiëren).

context = context.convert_to_file_context()

Nu u de context hebt opgeslagen, kopieert u de gx map naar uw lakehouse.

Belangrijk

In deze cel wordt ervan uitgegaan dat u een lakehouse hebt toegevoegd aan het notebook. 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 om context = gx.get_context(project_root_dir="<your path here>") alle configuraties uit deze zelfstudie te gebruiken.

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

Bekijk andere zelfstudies voor semantische koppeling /SemPy: