Pandera: Validasi Data Statistik untuk DataFrame pandas dan Polars
Pipeline data sering gagal tanpa suara. Sebuah kolom yang seharusnya tidak pernah negatif lolos begitu saja, salah ketik pada kategori merusak join di tahap berikutnya, dan Anda baru menyadarinya ketika dashboard terlihat keliru tiga hari kemudian. Pandera memungkinkan Anda mendeklarasikan bentuk DataFrame yang seharusnya langsung di dalam Python dan menegakkan aturan itu tepat di tempat data mengalir. Tutorial ini membahas Pandera dari instalasi pertama hingga integrasi pipeline produksi, dengan dataset transaksi penjualan sebagai contoh yang dipakai sepanjang artikel.
Apa Itu Pandera
Pandera adalah pustaka validasi data untuk data tabular. Anda mendefinisikan sebuah skema, yaitu deskripsi kolom, tipe datanya, dan batasan yang harus dipenuhi, lalu Anda memvalidasi sebuah DataFrame terhadap skema tersebut. Jika data sesuai, DataFrame dikembalikan tanpa perubahan. Jika tidak, Pandera memunculkan error yang memberi tahu Anda persis baris dan kolom mana yang gagal beserta alasannya.
Ide utamanya adalah skema merupakan objek Python biasa. Skema berada di dalam basis kode Anda, berdampingan dengan fungsi yang menghasilkan dan mengonsumsi data. Pendekatan ini kadang disebut "schema as code": tidak ada file konfigurasi terpisah, tidak ada layanan validasi eksternal, dan tidak ada YAML yang harus dijaga agar tetap sinkron. Anda mengimpor skema sama seperti mengimpor modul lain.
Pandera awalnya berfokus pada pandas dan kini mendukung beberapa backend, termasuk Polars dan PySpark, melalui model skema bersama. Logika validasi yang Anda tulis sebagian besar sama, terlepas dari mesin DataFrame yang ada di baliknya.
Kapan Memakai Pandera dibanding Great Expectations
Kedua pustaka memvalidasi data tabular, tetapi keduanya menyasar alur kerja yang berbeda.
Great Expectations adalah kerangka kerja yang lebih berat. Ia memelihara sebuah data context, menghasilkan dokumentasi data berbentuk HTML, menyimpan hasil validasi, dan dirancang dengan gagasan platform kualitas data terpusat yang dipakai bersama oleh analis dan engineer. Ini cocok ketika Anda membutuhkan laporan validasi yang dapat diaudit, katalog ekspektasi, dan perkakas yang juga digunakan oleh non-pengembang.
Pandera ringan dan mengutamakan kode. Ia menambahkan validasi secara inline di proses Python yang sama dengan proses yang mentransformasi data. Tidak ada context yang perlu dikonfigurasi dan tidak ada penyimpanan artefak. Anda memilih Pandera ketika menginginkan asersi yang berada di dalam fungsi ETL, batas fungsi yang diperiksa tipenya, dan validasi yang berjalan sebagai bagian normal dari pipeline tanpa infrastruktur tambahan.
Aturan praktisnya: jika validasi adalah urusan pengembang yang menyatu dengan kode, pilih Pandera. Jika validasi adalah urusan organisasi dengan dokumentasi dan pelaporan bersama, Great Expectations sepadan dengan bobotnya. Keduanya tidak saling meniadakan; sebagian tim memakai Pandera untuk pemeriksaan inline yang cepat dan Great Expectations untuk kontrak yang terdokumentasi.
Instalasi
Pasang paket inti dengan pip.
pip install pandera
Dukungan backend dan fitur opsional didistribusikan sebagai extras. Pasang hanya yang Anda butuhkan.
# Dukungan Polars
pip install 'pandera[polars]'
Dukungan PySpark
pip install 'pandera[pyspark]'
Pemeriksaan statistik berbasis hypothesis
pip install 'pandera[hypotheses]'
Semuanya
pip install 'pandera[all]'
Verifikasi instalasi dan periksa versinya.
import pandera as pa
print(pa.version)
Skema Pertama dengan DataFrameSchema
API berbasis objek berpusat pada DataFrameSchema, yang menyimpan pemetaan nama kolom ke definisi Column. Berikut sebuah skema untuk tabel transaksi penjualan.
import pandas as pd
import pandera as pa
from pandera import Column, Check, DataFrameSchema
schema = DataFrameSchema(
{
"transactionid": Column(int, unique=True),
"product": Column(str),
"category": Column(str),
"quantity": Column(int, Check.greaterthan(0)),
"unitprice": Column(float, Check.greaterthanorequalto(0)),
"region": Column(str),
"customeremail": Column(str, nullable=True),
},
strict=True,
coerce=True,
)
Setiap Column menerima sebuah dtype dan batasan opsional. Beberapa parameter melakukan sebagian besar pekerjaan: