Validasi Skema dan Pernyataan
Tulis pemeriksaan assertion pada rentang kolom, batasan non-null, dan kunci unik yang dijalankan pada awal setiap pipeline.
Validasi Skema dan Pernyataan adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Mengapa Validasi Skema Penting
Pipeline data memproses data baru secara otomatis, sering kali tanpa peninjauan manusia. Jika skema file input berubah — kolom diganti namanya, format tanggal berubah, atau kategori baru muncul — pipeline seharusnya gagal secara jelas, bukan menghasilkan output yang salah secara diam-diam. Validasi skema dengan assertion merupakan mekanisme yang menegakkan kontrak antara produsen data dan konsumen data, serta menemukan masalah sedini mungkin.
import pandas as pd
import numpy as np
df = pd.read_parquet('sales_treated.parquet')
print('Loaded:', df.shape)
print(df.dtypes)Pemeriksaan Kolom yang Diperlukan
Validasi yang paling mendasar adalah memeriksa bahwa semua kolom yang diperlukan tersedia. Simpan kumpulan kolom yang diharapkan dalam konfigurasi, lalu pastikan kumpulan tersebut merupakan subset dari kolom yang sebenarnya. Pemeriksaan ini segera mendeteksi perubahan nama dan penghapusan kolom saat pipeline dimulai, sebelum kode berikutnya mencoba mengakses kolom yang hilang dan menimbulkan KeyError yang membingungkan jauh di dalam 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.')Assertion Tipe Data Kolom
Setelah memeriksa kolom yang diperlukan, validasikan tipe datanya. Kolom tanggal yang dimuat sebagai object berarti pd.to_datetime() belum dipanggil. Kolom ID yang disimpan sebagai float, bukan int64, sering kali menunjukkan adanya nilai NaN yang menghalangi penyimpanan sebagai integer. Tulis assertion tipe menggunakan assert df['col'].dtype == expected_type untuk kolom yang paling penting.
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.')Batasan Nilai Non-Null
Kolom utama seperti order_id, order_date, dan revenue seharusnya tidak pernah bernilai null. Gunakan df['col'].notna().all() untuk masing-masing kolom tersebut. Agar pesan assertion dapat ditindaklanjuti, sertakan jumlah nilai null sehingga operator pipeline mengetahui skala masalahnya, bukan sekadar mengetahui bahwa assertion gagal.
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.')Pemeriksaan Rentang untuk Kolom Numerik
Kolom numerik sering memiliki rentang yang valid secara bisnis. Pendapatan harus tidak negatif. Kuantitas harus berupa integer positif. Harga satuan harus lebih besar dari nol. Tegaskan batasan ini secara eksplisit — baris pendapatan negatif yang lolos akan membuat total menjadi lebih kecil dalam setiap agregasi berikutnya tanpa menimbulkan error. Pemeriksaan rentang mendeteksi kesalahan entri data dan bug pada sistem sumber lebih awal.
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.')Assertion Kunci Unik
Setelah deduplikasi, order_id seharusnya unik. Gunakan df['order_id'].is_unique untuk memastikan invarian ini tetap terpenuhi pada setiap proses pipeline. Pelanggaran keunikan setelah deduplikasi menunjukkan adanya bug dalam logika deduplikasi atau sumber data baru yang belum dibersihkan sebelum digabungkan ke dataset utama.
assert df['order_id'].is_unique, \
f'order_id not unique: {df.duplicated(subset=["order_id"]).sum()} duplicates'
print('Uniqueness check passed.')Assertion Nilai Kategorikal
Untuk kolom dengan kumpulan nilai valid yang terbatas — seperti region atau category — pastikan setiap nilai termasuk dalam kumpulan yang diizinkan. Ini mendeteksi nilai asing yang muncul setelah migrasi sistem atau perubahan pada entri data sumber. Tentukan kumpulan nilai valid dalam konfigurasi pipeline agar mudah diperbarui ketika bisnis berekspansi ke wilayah baru.
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.')Assertion Rentang Tanggal
Validasikan bahwa semua tanggal berada dalam periode yang diharapkan untuk dataset tersebut. Pesanan bertanggal di masa depan tidak mungkin terjadi; pesanan bertanggal sebelum perusahaan berdiri menunjukkan adanya catatan yang rusak. Tentukan MIN_DATE dan MAX_DATE dalam konfigurasi, lalu pastikan kolom berada dalam batas tersebut. Ini juga mendeteksi tanggal nol epoch Unix (1970-01-01) akibat konversi timestamp yang keliru.
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()}')Pengaman Jumlah Baris
Perubahan mendadak pada jumlah baris dibandingkan proses pipeline sebelumnya merupakan sinyal kuat adanya masalah pada sumber data. Simpan jumlah baris proses sebelumnya dalam file konfigurasi, lalu pastikan jumlah baru berada dalam rentang toleransi — misalnya, dalam ±20% dari jumlah historis. Dataset yang kehilangan 50% baris di antara dua proses hampir pasti menunjukkan ekspor data yang rusak.
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')Mengemas Pemeriksaan ke dalam Fungsi Validate
Kumpulkan semua assertion ke dalam satu fungsi validate(df) yang dapat dipanggil di awal setiap tahap pipeline. Setiap pemeriksaan menimbulkan AssertionError dengan pesan deskriptif jika gagal. Pola ini membuat pipeline terdokumentasi secara mandiri: fungsi validasi menjadi kontrak skema yang dapat dibaca mesin untuk DataFrame pada tahap tersebut.
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)Mencatat Kegagalan Validasi dengan Baik
Dalam pipeline produksi, crash akibat assert keras dapat diterima selama pengembangan, tetapi tidak diinginkan dalam pekerjaan terjadwal. Ganti assertion tanpa penanganan dengan blok try/except AssertionError yang mencatat pesan error dan, jika perlu, mengirimkan peringatan sebelum keluar. Dengan demikian, sistem pemantauan dapat menangkap alasan kegagalan, bukan hanya traceback pengecualian yang tidak tertangani.
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.')Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda mempelajari: memastikan kolom yang diperlukan, dtype, batasan non-null, dan validitas rentang, memeriksa kunci unik, nilai kategorikal, dan rentang tanggal, serta mengemas semua pemeriksaan ke dalam fungsi validate() yang dapat digunakan kembali dan dilengkapi logging. Selanjutnya, kita akan membahas agregasi khusus menggunakan apply() pada kolom dan baris.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Validasi Skema dan Pernyataan” gratis?
Ya — teks lengkap “Validasi Skema dan Pernyataan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Validasi Skema dan Pernyataan”?
Tulis pemeriksaan assertion pada rentang kolom, batasan non-null, dan kunci unik yang dijalankan pada awal setiap pipeline. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Validasi Skema dan Pernyataan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mendeteksi dan Menghapus Duplikat
- Deteksi dan Penanganan Pencilan
- Menyeragamkan Kategori yang Tidak Konsisten
- Validasi Skema dan Pernyataan