0Pricing
Pandas & NumPy Academy · บทเรียน

การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข

เขียนการตรวจสอบยืนยันช่วงค่าคอลัมน์ ข้อกำหนดห้ามเป็นค่าว่าง และคีย์ที่ไม่ซ้ำ ซึ่งทำงานเมื่อเริ่มต้นทุกกระบวนการประมวลผล

การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการตรวจสอบโครงสร้างข้อมูลจึงสำคัญ

pipeline ข้อมูลประมวลผลข้อมูลใหม่โดยอัตโนมัติ ซึ่งมักไม่มีการตรวจทานโดยมนุษย์ หากโครงสร้างของไฟล์นำเข้าเปลี่ยนแปลง เช่น มีการเปลี่ยนชื่อคอลัมน์ รูปแบบวันที่เปลี่ยนไป หรือมีหมวดหมู่ใหม่ปรากฏขึ้น pipeline ควร หยุดทำงานพร้อมแจ้งปัญหาอย่างชัดเจน แทนที่จะสร้างผลลัพธ์ที่ผิดโดยไม่มีการแจ้งเตือน การตรวจสอบโครงสร้างข้อมูลด้วยการยืนยันเงื่อนไขคือกลไกที่บังคับใช้ข้อตกลงระหว่างผู้สร้างข้อมูลกับผู้ใช้ข้อมูล และตรวจจับปัญหาให้เร็วที่สุด

import pandas as pd
import numpy as np

df = pd.read_parquet('sales_treated.parquet')
print('Loaded:', df.shape)
print(df.dtypes)

การตรวจสอบคอลัมน์ที่จำเป็น

การตรวจสอบขั้นพื้นฐานที่สุดคือการตรวจว่ามีคอลัมน์ที่จำเป็นครบทั้งหมด จัดเก็บชุดคอลัมน์ที่คาดไว้ในการตั้งค่า แล้วตรวจยืนยันว่าชุดดังกล่าวเป็นสับเซตของคอลัมน์จริง การตรวจสอบนี้จะตรวจจับการเปลี่ยนชื่อและการลบคอลัมน์ได้ทันทีเมื่อเริ่ม pipeline ก่อนที่โค้ดส่วนถัดไปจะพยายามเข้าถึงคอลัมน์ที่หายไปและทำให้เกิด KeyError ที่เข้าใจได้ยากในส่วนลึกของ pipeline

REQUIRED_COLUMNS = {'order_id', 'order_date', 'customer_id',
                    'product', 'category', 'quantity', 'unit_price', 'revenue'}

missing = REQUIRED_COLUMNS - set(df.columns)
assert not missing, f'Missing required columns: {missing}'
print('All required columns present.')

การยืนยันชนิดข้อมูลของคอลัมน์

หลังจากตรวจสอบคอลัมน์ที่จำเป็นแล้ว ให้ตรวจสอบชนิดข้อมูลของคอลัมน์เหล่านั้น คอลัมน์วันที่ที่โหลดเป็น object หมายความว่ายังไม่ได้เรียกใช้ pd.to_datetime() คอลัมน์ ID ที่จัดเก็บเป็น float แทนที่จะเป็น int64 มักหมายความว่ามีค่า NaN ซึ่งทำให้ไม่สามารถจัดเก็บเป็นจำนวนเต็มได้ ให้เขียนการยืนยันชนิดข้อมูลโดยใช้ assert df['col'].dtype == expected_type กับคอลัมน์ที่สำคัญที่สุด

assert pd.api.types.is_datetime64_any_dtype(df['order_date']), \
    'order_date must be datetime'
assert pd.api.types.is_numeric_dtype(df['revenue']), \
    'revenue must be numeric'
assert df['order_id'].dtype == object or pd.api.types.is_integer_dtype(df['order_id']), \
    'order_id must be string or int'
print('Dtype checks passed.')

ข้อกำหนดห้ามเป็นค่าว่าง

คอลัมน์สำคัญอย่าง order_id order_date และ revenue ไม่ควรเป็นค่าว่าง ให้ยืนยันด้วย df['col'].notna().all() สำหรับแต่ละคอลัมน์ เพื่อให้ข้อความการยืนยันนำไปใช้แก้ปัญหาได้จริง ให้ระบุจำนวนค่าที่เป็นค่าว่างด้วย เพื่อให้ผู้ควบคุม pipeline ทราบขนาดของปัญหา ไม่ใช่เพียงทราบว่าการยืนยันล้มเหลว

NOT_NULL_COLS = ['order_id', 'order_date', 'revenue', 'customer_id']

for col in NOT_NULL_COLS:
    null_count = df[col].isna().sum()
    assert null_count == 0, f'{col} has {null_count} null values'

print('Non-null checks passed.')

การตรวจสอบช่วงค่าของคอลัมน์ตัวเลข

คอลัมน์ตัวเลขมักมีช่วงค่าที่ถูกต้องตามกฎทางธุรกิจ รายได้ต้องไม่ติดลบ จำนวนต้องเป็นจำนวนเต็มบวก ราคาต่อหน่วยต้องมากกว่าศูนย์ ให้ยืนยันข้อกำหนดเหล่านี้อย่างชัดเจน เพราะแถวที่มีรายได้ติดลบซึ่งหลุดรอดไปจะทำให้ยอดรวมในการรวมข้อมูลทุกส่วนถัดไปต่ำกว่าความเป็นจริงโดยไม่มีข้อผิดพลาด การตรวจสอบช่วงค่าช่วยตรวจจับข้อผิดพลาดในการป้อนข้อมูลและข้อบกพร่องของระบบต้นทางได้ตั้งแต่เนิ่น ๆ

assert (df['revenue'] >= 0).all(), 'Negative revenue found'
assert (df['quantity'] > 0).all() or df['is_return'].any(), \
    'Non-positive quantity without return flag'
assert (df['unit_price'] > 0).all(), 'Zero or negative unit price found'

print('Range checks passed.')

การยืนยันคีย์ไม่ซ้ำ

หลังการลบข้อมูลซ้ำแล้ว order_id ควรมีค่าไม่ซ้ำกัน ให้ยืนยันด้วย df['order_id'].is_unique เพื่อตรวจสอบว่าคุณสมบัตินี้ยังคงเป็นจริงในการทำงานของ pipeline ทุกครั้ง การพบค่าซ้ำหลังการลบข้อมูลซ้ำบ่งชี้ว่าตรรกะการลบข้อมูลซ้ำมีข้อบกพร่อง หรือมีแหล่งข้อมูลใหม่ที่ยังไม่ได้ทำความสะอาดก่อนนำมารวมกับชุดข้อมูลหลัก

assert df['order_id'].is_unique, \
    f'order_id not unique: {df.duplicated(subset=["order_id"]).sum()} duplicates'

print('Uniqueness check passed.')

การยืนยันค่าของข้อมูลแบบจัดหมวดหมู่

สำหรับคอลัมน์ที่มีชุดค่าที่ใช้ได้จำกัด เช่น region หรือ category ให้ยืนยันว่าทุกค่าอยู่ในชุดค่าที่อนุญาต วิธีนี้ช่วยตรวจจับค่าผิดปกติที่ปรากฏหลังการย้ายระบบหรือการเปลี่ยนแปลงวิธีป้อนข้อมูลในระบบต้นทาง กำหนดชุดค่าที่ใช้ได้ไว้ในการตั้งค่า pipeline เพื่อให้ปรับปรุงได้ง่ายเมื่อธุรกิจขยายไปยังภูมิภาคใหม่

VALID_REGIONS = {'North', 'South', 'East', 'West', 'Central'}
VALID_CATEGORIES = {'electronics', 'apparel', 'home', 'sports', 'beauty', 'other'}

assert df['region'].isin(VALID_REGIONS).all(), \
    f'Invalid regions: {df[~df["region"].isin(VALID_REGIONS)]["region"].unique()}'
assert df['category'].isin(VALID_CATEGORIES).all(), \
    'Invalid categories found'

print('Categorical checks passed.')

การยืนยันช่วงวันที่

ตรวจสอบว่าวันที่ทั้งหมดอยู่ในช่วงเวลาที่คาดไว้สำหรับชุดข้อมูล วันที่สั่งซื้อในอนาคตเป็นไปไม่ได้ ส่วนวันที่สั่งซื้อก่อนบริษัทก่อตั้งบ่งชี้ว่าระเบียนเสียหาย กำหนด MIN_DATE และ MAX_DATE ในการตั้งค่า แล้วตรวจยืนยันว่าคอลัมน์อยู่ภายในขอบเขต นอกจากนี้ยังช่วยตรวจจับวันที่จากค่าเริ่มต้นยุค Unix (1970-01-01) ที่เกิดจากการแปลงประทับเวลาผิดพลาด

MIN_DATE = pd.Timestamp('2020-01-01')
MAX_DATE = pd.Timestamp('today')

assert (df['order_date'] >= MIN_DATE).all(), 'Date before minimum found'
assert (df['order_date'] <= MAX_DATE).all(), 'Future date found'

print(f'Date range: {df["order_date"].min()} to {df["order_date"].max()}')

การป้องกันจำนวนแถว

การเปลี่ยนแปลงจำนวนแถวอย่างฉับพลันเมื่อเทียบกับการทำงานของ pipeline ครั้งก่อนเป็นสัญญาณสำคัญของปัญหาจากระบบต้นทาง จัดเก็บจำนวนแถวของการทำงานครั้งก่อนในไฟล์การตั้งค่า และตรวจยืนยันว่าจำนวนใหม่อยู่ภายในช่วงความคลาดเคลื่อน เช่น อยู่ภายใน ±20% ของจำนวนในอดีต หากชุดข้อมูลสูญเสียแถวไป 50% ระหว่างการทำงานสองครั้ง ย่อมบ่งชี้เกือบแน่นอนว่าการส่งออกข้อมูลเสียหาย

EXPECTED_MIN_ROWS = 5000
EXPECTED_MAX_ROWS = 200000

assert EXPECTED_MIN_ROWS <= len(df) <= EXPECTED_MAX_ROWS, \
    f'Row count {len(df)} outside expected range [{EXPECTED_MIN_ROWS}, {EXPECTED_MAX_ROWS}]'

print(f'Row count check passed: {len(df)} rows')

การรวมการตรวจสอบไว้ในฟังก์ชัน Validate

รวมการยืนยันเงื่อนไขทั้งหมดไว้ในฟังก์ชัน validate(df) เดียว ซึ่งสามารถเรียกใช้ได้เมื่อเริ่มแต่ละขั้นตอนของ pipeline การตรวจสอบแต่ละรายการจะแสดง AssertionError พร้อมข้อความอธิบายเมื่อไม่ผ่าน รูปแบบนี้ทำให้ pipeline อธิบายตัวเองได้: ฟังก์ชันตรวจสอบคือข้อตกลงโครงสร้างข้อมูลที่เครื่องอ่านได้สำหรับ DataFrame ในขั้นตอนนั้น

def validate_sales_df(df):
    assert not (REQUIRED_COLUMNS - set(df.columns)), 'Missing columns'
    assert df['order_id'].is_unique, 'Duplicate order IDs'
    assert (df['revenue'] >= 0).all(), 'Negative revenue'
    assert df['region'].isin(VALID_REGIONS).all(), 'Invalid region'
    print(f'Validation passed: {len(df)} rows, {len(df.columns)} columns')

validate_sales_df(df)

การบันทึกความล้มเหลวของการตรวจสอบอย่างเหมาะสม

ใน pipeline สำหรับระบบจริง การหยุดทำงานจาก assert โดยตรงอาจยอมรับได้ระหว่างการพัฒนา แต่ไม่เหมาะกับงานตามกำหนดเวลา ให้แทนที่การยืนยันแบบเปล่าด้วยบล็อก try/except AssertionError ที่บันทึกข้อความข้อผิดพลาด และอาจส่งการแจ้งเตือนก่อนออกจากโปรแกรม วิธีนี้ทำให้ระบบเฝ้าติดตามบันทึกสาเหตุของความล้มเหลวได้ แทนที่จะเห็นเพียงร่องรอยข้อยกเว้นที่ไม่ได้รับการจัดการ

import logging

logging.basicConfig(level=logging.INFO)

def validate_with_logging(df):
    checks = [
        (lambda d: d['order_id'].is_unique, 'Duplicate order IDs'),
        (lambda d: (d['revenue'] >= 0).all(), 'Negative revenue found'),
    ]
    for check_fn, msg in checks:
        try:
            assert check_fn(df), msg
        except AssertionError as e:
            logging.error(f'VALIDATION FAILED: {e}')
            raise

validate_with_logging(df)
print('All checks passed.')

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดการวิเคราะห์ข้อมูลจากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับ การยืนยันคอลัมน์ที่จำเป็น ชนิดข้อมูล ข้อกำหนดห้ามเป็นค่าว่าง และความถูกต้องของช่วงค่า การตรวจสอบคีย์ที่ไม่ซ้ำ ค่าข้อมูลแบบจัดหมวดหมู่ และช่วงวันที่ และ การรวมการตรวจสอบทั้งหมดไว้ในฟังก์ชัน validate() ที่นำกลับมาใช้ใหม่ได้พร้อมการบันทึกข้อมูล บทถัดไป เราจะศึกษาการรวมข้อมูลแบบกำหนดเองโดยใช้ apply() กับคอลัมน์และแถว

คำถามที่พบบ่อย

บทเรียน “การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข”

เขียนการตรวจสอบยืนยันช่วงค่าคอลัมน์ ข้อกำหนดห้ามเป็นค่าว่าง และคีย์ที่ไม่ซ้ำ ซึ่งทำงานเมื่อเริ่มต้นทุกกระบวนการประมวลผล คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตรวจหาและลบข้อมูลซ้ำ
  2. การตรวจหาและจัดการค่าผิดปกติ
  3. การทำหมวดหมู่ที่ไม่สอดคล้องให้เป็นมาตรฐาน
  4. การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข
← กลับไปที่ Pandas & NumPy Academy