Samouczek: weryfikowanie danych przy użyciu bibliotek SemPy i Great Expectations (GX)
Z tego samouczka dowiesz się, jak używać biblioteki SemPy wraz z Great Expectations (GX) w celu przeprowadzenia walidacji danych na modelach semantycznych usługi Power BI.
Ten samouczek pokazuje, jak wykonać:
- Zweryfikuj ograniczenia dotyczące zestawu danych w obszarze roboczym Sieć szkieletowa przy użyciu źródła danych sieci szkieletowej Great Expectation (opartego na linku semantycznym).
- Skonfiguruj kontekst danych GX, zasoby danych i oczekiwania.
- Wyświetlanie wyników walidacji za pomocą punktu kontrolnego GX.
- Użyj linku semantycznego do analizowania danych pierwotnych.
Warunki wstępne
Pobierz subskrypcję usługi Microsoft Fabric . Możesz też utworzyć bezpłatne konto wersji próbnej usługi Microsoft Fabric.
Zaloguj się do usługi Microsoft Fabric.
Użyj przełącznika środowiska w lewej dolnej części strony głównej, aby przełączyć się na Fabric.
- Wybierz pozycję Obszary robocze w okienku nawigacji po lewej stronie, aby znaleźć i wybrać obszar roboczy. Ten obszar roboczy staje się aktualnym obszarem roboczym.
- Pobierz plik Retail Analysis Sample PBIX.pbix.
- W obszarze roboczym wybierz Importuj>Raport lub Raport stronicowany>Z tego komputera, aby przekazać plik Retail Analysis Sample PBIX.pbix do obszaru roboczego.
Śledź w zeszycie
great_expectations_tutorial.ipynb jest to notatnik, który towarzyszy temu samouczkowi.
Aby otworzyć towarzyszący notes na potrzeby tego samouczka, postępuj zgodnie z instrukcjami w Prepare your system for data science tutorials (Przygotowywanie systemu do nauki o danych), aby zaimportować notes do obszaru roboczego.
Jeśli wolisz skopiować i wkleić kod z tej strony, możesz utworzyć nowy notes.
Przed rozpoczęciem uruchamiania kodu pamiętaj, aby dołączyć magazyn lakehouse do notesu.
Ustaw notatnik
W tej sekcji skonfigurujesz środowisko notesu z niezbędnymi modułami i danymi.
- Zainstaluj
SemPy
i odpowiednie bibliotekiGreat Expectations
z interfejsu PyPI przy użyciu funkcji instalacji wbudowanej%pip
w notesie.
# install libraries
%pip install semantic-link 'great-expectations<1.0' great_expectations_experimental great_expectations_zipcode_expectations
# load %%dax cell magic
%load_ext sempy
- Wykonaj niezbędne importy modułów, które będą potrzebne później:
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
Konfigurowanie kontekstu danych GX i źródła danych
Aby rozpocząć pracę z Great Expectations, najpierw należy skonfigurować kontekst danych GX . Kontekst służy jako punkt wejścia dla operacji GX i zawiera wszystkie odpowiednie konfiguracje.
context = gx.get_context()
Teraz możesz dodać zestaw danych usługi Fabric do tego kontekstu jako źródło danych, aby rozpocząć interakcję z danymi. W tym samouczku użyto standardowego semantycznego modelu semantycznego usługi Power BI pliku pbix przykładu Retail Analysis.
ds = context.sources.add_fabric_powerbi("Retail Analysis Data Source", dataset="Retail Analysis Sample PBIX")
Określanie zasobów danych
Zdefiniuj zasoby danych, aby określić podzestaw danych, z którym chcesz pracować. Zasób może być tak prosty, jak pełne tabele lub być tak złożony, jak niestandardowe zapytanie języka DAX (Data Analysis Expressions).
W tym miejscu dodasz wiele zasobów:
- Tabela usługi Power BI
- Miara usługi Power BI
- Niestandardowe zapytanie języka DAX
- zapytanie dotyczące Dynamicznego Widoku Zarządzania (DMV)
Tabela usługi Power BI
Dodaj tabelę usługi Power BI jako zasób danych.
ds.add_powerbi_table_asset("Store Asset", table="Store")
Miara usługi Power BI
Jeśli zestaw danych zawiera wstępnie skonfigurowane miary, dodajesz miary jako zasoby, korzystając z podobnego interfejsu API jak w bibliotece SemPy evaluate_measure
.
ds.add_powerbi_measure_asset(
"Total Units Asset",
measure="TotalUnits",
groupby_columns=["Time[FiscalYear]", "Time[FiscalMonth]"]
)
DAX
Jeśli chcesz zdefiniować własne miary lub mieć większą kontrolę nad określonymi wierszami, możesz dodać element DAX z niestandardowym zapytaniem DAX. W tym miejscu definiujemy miarę Total Units Ratio
przez podzielenie dwóch istniejących miar.
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])
)
"""
)
Zapytanie DMV
W niektórych przypadkach pomocne może być użycie obliczeń dynamicznego widoku zarządzania (DMV) w ramach procesu weryfikacji danych. Możesz na przykład śledzić liczbę naruszeń integralności referencyjnej w zestawie danych. Aby uzyskać więcej informacji, zobacz Czyszczenie danych = szybsze raporty.
ds.add_powerbi_dax_asset(
"Referential Integrity Violation",
dax_string=
"""
SELECT
[Database_name],
[Dimension_Name],
[RIVIOLATION_COUNT]
FROM $SYSTEM.DISCOVER_STORAGE_TABLES
"""
)
Oczekiwania
Aby dodać określone ograniczenia do zasobów, najpierw należy skonfigurować zestaw Expectation Suites. Po dodaniu poszczególnych Oczekiwania do każdego zestawu, możesz zaktualizować kontekst danych skonfigurowany na początku, używając nowego zestawu. Aby uzyskać pełną listę dostępnych oczekiwań, zobacz Galerię Oczekiwań GX.
Zacznij od dodania pakietu "Retail Store Suite" z dwoma oczekiwaniami:
- prawidłowy kod pocztowy
- tabela z liczbą wierszy z przedziału od 80 do 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)
miara TotalUnits
Dodaj pakiet "Retail Measure Suite" z jednym oczekiwaniem:
- Wartości kolumn powinny być większe niż 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
Dodaj "Retail DAX Suite" z jednym oczekiwaniem:
- Wartości kolumn dla łącznego współczynnika jednostek powinny należeć do przedziału od 0,8 do 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)
Naruszenia więzów integralności referencyjnej (DMV)
Dodaj pakiet "Retail DMV Suite" z jednym oczekiwaniem:
- wartość RIVIOLATION_COUNT powinna mieć wartość 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)
Walidacja
Aby faktycznie uruchomić określone oczekiwania względem danych, najpierw utwórz Punkt kontrolny i dodaj go do kontekstu. Aby uzyskać więcej informacji na temat konfiguracji punktu kontrolnego, zobacz przepływ pracy sprawdzania poprawności danych .
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
)
Teraz uruchom punkt kontrolny i wyodrębnij wyniki jako ramkę danych biblioteki pandas w celu prostego formatowania.
result = checkpoint.run()
Przetwarzanie i drukowanie wyników.
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"]]
Z tych wyników można zobaczyć, że wszystkie Twoje założenia przeszły weryfikację, z wyjątkiem "Total Units YoY Asset", który został zdefiniowany za pomocą niestandardowego zapytania języka DAX.
Diagnostyka
Korzystając z linku semantycznego, możesz pobrać dane źródłowe, aby zrozumieć, które dokładne lata są poza zakresem. Link semantyczny zapewnia wbudowaną magię do wykonywania zapytań języka DAX. Użyj linku semantycznego, aby wykonać to samo zapytanie przekazane do zasobu danych GX i zwizualizować wynikowe wartości.
%%dax "Retail Analysis Sample PBIX"
EVALUATE SUMMARIZECOLUMNS(
'Time'[FiscalYear],
'Time'[FiscalMonth],
"Total Units Ratio", DIVIDE([Total Units This Year], [Total Units Last Year])
)
Zapisz te wyniki w ramce danych.
df = _
Wykreślij wyniki.
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
Na wykresie widać, że kwiecień i lipiec były nieco poza zasięgiem, a następnie można podjąć dalsze kroki w celu zbadania.
Przechowywanie konfiguracji GX
Gdy dane w zestawie danych zmieniają się wraz z upływem czasu, możesz chcieć ponownie uruchomić właśnie wykonane walidacje GX. Obecnie kontekst danych (zawierający połączone zasoby danych, zestawy oczekiwań i punkt kontrolny) istnieje efemerycznie, ale można go przekonwertować na kontekst pliku do użytku w przyszłości. Alternatywnie, można zainicjować kontekst pliku (zobacz Zainicjowanie kontekstu danych).
context = context.convert_to_file_context()
Teraz, gdy zapisałeś kontekst, skopiuj katalog gx
do Lakehouse.
Ważny
W tej komórce założono, że dodano lakehouse do notesu. Jeśli lakehouse nie jest dołączony, nie pojawi się błąd, ale później nie będzie można uzyskać kontekstu. Jeśli teraz dodasz lakehouse, jądro zostanie uruchomione ponownie, więc musisz ponownie uruchomić cały notes, aby wrócić do tego stanu.
# copy GX directory to attached lakehouse
!cp -r gx/ /lakehouse/default/Files/gx
Przyszłe konteksty mogą być teraz tworzone za pomocą context = gx.get_context(project_root_dir="<your path here>")
, aby wykorzystać wszystkie konfiguracje z tego samouczka.
Na przykład w nowym notesie dołącz ten sam system lakehouse i użyj context = gx.get_context(project_root_dir="/lakehouse/default/Files/gx")
, aby pobrać kontekst.
Powiązana zawartość
Zapoznaj się z innymi samouczkami dotyczącymi linku semantycznego /SemPy:
- samouczek : czyszczenie danych z zależnościami funkcjonalnymi
- Samouczek: analizowanie zależności funkcjonalnych w przykładowym modelu semantycznym
- Tutorial : Wyodrębnianie i obliczanie miar Power BI z notesu Jupyter
- Samouczek: odnajdywanie relacji w modelu semantycznym przy użyciu linku semantycznego
- Samouczek : Odkryj relacje w zestawie danych Synthea przy użyciu linku semantycznego