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 →