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

Yeni Bir Not Defteri: marimo

Şimdiye kadar klasik Jupyter notebook gördük. Çalışıyor, ama bir sorunu var: Hücreleri yukarıdan aşağı sırayla değil, karışık sırayla çalıştırırsan sonuçlar tutarsızlaşır. Bir hücreyi silersen alttaki hücreler patlar.

marimo adlı yeni nesil not defteri bu sorunu çözer: Hücreler reactive (tepki veren). Bir hücreyi değiştirince, ona bağlı diğer hücreler otomatik güncellenir. Sanki bir Excel formülü gibi — bir hücreyi değiştir, bağlı tüm tablo değişsin.

Bir de ibis var: bu, veritabanını sorgulamak için ortak bir dil. DuckDB’ye yaz, Postgres’e geç, BigQuery’ye geç — sorgu kodu değişmez. Tek bir satırla backend değiştirirsin.

Bugün ikisini birlikte deneyeceğiz. Çok eğlenceli.

Önce marimo’yu Kur

Terminalde:

pip install marimo ibis-framework[duckdb]

Birkaç saniye bekle. Sonra bir klasör aç ve:

marimo edit library_analysis.py

Bir browser penceresi açılacak. Solda kod, sağda sonuç. marimo’nun kendine özgü tasarımı var — hücreler arasındaki bağımlılıklar okla gösteriliyor.

İlk Hücreyi Yaz

Sol tarafa şunu yapıştır:

import marimo as mo
import ibis
from ibis import _

# DuckDB'ye bağlan (dünkü veritabanımız)
con = ibis.duckdb.connect("open_library_demo.duckdb")

# books tablosunu yükle
books = con.table("books")
mo.md(f"## Kütüphanemizde **{books.count().execute()}** kitap var")

Sağ tarafta anında: “Kütüphanemizde 1000 kitap var” (veya kaç geldiyse). Hücrenin altında otomatik olarak yeni bir hücre belirdi — marimo seni yönlendiriyor.

İkinci Hücre: En Eski 5 Kitap

Yeni hücreye:

# En eski 5 kitabı bul
oldest = (
    books
    .filter(_.first_publish_year.notnull())
    .order_by(_.first_publish_year.asc())
    .select("title", "author_name", "first_publish_year")
    .limit(5)
    .execute()
)
oldest

Sağda güzel bir tablo belirdi. Her satırda bir kitap, yazarı, yılı. Bunlar gerçekten en eski 5 kitap.

Hücreleri Birbirine Bağla

Şimdi sihirli kısım. Bir slider ekle:

# Kaç kitap göstermek istiyorsun?
n_books = mo.ui.slider(start=1, stop=20, value=5, label="Gösterilecek kitap sayısı")
n_books

Slider’ı sağa-sola oynat. Aşağıdaki hücreyi ekle:

top_n = (
    books
    .filter(_.first_publish_year.notnull())
    .order_by(_.first_publish_year.asc())
    .select("title", "author_name", "first_publish_year")
    .limit(n_books.value)
    .execute()
)
top_n

Slider’ı oynat — tablo otomatik değişiyor! Jupyter’da bunu yapmak için hücreyi tekrar tekrar çalıştırman lazımdı. marimo’da reactive sayesinde tek dokunuş.

Backend Değiştirmek Çok Kolay

Şimdi DuckDB yerine Postgres kullansak ne olur? Tek satır değişir:

# DuckDB -> Postgres'e geç, geri kalan kod AYNI
con = ibis.postgres.connect(
    host="localhost",
    user="postgres",
    password="postgres",
    database="books_db",
)

Aynı books tablosu, aynı sorgular. Hiçbir şey değişmeyecek. Sadece bağlantı değişti.

Bu, veri mühendisliğinde çok güçlü bir özellik: verin büyüyünce DuckDB’den BigQuery’ye, sonra Snowflake’e taşıyabilirsin, kodun %99’u aynı kalır. ibis arka planda her backend’in kendi diline (SQL dialect) çeviriyor.

Kendi Denemen

Slider’ı 20’ye getir. Şimdi en eski yerine en yeni kitapları görmek istiyorsan, sıralamayı asc() yerine desc() yap. Tüm tablo yenilenir.

Bir de arama kutusu eklemeyi dene:

search = mo.ui.text(placeholder="Yazar adı ara...")
search

filtered = (
    books
    .filter(_.author_name.cast("string").contains(search.value))
    .select("title", "author_name", "first_publish_year")
    .limit(10)
    .execute()
)
filtered

“Yaz” — her harf girildiğinde sonuç anında filtreleniyor. Çok hızlı, çok eğlenceli.

Neden Bu Kadar Hızlı?

Çünkü marimo her hücreyi bağımsız bir Python süreci gibi çalıştırıyor ve sadece değişen bağımlılıkları tekrar hesaplıyor. Üstelik veri DuckDB’de — milyonlarca satır olsa bile saniyeler içinde filtreliyor.

ibis ise sorguları lazy (tembel) çalıştırır. Sen top_n’i istemeden önce hiçbir şey yapmaz. İsteyince, tek seferde en verimli SQL’i üretip DuckDB’ye yollar.

Sıradaki

marimo ile eğlenceli analiz yaptın. Modül 3’te buluta çıkıyoruz →