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.
- 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.
Untuk membuka buku catatan yang menyertai tutorial ini, ikuti instruksi di Menyiapkan sistem Anda untuk tutorial ilmu data mengimpor buku catatan ke ruang kerja Anda.
Jika Anda lebih suka menyalin dan menempelkan kode dari halaman ini, Anda bisa membuat buku catatan baru.
Pastikan Anda melampirkan lakehouse ke notebook sebelum mulai menjalankan kode.
Menyiapkan buku catatan
Di bagian ini, Anda menyiapkan lingkungan notebook dengan modul dan data yang diperlukan.
- Instal
SemPy
dan pustakaGreat 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
- 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
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_measure
SemPy.
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"]]
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])
)
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
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.
Konten terkait
Lihat tutorial lain untuk tautan semantik / SemPy:
- Tutorial: Membersihkan Data dengan Ketergantungan Fungsional
- tutorial : Menganalisis dependensi fungsi dalam contoh model semantik
- Tutorial : Mengekstrak dan menghitung pengukuran Power BI dari notebook Jupyter
- Tutorial : Menemukan hubungan dalam model semantik, menggunakan tautan semantik
- Tutorial : Menemukan hubungan dalam himpunan data Synthea, menggunakan tautan semantik