marimo + ibis alternatif notebook
marimo ibis alternative
Bu derste neler öğreneceksin
- marimo reactive notebook açar
- ibis DataFrame abstraction ı dener
- DuckDB backend ile sorgu yazar
Jupyter’in Ötesinde: Reactive Notebook + Portable DataFrame
İki problem yaşıyoruz:
-
Jupyter’ın stateful doğası: Hücreleri yukarıdan aşağı değil, karışık sırayla çalıştırırsan sonuçlar senkronize olmaz. Bir hücreyi silersen bağımlı hücreler patlar. ML deneylerinde ve paylaşılan notebook’larda bu silent bug’lara yol açar.
-
Vendor lock-in: DuckDB’de yazdığın sorgu, Postgres’e taşıyınca çalışmaz (SQL dialect farkları). BigQuery’ye geçince yine değişir.
İki araç bu sorunları kökünden çözüyor:
- marimo — reactive notebook. Hücreler arasında veri akış grafiği kurar; bir değişiklik otomatik propagate olur.
- ibis — DataFrame abstraction katmanı. DuckDB, BigQuery, Snowflake, Postgres, Polars arasında aynı API.
Bugün ikisini birleştirip, dünkü open_library.duckdb’yi sorgulayacağız.
Kurulum
pip install "marimo[recommended]" "ibis-framework[duckdb]"
marimo’yu Başlat
marimo edit open_library_explore.py
Browser açılır. Sol: kod, sağ: çıktı. marimo .ipynb export da yapabilir (Jupyter uyumluluğu için), ama native formatı .py (git-friendly).
Reactive Hücre Grafiği
Hücre 1 — bağlantı:
import marimo as mo
import ibis
from ibis import _
# Backend seçimi: bugün DuckDB, yarın BigQuery
con = ibis.duckdb.connect("open_library.duckdb", read_only=True)
books = con.table("books")
mo.md(f"## `raw_books` şemasında **{books.count().execute():,}** kitap")
Sağda büyük puntolu “raw_books şemasında 1,234 kitap” yazısı belirir. marimo otomatik olarak bir sonraki hücre için yer ayırır.
Hücre 2 — filtre UI:
# Kullanıcı kontrolü
year_filter = mo.ui.range_slider(
start=1900, stop=2026, value=[1990, 2020],
label="Yıl aralığı",
)
n_top = mo.ui.slider(1, 50, value=10, label="Gösterilecek kitap sayısı")
mo.vstack([year_filter, n_top])
Sağda iki kontrol belirir: range slider (yıl aralığı) ve slider (kaç kitap). Bunları oynat.
Hücre 3 — reactive sorgu (kontrollerin değerine bağlı):
# Ibis sorgusu — değişkenler slider'lara bağlı
filtered = (
books
.filter(_.first_publish_year.between(year_filter.value[0], year_filter.value[1]))
.filter(_.title.notnull())
.order_by(_.first_publish_year.desc())
.select("title", "author_name", "first_publish_year", "edition_count")
.limit(n_top.value)
.execute()
)
mo.ui.table(filtered, pagination=True)
Slider’ı oynat — tablo anında değişir. Hücreleri yeniden çalıştırmana gerek yok. Jupyter’da bunu yapmak için onlarca hücre tekrar tekrar çalıştırman lazımdı.
Neden? marimo her hücreyi saf fonksiyon gibi değerlendirir. Girdiler değişince, bağımlı hücreler deterministik olarak yeniden hesaplanır. State kalmaz.
ibis ile Backend Değiştirmek
Tek satır değişiklik:
# DuckDB'den BigQuery'ye geç — sorgular aynı
con = ibis.bigquery.connect(
project_id="my-gcp-project",
dataset_id="raw_books",
)
books = con.table("books")
books.count(), _.first_publish_year.between(...), .order_by(...) — hiçbir şey değişmedi. ibis arka planda:
- Sorguyu backend’in dialektine çevirir (BigQuery standard SQL).
- Lazy evaluation:
execute()çağrılana kadar çalıştırmaz. - Type system: sütun tiplerini şemadan çeker, IDE autocomplete sağlar.
Bu polyglot persistence’ı mümkün kılar. Veri büyüdükçe DuckDB’den BigQuery’ye, sonra Snowflake’e — kod göç etmeden taşınır.
Compound: marimo + ibis + DuckDB
Üçlü stack modern data exploration için güçlü bir kombinasyon:
| Katman | İş |
|---|---|
| marimo | Reactive UI, paylaşılabilir notebook, git-friendly .py |
| ibis | Portable DataFrame API, backend-agnostic |
| DuckDB | Embedded OLAP, milyonlarca satırı saniyede sorgula |
Hiçbir cloud servise bağlı değilsin — laptop’ta çalışır. Production’a taşırken sadece con = ibis.bigquery.connect(...) değiştirirsin.
Production Patterns
- Notebook-as-app: marimo app’i deploy edilebilir (
marimo run). UI’lı küçük araçlar yaparsın. - ibis + dbt: dbt SQL’lerine gerek kalmadan Python’da transformation yazarsın.
- DuckDB + MotherDuck: local DuckDB’den cloud DuckDB’ye sıfır kod değişimiyle geçersin (MotherDuck managed).
Hands-on
- Slider’ı 1990-2020 aralığına getir, 20 kitap seç. Tabloyu incele.
ibis.duckdb.connect(...)->ibis.duckdb.connect("path/to/some_other.duckdb")değiştir, başka bir dataset aç.- (Bonus) BigQuery’ye bağlan (modül 3 sonrası mümkün). Aynı sorguları çalıştır.
Sıradaki
Modern ingestion + kalite + reactive notebook öğrendin. Modül 3’te buluta çıkıyoruz →