Modül 3 · Atölye: Veri Alımı · ⏱ 5 dk

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:

  1. 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.

  2. 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:

  1. Sorguyu backend’in dialektine çevirir (BigQuery standard SQL).
  2. Lazy evaluation: execute() çağrılana kadar çalıştırmaz.
  3. 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İş
marimoReactive UI, paylaşılabilir notebook, git-friendly .py
ibisPortable DataFrame API, backend-agnostic
DuckDBEmbedded 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

  1. Notebook-as-app: marimo app’i deploy edilebilir (marimo run). UI’lı küçük araçlar yaparsın.
  2. ibis + dbt: dbt SQL’lerine gerek kalmadan Python’da transformation yazarsın.
  3. DuckDB + MotherDuck: local DuckDB’den cloud DuckDB’ye sıfır kod değişimiyle geçersin (MotherDuck managed).

Hands-on

  1. Slider’ı 1990-2020 aralığına getir, 20 kitap seç. Tabloyu incele.
  2. ibis.duckdb.connect(...) -> ibis.duckdb.connect("path/to/some_other.duckdb") değiştir, başka bir dataset aç.
  3. (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 →