บทช่วยสอน: ตรวจสอบข้อมูลโดยใช้ SemPy และความคาดหวังที่ยิ่งใหญ่ (GX)
ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีการใช้ SemPy ร่วมกับ ความคาดหวังที่ดี (GX) เพื่อดําเนินการตรวจสอบความถูกต้องของข้อมูลในแบบจําลองความหมายของ Power BI
บทช่วยสอนนี้จะแสดงวิธีการ:
- ตรวจสอบข้อจํากัดบนชุดข้อมูลในพื้นที่ทํางาน Fabric ของคุณด้วยแหล่งข้อมูล Fabric ของ Great Expectation (สร้างขึ้นบนลิงก์ความหมาย)
- กําหนดค่าบริบทข้อมูล GX สินทรัพย์ข้อมูล และความคาดหวัง
- ดูผลลัพธ์การตรวจสอบความถูกต้องด้วยจุดตรวจสอบ GX
- ใช้ลิงก์เชิงความหมายเพื่อวิเคราะห์ข้อมูลดิบ
ข้อกําหนดเบื้องต้น
รับ การสมัครใช้งาน Microsoft Fabric หรือลงทะเบียนสําหรับ Microsoft Fabric รุ่นทดลองใช้ฟรี
ลงชื่อเข้าใช้ Microsoft Fabric
ใช้ตัวสลับประสบการณ์การใช้งานที่ด้านล่างซ้ายของหน้าหลักของคุณเพื่อเปลี่ยนเป็น Fabric
- เลือก พื้นที่ทํางาน จากบานหน้าต่างนําทางด้านซ้ายเพื่อค้นหาและเลือกพื้นที่ทํางานของคุณ พื้นที่ทํางานนี้จะกลายเป็นพื้นที่ทํางานปัจจุบันของคุณ
- ดาวน์โหลดไฟล์ Retail Analysis Sample PBIX.pbix
- ในพื้นที่ทํางานของคุณ ให้เลือก ไฟล์ นําเข้ารายงาน>หรือ รายงานที่มีการแบ่งหน้า>จากคอมพิวเตอร์เครื่องนี้ อัปโหลดไฟล์ Retail Analysis Sample PBIX.pbix ไปยังพื้นที่ทํางานของคุณ
ติดตามพร้อมกับในสมุดบันทึก
great_expectations_tutorial.ipynb คือสมุดบันทึกที่มาพร้อมกับบทช่วยสอนนี้
เมื่อต้องการเปิดสมุดบันทึกที่มาพร้อมกับบทช่วยสอนนี้ ให้ทําตามคําแนะนําใน เตรียมระบบของคุณสําหรับบทช่วยสอนวิทยาศาสตร์ข้อมูล การนําเข้าสมุดบันทึกไปยังพื้นที่ทํางานของคุณ
ถ้าคุณต้องการคัดลอกและวางโค้ดจากหน้านี้ สร้างสมุดบันทึกใหม่
ตรวจสอบให้แน่ใจว่า แนบ lakehouse เข้ากับ สมุดบันทึกก่อนที่คุณจะเริ่มเรียกใช้โค้ด
ตั้งค่าสมุดบันทึก
ในส่วนนี้ คุณตั้งค่าสภาพแวดล้อมของสมุดบันทึกด้วยโมดูลและข้อมูลที่จําเป็น
- ติดตั้ง
SemPy
และไลบรารีGreat Expectations
ที่เกี่ยวข้องจาก PyPI โดยใช้ความสามารถในการติดตั้ง%pip
ภายในสมุดบันทึก
# install libraries
%pip install semantic-link 'great-expectations<1.0' great_expectations_experimental great_expectations_zipcode_expectations
# load %%dax cell magic
%load_ext sempy
- ทําการนําเข้าโมดูลที่จําเป็นซึ่งคุณจะต้องใช้ในภายหลัง:
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
ตั้งค่าบริบทข้อมูล GX และแหล่งข้อมูล
เพื่อเริ่มต้นใช้งานด้วยความคาดหวังที่ยิ่งใหญ่ ก่อนอื่นคุณต้องตั้งค่า GX บริบทข้อมูล บริบททําหน้าที่เป็นจุดเริ่มต้นสําหรับการดําเนินการ GX และเก็บการกําหนดค่าที่เกี่ยวข้องทั้งหมดไว้
context = gx.get_context()
ตอนนี้คุณสามารถเพิ่มชุดข้อมูล Fabric ของคุณไปยังบริบทนี้เป็น แหล่งข้อมูล เพื่อเริ่มโต้ตอบกับข้อมูลได้ บทช่วยสอนนี้ใช้แบบจําลองความหมายตัวอย่างของ Power BI มาตรฐาน ไฟล์ .pbix ตัวอย่างการวิเคราะห์การค้าปลีก
ds = context.sources.add_fabric_powerbi("Retail Analysis Data Source", dataset="Retail Analysis Sample PBIX")
ระบุแอสเซทข้อมูล
กําหนด Data Assets เพื่อระบุชุดย่อยของข้อมูลที่คุณต้องการใช้งาน แอสเซทสามารถเป็นแบบง่าย เหมือนตารางเต็มรูปแบบ หรือซับซ้อนเหมือนคิวรีนิพจน์การวิเคราะห์ข้อมูลแบบกําหนดเอง (DAX)
ที่นี่ คุณจะเพิ่มหลายแอสเซท:
- ตาราง Power BI
- หน่วยวัด Power BI
- คิวรี DAX แบบกําหนดเอง
- คิวรี Dynamic Management View (DMV)
ตาราง Power BI
เพิ่มตาราง Power BI เป็นแอสเซทข้อมูล
ds.add_powerbi_table_asset("Store Asset", table="Store")
หน่วยวัด Power BI
หากชุดข้อมูลของคุณประกอบด้วยหน่วยวัดที่กําหนดไว้ล่วงหน้า คุณสามารถเพิ่มหน่วยวัดเป็นสินทรัพย์โดยทําตาม API ที่คล้ายคลึงกับ evaluate_measure
ของ SemPy
ds.add_powerbi_measure_asset(
"Total Units Asset",
measure="TotalUnits",
groupby_columns=["Time[FiscalYear]", "Time[FiscalMonth]"]
)
DAX
ถ้าคุณต้องการกําหนดหน่วยวัดของคุณเองหรือมีการควบคุมแถวที่เฉพาะเจาะจงมากขึ้น คุณสามารถเพิ่มแอสเซท DAX ด้วยคิวรี DAX แบบกําหนดเอง ที่นี่ เรากําหนดหน่วยวัด Total Units Ratio
โดยการหารหน่วยวัดที่มีอยู่สองหน่วย
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
ในบางกรณี อาจเป็นประโยชน์ถ้าใช้การคํานวณ Dynamic Management View (DMV) ซึ่งเป็นส่วนหนึ่งของกระบวนการตรวจสอบข้อมูล ตัวอย่างเช่น คุณสามารถติดตามจํานวนการละเมิด Referential Integrity ภายในชุดข้อมูลของคุณได้ สําหรับข้อมูลเพิ่มเติม โปรดดูที่ ล้างข้อมูล = รายงานที่รวดเร็ว
ds.add_powerbi_dax_asset(
"Referential Integrity Violation",
dax_string=
"""
SELECT
[Database_name],
[Dimension_Name],
[RIVIOLATION_COUNT]
FROM $SYSTEM.DISCOVER_STORAGE_TABLES
"""
)
ความคาดหวัง
เมื่อต้องการเพิ่มข้อจํากัดเฉพาะให้กับแอสเซท ก่อนอื่นคุณต้องกําหนดค่า Expectation Suites หลังจากเพิ่มแต่ละ ความคาดหวัง ไปยังแต่ละชุดคุณสามารถอัปเดตบริบทข้อมูลที่ตั้งค่าในเริ่มต้นด้วยชุดใหม่ สําหรับรายการทั้งหมดของความคาดหวังที่พร้อมใช้งาน โปรดดูแกลเลอรีความคาดหวังของ GX
เริ่มต้นด้วยการเพิ่ม "ชุดร้านค้าปลีก" ด้วยความคาดหวังสองประการ:
- รหัสไปรษณีย์ที่ถูกต้อง
- ตารางที่มีจํานวนแถวระหว่าง 80 ถึง 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
เพิ่ม "ชุดหน่วยวัดการค้าปลีก" ด้วยความคาดหวังหนึ่งรายการ:
- ค่าของคอลัมน์ควรมากกว่า 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)
DAX ของ Total Units Ratio
เพิ่ม "ชุด DAX ด้านการขายปลีก" ด้วยความคาดหวังหนึ่งอย่าง:
- ค่าคอลัมน์สําหรับอัตราส่วนของผลรวมหน่วยควรอยู่ระหว่าง 0.8 และ 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)
การละเมิด Referential Integrity (DMV)
เพิ่ม "Retail DMV Suite" ด้วยความคาดหวังหนึ่งข้อ:
- RIVIOLATION_COUNT ควรเป็น 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)
ตรวจ สอบ
เมื่อต้องการเรียกใช้ความคาดหวังที่ระบุกับข้อมูล ก่อนอื่นให้สร้าง Checkpoint และเพิ่มลงในบริบท สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดค่า Checkpoint โปรดดู เวิร์กโฟลว์การตรวจสอบข้อมูล
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
)
ตอนนี้เรียกใช้จุดตรวจสอบและแยกผลลัพธ์เป็น DataFrame ของ pandas สําหรับการจัดรูปแบบอย่างง่าย
result = checkpoint.run()
ประมวลผลและพิมพ์ผลลัพธ์ของคุณ
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"]]
จากผลลัพธ์เหล่านี้ คุณจะเห็นว่าความคาดหวังทั้งหมดของคุณผ่านการตรวจสอบความถูกต้อง ยกเว้น "สินทรัพย์ YoY ของหน่วยรวม" ที่คุณกําหนดผ่านคิวรี DAX แบบกําหนดเอง
วินิจฉัย
การใช้ลิงก์เชิงความหมายคุณสามารถดึงข้อมูลต้นทางเพื่อทําความเข้าใจว่าปีใดอยู่นอกช่วง ลิงก์เชิงความหมายให้เวทมนตร์แบบอินไลน์สําหรับการดําเนินการคิวรี DAX ใช้ลิงก์เชิงความหมายเพื่อดําเนินการคิวรีเดียวกันกับที่คุณส่งผ่านไปยังแอสเซทข้อมูล GX และแสดงภาพค่าที่เป็นผลลัพธ์
%%dax "Retail Analysis Sample PBIX"
EVALUATE SUMMARIZECOLUMNS(
'Time'[FiscalYear],
'Time'[FiscalMonth],
"Total Units Ratio", DIVIDE([Total Units This Year], [Total Units Last Year])
)
บันทึกผลลัพธ์เหล่านี้ใน DataFrame
df = _
ลงจุดผลลัพธ์
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
การลงจุด
จากพล็อต คุณจะเห็นว่าเดือนเมษายนและกรกฎาคมอยู่นอกช่วงเวลาเล็กน้อย และสามารถดําเนินการเพิ่มเติมเพื่อตรวจสอบได้
การจัดเก็บการกําหนดค่า GX
เมื่อข้อมูลในชุดข้อมูลของคุณเปลี่ยนแปลงเมื่อเวลาผ่านไป คุณอาจต้องการรีรันการตรวจสอบ GX ที่คุณเพิ่งดําเนินการ ในปัจจุบัน บริบทข้อมูล (ประกอบด้วยแอสเซทข้อมูลที่เชื่อมต่อ ชุดความคาดหวัง และ จุดตรวจสอบ) ถ่ายทอดสดแบบพิเศษ แต่สามารถแปลงเป็นบริบทไฟล์สําหรับการใช้งานในอนาคตได้ อีกวิธีหนึ่งคือคุณสามารถสร้างอินสแตนซ์บริบทไฟล์ (ดู สร้างอินสแตนซ์บริบทข้อมูล)
context = context.convert_to_file_context()
หลังจากที่คุณบันทึกบริบท ให้คัดลอกไดเรกทอรี gx
ไปยังเลคเฮ้าส์ของคุณ
สําคัญ
เซลล์นี้สมมุติว่าคุณ เพิ่มเลคเฮาส์ ลงในสมุดบันทึก ถ้าไม่มีเลคเฮาส์ที่แนบมา คุณจะไม่เห็นข้อผิดพลาด แต่คุณจะไม่สามารถรับบริบทได้ในภายหลัง ถ้าคุณเพิ่มเลคเฮ้าส์ในตอนนี้ เคอร์เนลจะรีสตาร์ต ดังนั้นคุณจะต้องเรียกใช้สมุดบันทึกทั้งหมดอีกครั้งเพื่อย้อนกลับไปยังจุดนี้
# copy GX directory to attached lakehouse
!cp -r gx/ /lakehouse/default/Files/gx
ในตอนนี้ บริบทในอนาคตสามารถสร้างขึ้นด้วย context = gx.get_context(project_root_dir="<your path here>")
เพื่อใช้การกําหนดค่าทั้งหมดจากบทช่วยสอนนี้
ตัวอย่างเช่น ในสมุดบันทึกใหม่ แนบ lakehouse เดียวกันและใช้ context = gx.get_context(project_root_dir="/lakehouse/default/Files/gx")
เพื่อดึงบริบท
เนื้อหาที่เกี่ยวข้อง
ดูบทช่วยสอนอื่น ๆ สําหรับลิงก์ความหมาย / SemPy:
- บทช่วยสอน : ล้างข้อมูลด้วยการขึ้นต่อกัน การทํางาน
- บทช่วยสอน : วิเคราะห์การขึ้นต่อกันของฟังก์ชันการทํางานในแบบจําลองความหมายตัวอย่าง
- บทช่วยสอน : แยกและคํานวณหน่วยวัด Power BI จากสมุดบันทึก Jupyter
- บทช่วยสอน : ค้นหาความสัมพันธ์ในแบบจําลองความหมายโดยใช้ลิงก์เชิงความหมาย
- บทช่วยสอน
: ค้นหาความสัมพันธ์ในชุดข้อมูล Synthea โดยใช้ลิงก์ความหมาย