แชร์ผ่าน


บทช่วยสอน: ตรวจสอบข้อมูลโดยใช้ SemPy และความคาดหวังที่ยิ่งใหญ่ (GX)

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีการใช้ SemPy ร่วมกับ ความคาดหวัง (GX) ที่ยอดเยี่ยมเพื่อดําเนินการตรวจสอบความถูกต้องของข้อมูลในแบบจําลองความหมายของ Power BI

บทช่วยสอนนี้จะแสดงวิธีการ:

  • ตรวจสอบข้อจํากัดบนชุดข้อมูลในพื้นที่ทํางาน Fabric ของคุณด้วยแหล่งข้อมูล Fabric ของ Great Expectation (สร้างขึ้นบนลิงก์ความหมาย)
    • กําหนดค่าบริบทข้อมูล GX สินทรัพย์ข้อมูล และความคาดหวัง
    • ดูผลลัพธ์การตรวจสอบความถูกต้องด้วยจุดตรวจสอบ GX
  • ใช้ลิงก์เชิงความหมายเพื่อวิเคราะห์ข้อมูลดิบ

ข้อกำหนดเบื้องต้น

  • เลือก พื้นที่ทํางาน จากบานหน้าต่างนําทางด้านซ้ายเพื่อค้นหาและเลือกพื้นที่ทํางานของคุณ พื้นที่ทํางานนี้จะกลายเป็นพื้นที่ทํางานปัจจุบันของคุณ
  • ดาวน์โหลดไฟล์ Retail Analysis Sample PBIX.pbix
  • ในพื้นที่ทํางานของคุณ ใช้ปุ่ม อัปโหลด เพื่ออัปโหลดไฟล์ PBIX.pbix ตัวอย่างการวิเคราะห์ด้านการขายปลีกไปยังพื้นที่ทํางาน

ติดตามพร้อมกับในสมุดบันทึก

great_expectations_tutorial.ipynb คือสมุดบันทึกที่มาพร้อมกับบทช่วยสอนนี้

เมื่อต้องการเปิดสมุดบันทึกที่มาพร้อมกับบทช่วยสอนนี้ ให้ทําตามคําแนะนําใน เตรียมระบบของคุณสําหรับบทช่วยสอนวิทยาศาสตร์ข้อมูล เพื่อนําเข้าสมุดบันทึกไปยังพื้นที่ทํางานของคุณ

ถ้าคุณต้องการคัดลอกและวางรหัสจากหน้านี้แทน คุณสามารถสร้าง สมุดบันทึกใหม่ได้

ตรวจสอบให้แน่ใจว่าแนบ lakehouse เข้ากับสมุดบันทึก ก่อนที่คุณจะเริ่มเรียกใช้รหัส

ตั้งค่าสมุดบันทึก

ในส่วนนี้ คุณตั้งค่าสภาพแวดล้อมของสมุดบันทึกด้วยโมดูลและข้อมูลที่จําเป็น

  1. ติดตั้ง SemPy และไลบรารีที่เกี่ยวข้อง Great Expectations จาก PyPI โดยใช้ %pip ความสามารถในการติดตั้งภายในสมุดบันทึก
# install libraries
%pip install semantic-link great-expectations great_expectations_experimental great_expectations_zipcode_expectations

# load %%dax cell magic
%load_ext sempy
  1. ทําการนําเข้าโมดูลที่จําเป็นซึ่งคุณจะต้องใช้ในภายหลัง:
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 ของคุณในบริบท นี้เป็นแหล่งข้อมูล เพื่อเริ่มโต้ตอบกับข้อมูลได้ บทช่วยสอนนี้ใช้ไฟล์ .pbix ตัวอย่างการวิเคราะห์การค้าปลีกของแบบจําลองความหมายมาตรฐาน

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

ระบุแอสเซทข้อมูล

กําหนด แอสเซท ข้อมูลเพื่อระบุชุดย่อยของข้อมูลที่คุณต้องการใช้งาน แอสเซทสามารถเป็นแบบง่าย เหมือนตารางเต็มรูปแบบ หรือซับซ้อนเหมือนคิวรีนิพจน์การวิเคราะห์ข้อมูลแบบกําหนดเอง (DAX)

ที่นี่ คุณจะเพิ่มหลายแอสเซท:

  • ตาราง Power BI
  • หน่วยวัด Power BI
  • คิวรี DAX แบบกําหนดเอง
  • คิวรีมุมมอง การจัดการแบบไดนามิก (DMV)

ตาราง Power BI

เพิ่มตาราง Power BI เป็นแอสเซทข้อมูล

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

หน่วยวัด Power BI

หากชุดข้อมูลของคุณประกอบด้วยหน่วยวัดที่กําหนดไว้ล่วงหน้า คุณสามารถเพิ่มหน่วยวัดเป็นสินทรัพย์โดยทําตาม API ที่คล้ายกับของ SemPy evaluate_measure

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

ในบางกรณี อาจเป็นประโยชน์ที่จะใช้ การคํานวณมุมมอง การจัดการแบบไดนามิก (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
    """
)

ความคาดหวัง

เมื่อต้องการเพิ่มข้อจํากัดเฉพาะลงในแอสเซท ก่อนอื่นคุณต้องกําหนดค่า ชุดความคาดหวัง หลังจากเพิ่มความคาดหวังแต่ละรายการไปยังแต่ละชุดคุณสามารถอัปเดตบริบทข้อมูลตั้งค่าในเริ่มต้นด้วยชุดใหม่ สําหรับรายการทั้งหมดของความคาดหวังที่พร้อมใช้งาน โปรดดูแกลเลอรีความคาดหวังของ 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)

Total Units Ratio Dax

เพิ่ม "ชุด 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_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])
)

ตารางแสดงผลลัพธ์จากการสรุปคิวรี DAX

บันทึกผลลัพธ์เหล่านี้ใน 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

การลงจุดจะแสดงผลลัพธ์ของการสรุปคิวรี DAX

จากพล็อต คุณจะเห็นว่าเดือนเมษายนและกรกฎาคมอยู่นอกช่วงเวลาเล็กน้อย และสามารถดําเนินการเพิ่มเติมเพื่อตรวจสอบได้

การจัดเก็บการกําหนดค่า 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: