Ibis: API Dataframe Python yang Portabel di Banyak Backend
Ibis adalah library dataframe Python yang memungkinkan Anda menulis kode analitik satu kali lalu menjalankannya di banyak mesin eksekusi, mulai dari DuckDB lokal di laptop hingga BigQuery, Snowflake, atau Spark di produksi. Daripada menulis ulang logika pandas menjadi SQL ketika data sudah tidak muat di memori, Anda cukup mendeskripsikan transformasinya dalam Python, dan Ibis akan mengompilasinya ke dialek backend mana pun yang Anda hubungkan. Tutorial ini membahas konsep intinya: deferred execution, portabilitas backend, dan contoh analitik menyeluruh yang praktis.
Masalah yang Diselesaikan Ibis
Banyak tim data menghadapi kendala yang sama. Anda membuat prototipe analisis dengan pandas karena cepat ditulis dan mudah dipahami. Dataset bertambah besar, tidak lagi muat di memori, dan sekarang Anda harus menerjemahkan kode pandas tersebut menjadi SQL agar bisa berjalan di dalam data warehouse. Kedua implementasi itu mulai berbeda, bug muncul saat penerjemahan, dan Anda harus memelihara dua versi dari logika yang sama.
Ibis menawarkan satu API dataframe yang berdiri di depan mesin eksekusi. Anda menulis ekspresi dalam Python, dan:
- Kode yang sama berjalan di mesin lokal (DuckDB) saat pengembangan dan di warehouse (BigQuery, Snowflake, Postgres) saat produksi.
- Komputasi berat terjadi di dalam mesin, dekat dengan data, bukan di proses Python Anda.
- Anda terhindar dari menerjemahkan pandas ke SQL secara manual, dan bisa menskalakan dari laptop ke warehouse cukup dengan mengganti koneksi.
Model berpikirnya lebih dekat ke query builder ketimbang pandas. Anda menyusun deskripsi sebuah komputasi, bukan langsung memmaterialisasi hasil antara.
Deferred Execution (Eksekusi Tertunda)
Ini adalah konsep paling penting di Ibis. Ketika Anda merangkai operasi seperti filter, select, dan groupby, tidak ada yang dihitung. Anda sedang membangun expression tree. Eksekusi baru terjadi ketika Anda secara eksplisit meminta hasilnya.
import ibis
con = ibis.duckdb.connect()
Ini membangun ekspresi. Belum ada query yang berjalan.
orders = con.table("orders")
expr = (
orders
.filter(orders.status == "completed")
.groupby("country")
.aggregate(total=orders.amount.sum())
)
Masih belum ada yang dieksekusi. expr hanyalah sebuah deskripsi.
print(type(expr)) #
Eksekusi terjadi di sini, mengembalikan pandas DataFrame.
df = expr.execute()
Titik pemicu yang benar-benar menjalankan query adalah:
.execute()— mengembalikan pandas DataFrame (default)..topandas()— output pandas secara eksplisit..topolars()— mengembalikan Polars DataFrame..topyarrow()— mengembalikan PyArrow Table..head().execute()— melihat sampel kecil.
Karena eksekusi tertunda, Ibis dapat mendorong seluruh pipeline ke mesin sebagai satu query yang teroptimasi. Inilah yang membuatnya skalabel: Anda tidak menarik data mentah ke Python lalu memfilternya di sana.
Instalasi
Ibis dipasang bersama satu atau lebih extra backend. Setiap backend yang ingin Anda gunakan adalah dependensi opsional, sehingga instalasinya tetap ramping.
# Library inti plus backend DuckDB (titik awal yang direkomendasikan)
pip install 'ibis-framework[duckdb]'
Tambahkan backend lain sesuai kebutuhan
pip install 'ibis-framework[bigquery]'
pip install 'ibis-framework[postgres]'
pip install 'ibis-framework[snowflake]'
pip install 'ibis-framework[polars]'
Beberapa backend sekaligus
pip install 'ibis-framework[duckdb,postgres,bigquery]'
Verifikasi instalasi:
import ibis
print(ibis.version)
DuckDB adalah backend lokal yang direkomendasikan. Ia berjalan in-process, tidak butuh server, dan mendukung jangkauan fitur SQL lengkap yang dikompilasi Ibis, sehingga ideal untuk pengembangan dan pengujian.
Menghubungkan ke Backend
Koneksi adalah objek yang tahu cara berbicara dengan sebuah mesin. API ekspresi yang sama bekerja terlepas dari koneksi mana yang Anda buat.
import ibis
DuckDB in-memory (bagus untuk eksperimen)
con = ibis.duckdb.connect()
DuckDB yang dipersistensi ke file
con = ibis.duckdb.connect("analytics.ddb")