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
Få et Microsoft Fabric-abonnement. Du kan også tilmelde dig en gratis Microsoft Fabric-prøveversion.
Log på Microsoft Fabric.
Brug oplevelsesskifteren nederst til venstre på startsiden til at skifte til Fabric.
- 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.
Hvis du vil åbne den medfølgende notesbog til dette selvstudium, skal du følge vejledningen i Forbered dit system til selvstudier om datavidenskab importere notesbogen til dit arbejdsområde.
Hvis du hellere vil kopiere og indsætte koden fra denne side, kan du oprette en ny notesbog.
Sørg for at vedhæfte et lakehouse til notesbogen, før du begynder at køre kode.
Konfigurer notesbogen
I dette afsnit skal du konfigurere et notesbogmiljø med de nødvendige moduler og data.
- Installér
SemPy
og de relevanteGreat 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
- 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
- Power BI-måling
- Brugerdefineret DAX-forespørgsel
- DMV-forespørgsel (Dynamic Management View)
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 galleriet
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"]]
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])
)
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
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.
Relateret indhold
Tjek andre selvstudier for semantisk link / SemPy:
- selvstudium: Ryd op i data med funktionelle afhængigheder
- selvstudium: Analysér funktionelle afhængigheder i en semantisk eksempelmodel
- selvstudium: Udtræk og beregn Power BI-målinger fra en Jupyter-notesbog
- selvstudium: Find relationer i en semantisk model ved hjælp af semantisk link
- selvstudium: Find relationer i datasættet Synthea ved hjælp af semantisk link