Udostępnij za pośrednictwem


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.

    Zrzut ekranu przedstawiający menu przełączania doświadczeń, pokazujący, gdzie wybrać opcję Nauka o danych.

  • 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.

Ustaw notatnik

W tej sekcji skonfigurujesz środowisko notesu z niezbędnymi modułami i danymi.

  1. Zainstaluj SemPy i odpowiednie biblioteki Great 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
  1. 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

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

Tabela pokazuje wyniki walidacji.

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

Tabela pokazuje wyniki podsumowania zapytań DAX.

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

Wykres pokazuje wyniki podsumowania zapytań języka DAX.

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.

Zapoznaj się z innymi samouczkami dotyczącymi linku semantycznego /SemPy: