Bagikan melalui


Tutorial: Memvalidasi data menggunakan SemPy dan Great Expectations (GX)

Dalam tutorial ini, Anda mempelajari cara menggunakan SemPy bersama dengan Great Expectations (GX) untuk melakukan validasi data pada model semantik Power BI.

Tutorial ini menunjukkan kepada Anda cara:

  • Validasi batasan pada himpunan data di ruang kerja Fabric Anda dengan Sumber Data Fabric dari Great Expectation (dibangun di atas tautan semantik).
    • Konfigurasikan Konteks Data GX, Aset Data, dan Ekspektasi.
    • Menampilkan hasil validasi dengan Titik Pemeriksaan GX.
  • Gunakan tautan semantik untuk menganalisis data mentah.

Prasyarat

  • Dapatkan langganan Microsoft Fabric . Atau, daftar untuk uji coba Microsoft Fabric gratis.

  • Masuk ke Microsoft Fabric.

  • Gunakan pengalih pengalaman di sisi kiri bawah halaman beranda Anda untuk beralih ke Fabric.

    Cuplikan layar menu pengalih pengalaman, memperlihatkan tempat untuk memilih Ilmu Data.

  • Pilih Ruang Kerja dari panel navigasi kiri untuk menemukan dan memilih ruang kerja Anda. Ruang kerja ini menjadi ruang kerja Anda saat ini.
  • Unduh Retail Analysis Sample PBIX.pbix file.
  • Di ruang kerja Anda, pilih Impor Laporan>atau Laporan Paginasi>Dari komputer ini untuk mengunggah file Retail Analysis Sample PBIX.pbix ke ruang kerja Anda.

Ikuti dalam buku catatan

great_expectations_tutorial.ipynb adalah notebook yang menyertai tutorial ini.

Menyiapkan buku catatan

Di bagian ini, Anda menyiapkan lingkungan notebook dengan modul dan data yang diperlukan.

  1. Instal SemPy dan pustaka Great Expectations yang relevan dari PyPI menggunakan kemampuan penginstalan langsung %pip dalam notebook.
# 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. Lakukan impor modul yang diperlukan yang akan Anda butuhkan nanti:
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

Menyiapkan Konteks Data GX dan Sumber Data

Untuk memulai dengan Great Expectations, Anda harus terlebih dahulu menyiapkan GX Konteks Data. Konteks berfungsi sebagai titik masuk untuk operasi GX dan menyimpan semua konfigurasi yang relevan.

context = gx.get_context()

Anda sekarang dapat menambahkan himpunan data Fabric anda ke konteks ini sebagai sumber data untuk mulai berinteraksi dengan data. Tutorial ini menggunakan model semantik sampel Power BI standar file .pbix untuk Sampel Analisis Ritel.

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

Tentukan Aset Data

Tentukan Aset Data untuk menentukan subset data yang akan Anda gunakan. Aset bisa sesederh mungkin tabel lengkap, atau serumit kueri Data Analysis Expressions (DAX) kustom.

Di sini, Anda akan menambahkan beberapa aset:

  • Tabel Power BI
  • Pengukuran Power BI
  • Kueri DAX kustom
  • Kueri Tampilan Manajemen Dinamis (DMV)

Tabel Power BI

Tambahkan tabel Power BI sebagai aset data.

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

Pengukuran Power BI

Jika himpunan data Anda berisi ukuran yang telah dikonfigurasi sebelumnya, Anda menambahkan ukuran tersebut sebagai aset dengan mengikuti API yang serupa dengan evaluate_measureSemPy.

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

DAX

Jika Anda ingin menentukan pengukuran Anda sendiri atau memiliki kontrol lebih besar atas baris tertentu, Anda dapat menambahkan aset DAX dengan kueri DAX kustom. Di sini, kami mendefinisikan ukuran Total Units Ratio dengan membagi dua ukuran yang ada.

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

Pertanyaan tentang DMV

Dalam beberapa kasus, mungkin berguna untuk menggunakan perhitungan Tampilan Manajemen Dinamis (DMV) sebagai bagian dari proses validasi data. Misalnya, Anda dapat melacak jumlah pelanggaran integritas referensial dalam himpunan data Anda. Untuk informasi selengkapnya, lihat Membersihkan data menghasilkan laporan yang lebih cepat.

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

Harapan

Untuk menambahkan batasan tertentu ke aset, Anda harus terlebih dahulu mengonfigurasi Expectation Suites. Setelah menambahkan ekspektasi individu ke setiap suite, Anda kemudian dapat memperbarui Konteks Data yang telah diatur di awal dengan suite baru. Untuk daftar lengkap ekspektasi yang tersedia, lihat GX Expectation Gallery.

Mulailah dengan menambahkan "Retail Store Suite" dengan dua harapan:

  • kode pos yang valid
  • tabel dengan jumlah baris antara 80 dan 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)

Ukuran TotalUnits

Tambahkan "Retail Measure Suite" dengan satu persyaratan:

  • Nilai kolom harus lebih besar dari 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

Tambahkan "Retail DAX Suite" dengan satu harapan:

  • Nilai kolom untuk Rasio Unit Total harus antara 0,8 dan 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)

Pelanggaran Integritas Referensial (DMV)

Tambahkan "Retail DMV Suite" dengan satu ekspektasi:

  • RIVIOLATION_COUNT harus 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)

Validasi

Untuk benar-benar menjalankan ekspektasi yang ditentukan terhadap data, pertama-tama buat Titik Pemeriksaan dan tambahkan ke konteks. Untuk informasi selengkapnya tentang konfigurasi Titik Pemeriksaan, lihat alur kerja Validasi Data .

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
)

Sekarang jalankan checkpoint dan ekstrak hasilnya sebagai pandas DataFrame untuk pemformatan yang sederhana.

result = checkpoint.run()

Proses dan cetak hasil Anda.

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 memperlihatkan hasil validasi.

Dari hasil ini Anda dapat melihat bahwa semua harapan Anda lulus validasi, kecuali untuk "Total Unit Aset YoY" yang Anda tentukan melalui kueri DAX kustom.

Diagnostik

Dengan menggunakan tautan semantik, Anda dapat mengambil data sumber untuk memahami tahun mana yang tepat berada di luar jangkauan. Tautan semantik menyediakan keajaiban sebaris untuk menjalankan kueri DAX. Gunakan tautan semantik untuk menjalankan kueri yang sama dengan yang Anda teruskan ke Aset Data GX dan visualisasikan nilai yang dihasilkan.

%%dax "Retail Analysis Sample PBIX"

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

Tabel memperlihatkan hasil dari ringkasan kueri DAX.

Simpan hasil ini dalam DataFrame.

df = _

Plot hasilnya.

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 memperlihatkan hasil ringkasan kueri DAX.

Dari plot tersebut, Anda dapat melihat bahwa pada bulan April dan Juli sedikit melampaui batas, dan setelah itu Anda dapat mengambil langkah-langkah lebih lanjut untuk menyelidikinya.

Menyimpan konfigurasi GX

Saat data dalam himpunan data Anda berubah dari waktu ke waktu, Anda mungkin ingin menjalankan ulang validasi GX yang baru saja Anda lakukan. Saat ini, Konteks Data (berisi Aset Data, Expectation Suites, dan Checkpoint) yang terhubung bersifat sementara, tetapi dapat dikonversi ke Konteks File untuk digunakan di masa mendatang. Atau, Anda dapat menginstansiasi Konteks File (lihat Menginstansiasi Konteks Data).

context = context.convert_to_file_context()

Sekarang setelah Anda menyimpan konteks, salin direktori gx ke lakehouse Anda.

Penting

Sel ini mengasumsikan Anda menambahkan lakehouse ke buku catatan. Jika tidak ada lakehouse yang terpasang, Anda tidak akan melihat kesalahan, tetapi Anda juga nantinya tidak akan bisa mendapatkan konteksnya. Jika Anda menambahkan lakehouse sekarang, kernel akan dimulai ulang, jadi Anda harus menjalankan kembali seluruh notebook untuk kembali ke titik ini.

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

Sekarang, konteks di masa mendatang dapat dibuat dengan context = gx.get_context(project_root_dir="<your path here>") untuk menggunakan semua konfigurasi dari tutorial ini.

Misalnya, dalam buku catatan baru, lampirkan lakehouse yang sama dan gunakan context = gx.get_context(project_root_dir="/lakehouse/default/Files/gx") untuk mengambil konteks.

Lihat tutorial lain untuk tautan semantik / SemPy: