Del via


Selvstudium: Valider data ved hjælp af SemPy og Store forventninger (GX)

I dette selvstudium lærer du, hvordan du bruger SemPy sammen med Store forventninger (GX) til at udføre datavalidering på semantiske Power BI-modeller.

I dette selvstudium kan du se, hvordan du:

  • Valider begrænsninger på et datasæt i dit Fabric-arbejdsområde med Fabric-datakilden Great Forventning (bygget på semantisk link).
    • Konfigurer en GX-datakontekst, dataaktiver og forventninger.
    • Få vist valideringsresultater med et GX-kontrolpunkt.
  • Brug semantisk link til at analysere rådata.

Forudsætninger

  • Vælg arbejdsområder i navigationsruden til venstre for at finde og vælge dit arbejdsområde. Dette arbejdsområde bliver dit aktuelle arbejdsområde.
  • Download filen Retail Analysis Sample PBIX.pbix.
  • I dit arbejdsområde skal du vælge Importér>rapport eller Sideinddelt>Fra denne computer for at uploade PBIX.pbix-filen Eksempel på detailhandelsanalyse til dit arbejdsområde.

Følg med i notesbogen

great_expectations_tutorial.ipynb er den notesbog, der følger med dette selvstudium.

Konfigurer notesbogen

I dette afsnit skal du konfigurere et notesbogmiljø med de nødvendige moduler og data.

  1. Installér SemPy og de relevante Great Expectations biblioteker fra PyPI ved hjælp af funktionen %pip indbygget installation i notesbogen.
# 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. Udfør den nødvendige import af moduler, som du skal bruge senere:
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

Konfigurer GX-datakontekst og datakilde

For at komme i gang med store forventninger skal du først konfigurere en GX-Datakontekst. Konteksten fungerer som indgangspunkt for GX-handlinger og indeholder alle relevante konfigurationer.

context = gx.get_context()

Du kan nu føje dit Fabric-datasæt til denne kontekst som en datakilde for at begynde at interagere med dataene. I dette selvstudium bruges en semantisk standardmodel for Power BI-eksempel .pbix-filen Retail Analysis Sample.

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

Angiv dataaktiver

Definer dataaktiver for at angive det undersæt af data, du vil arbejde med. Aktivet kan være så simpelt som komplette tabeller eller være lige så komplekst som en brugerdefineret DAX-forespørgsel (Data Analysis Expressions).

Her skal du tilføje flere aktiver:

Power BI-tabel

Tilføj en Power BI-tabel som et dataaktiv.

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

Power BI-måling

Hvis dit datasæt indeholder forudkonfigurerede målinger, føjer du målingerne som aktiver efter en lignende API til SemPys evaluate_measure.

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

DAX

Hvis du vil definere dine egne målinger eller have mere kontrol over bestemte rækker, kan du tilføje et DAX-aktiv med en brugerdefineret DAX-forespørgsel. Her definerer vi en Total Units Ratio måling ved at dividere to eksisterende målinger.

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-forespørgsel

I nogle tilfælde kan det være nyttigt at bruge DMV-beregninger (Dynamic Management View) som en del af datavalideringsprocessen. Du kan f.eks. holde styr på antallet af overtrædelser af referentiel integritet i dit datasæt. Du kan få flere oplysninger under Ryd op i data = hurtigere rapporter.

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

Forventninger

Hvis du vil føje specifikke begrænsninger til aktiverne, skal du først konfigurere Forventningspakker. Når du har føjet individuelle forventninger til hver pakke, kan du derefter opdatere den datakontekst, der er konfigureret i starten, med den nye pakke. Du kan se en komplet liste over tilgængelige forventninger i gallerietGX-forventninger.

Start med at tilføje en "Retail Store Suite" med to forventninger:

  • et gyldigt postnummer
  • en tabel med rækkeantal mellem 80 og 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 måling

Tilføj en "Retail Measure Suite" med én forventning:

  • Kolonneværdier skal være større end 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

Tilføj en "Retail DAX Suite" med én forventning:

  • Kolonneværdier for Antal enheder i alt skal være mellem 0,8 og 1,5
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)

Overtrædelser af referentiel integritet (DMV)

Tilføj en "Retail DMV Suite" med én forventning:

  • RIVIOLATION_COUNT skal være 0
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

Hvis du rent faktisk vil køre de angivne forventninger i forhold til dataene, skal du først oprette et Checkpoint og føje det til konteksten. Du kan finde flere oplysninger om kontrolpunktkonfiguration under arbejdsproces til datavalidering.

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
)

Kør nu kontrolpunktet, og udtræk resultaterne som en pandas DataFrame for enkel formatering.

result = checkpoint.run()

Behandl og udskriv dine resultater.

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 viser valideringsresultaterne.

Ud fra disse resultater kan du se, at alle dine forventninger har bestået valideringen med undtagelse af det "Samlet antal enheder ååå-aktiv", som du har defineret via en brugerdefineret DAX-forespørgsel.

Diagnostik

Ved hjælp af semantisk link kan du hente kildedataene for at forstå, hvilke år der er uden for området. Semantisk link giver en indbygget magi til udførelse af DAX-forespørgsler. Brug semantisk link til at udføre den samme forespørgsel, som du overførte til GX-dataaktivet, og visualisere de resulterende værdier.

%%dax "Retail Analysis Sample PBIX"

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

Tabel viser resultaterne fra DAX-forespørgselsopsummering.

Gem disse resultater i en DataFrame.

df = _

Afbild resultaterne.

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 viser resultaterne af DAX-forespørgselsopsummering.

Fra plottet kan du se, at april og juli var lidt uden for området og derefter kan tage yderligere skridt til at undersøge.

Lagring af GX-konfiguration

Når dataene i dit datasæt ændres over tid, kan det være en god idé at køre de GX-valideringer, du lige har udført, igen. I øjeblikket lever datakonteksten (der indeholder de forbundne dataaktiver, forventningspakker og kontrolpunkter) ephemerligt, men den kan konverteres til en filkontekst til fremtidig brug. Du kan også instantiere en filkontekst (se Instantier en datakontekst).

context = context.convert_to_file_context()

Nu, hvor du har gemt konteksten, skal du kopiere mappen gx til lakehouse.

Vigtig

Denne celle forudsætter, at du føjet et lakehouse- til notesbogen. Hvis der ikke er knyttet noget lakehouse, får du ikke vist en fejl, men du kan heller ikke senere hente konteksten. Hvis du tilføjer et lakehouse nu, genstartes kernen, så du bliver nødt til at køre hele notesbogen igen for at komme tilbage til dette punkt.

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

Nu kan fremtidige kontekster oprettes med context = gx.get_context(project_root_dir="<your path here>") til at bruge alle konfigurationer fra dette selvstudium.

I en ny notesbog kan du f.eks. vedhæfte det samme lakehouse og bruge context = gx.get_context(project_root_dir="/lakehouse/default/Files/gx") til at hente konteksten.

Tjek andre selvstudier for semantisk link / SemPy: