Marimo ile Reaktif Python Notebook'ları: Jupyter'a Modern Alternatif Rehberi (2026)
Marimo, Python notebook'larını reaktif bir hesaplama grafına dönüştürür: gizli hücre durumu yok, saf .py dosyaları, tek komutla web uygulaması. FastAPI arka planından gelen bir bakışla Marimo 0.10'un veri bilimi iş akışlarınızı nasıl sadeleştirdiğini gösteriyorum.
Marimo, Python notebook'larını reaktif bir hesaplama grafına dönüştüren açık kaynaklı bir editördür: bir hücreyi değiştirdiğinizde, ondan türeyen tüm hücreler otomatik yeniden çalışır, dosyalar saf .py olarak diske yazılır ve marimo run ile tek komutla dağıtılabilir bir web uygulaması elde edersiniz. Ben aslında FastAPI ve pydantic tarafında yıllar geçirmiş bir backend geliştiricisiyim; veri ekibiyle çalışırken Jupyter'ın gizli hücre durumu sorunu beni her seferinde tökezlettiği için 2025 sonundan bu yana ekip notebook'larımızı Marimo'ya taşıyorum. Bu rehber, o taşınma sırasında öğrendiklerimi 2026'nın en güncel sürüm bilgileriyle birleştiriyor. Dürüst olayım: geçişi hafife almıştım, ama iki hafta içinde ekip Jupyter'a dönmek istemedi.
Marimo hücreleri reaktif bir DAG (yönlü döngüsüz graf) üzerinde çalışır; bir değişkeni yeniden atamak ondan türeyen tüm hücreleri otomatik günceller ve gizli çalıştırma sırası sorununu ortadan kaldırır.
Notebook'lar Jupyter'ın JSON'una değil, doğrudan çalıştırılabilir .py dosyalarına yazılır; git diff, black, ruff ve pytest hiçbir eklenti olmadan çalışır.
Yerleşik marimo.ui bileşenleri (slider, dropdown, table, form) parametreleri reaktif değişkenlere bağlar; ayrı bir Streamlit veya Panel katmanına ihtiyaç kalmaz.
Marimo 0.10 (Temmuz 2026) yerel SQL hücreleri ile DuckDB, Polars ve pandas DataFrame'lerini aynı sözdiziminde sorgulayabilir.
marimo run notebook'u salt-okunur bir web uygulaması olarak sunar; marimo export html-wasm ise sunucusuz bir WASM paketi üretir.
Sandbox modu (--sandbox) her notebook'u kendi uv sanal ortamıyla çalıştırır; bağımlılık cehennemi biter.
Marimo nedir ve neden Jupyter'a alternatif?
Marimo, Stanford ve Google Brain kökenli bir ekip tarafından geliştirilen, Python için açık kaynaklı bir reaktif notebook ortamıdır. Jupyter'dan temel farkı, hücreler arasındaki ilişkiyi statik bir listeden bir bağımlılık grafına dönüştürmesidir. Klasik bir Jupyter oturumunda hücre 5'i çalıştırıp değişkeni değiştirdikten sonra hücre 2'yi yeniden çalıştırmayı unuttuğunuzda, notebook'unuzun gösterdiği çıktı ile kodu yeniden baştan koşturduğunuzda üreteceği çıktı birbirinden farklıdır; buna literatürde hidden state ya da out-of-order execution problemi denir. Pimentel ve arkadaşlarının GitHub'daki 1.16 milyon Jupyter notebook'u üzerinde yaptığı çalışma, incelenen notebook'ların yalnızca %24'ünün yukarıdan aşağı tekrar çalıştırıldığında aynı sonucu ürettiğini bulmuştur. Çoğaltılabilirlik açısından ciddi bir rakam bu.
Marimo bu problemi doğrudan mimari düzeyde çözer. Her hücre, hangi değişkenleri tanımladığını ve hangilerini okuduğunu statik analizle bildirir; motor bu bilgiden bir DAG kurar. Bir hücre çalıştığında, ondan türeyen tüm hücreler otomatik yeniden çalışır; ondan bağımsız olanlar hiç dokunulmaz. Ekstra olarak Marimo, çakışan atamalara ve döngüsel referanslara çalıştırma anında değil, dosyayı açar açmaz statik olarak izin vermez, dolayısıyla bir notebook açan herkes için deterministik olur. Bu tek özellik, veri ekibimizde onlarca "bende çalışıyordu" tartışmasını kesti.
Marimo'yu nasıl kurar ve ilk notebook'unuzu nasıl oluşturursunuz?
Marimo 0.10 (Temmuz 2026) itibarıyla Python 3.9+ desteklenir, ancak veri bilimi tarafında Python 3.11 veya 3.12 kullanmanızı öneririm; Marimo'nun statik analizi 3.11'den itibaren yapılan hız iyileştirmelerinden doğrudan faydalanıyor. Kurulum pip, uv veya conda üzerinden yapılabilir. Ben ekipçe uv'ye geçtiğimizden beri kurulumu tek komuta düşürdük.
# uv ile hızlı kurulum (önerilen)
uv pip install marimo
# veya klasik pip
pip install marimo
# Boş bir notebook başlat
marimo edit ilk_notebook.py
# Var olan bir Jupyter notebook'unu içeri aktar
marimo convert eski_defter.ipynb -o yeni_defter.py
marimo edit komutu tarayıcıda 2718 numaralı portta bir editör açar. Dosya adı bir .py uzantısıyla verildiği için Marimo bunu bir Python modülü olarak diske yazar. Bu, editörü kapadıktan sonra bile aynı dosyanın python ilk_notebook.py ile normal bir Python betiği olarak çalışabildiği anlamına gelir. Resmi Marimo hızlı başlangıç kılavuzu bu iki-modlu davranışı ayrıntılı belgeliyor.
FastAPI backend'inden gelen biri olarak, notebook'ları modül gibi import edebilmek benim için oyunun kurallarını değiştirdi: eğitim kodunu bir marimo_train.py içinde interaktif geliştirip, aynı dosyayı üretimdeki bir Prefect flow'undan doğrudan çağırabiliyorum. Ara sıvama katmanı yok.
Reaktif çalışma modeli: hücreler arası bağımlılıklar nasıl işler?
Marimo'nun reaktif motoru, hücreleri Python'un ast modülü üzerinden statik olarak analiz eder. Motor, her hücrenin hangi isimleri tanımladığını (definitions) ve hangilerini okuduğunu (references) çıkarır, sonra bu bilgiden yönlü bir graf inşa eder. Bir hücre çalıştığında, DAG'da ondan türeyen tüm hücreler topolojik sırayla yeniden çalıştırılır.
Bunun somut sonucu: aynı değişkeni iki farklı hücrede tanımlayamazsınız; Marimo bunu bir hata olarak işaretler. Bu ilk başta katı gibi görünse de aslında Python modüllerinin doğal davranışıdır (bir modülde iki tane def foo yazmıyorsunuz, aynı mantık).
import marimo as mo
import pandas as pd
# Hücre 1: veri yükleme
df = pd.read_csv("satislar.csv", parse_dates=["tarih"])
# Hücre 2: filtreleme (df'ye bağımlı)
son_ay = df[df["tarih"] >= "2026-07-01"]
# Hücre 3: özet (son_ay'a bağımlı)
ozet = son_ay.groupby("bolge")["tutar"].sum()
ozet
Yukarıdaki üç hücreyi tanımladıktan sonra CSV yolunu değiştirip Hücre 1'i çalıştırırsanız, Marimo Hücre 2 ve 3'ü otomatik yeniden çalıştırır ve ozet tablosu güncellenir. Klasik Jupyter'da bu üç hücreyi tek tek elle çalıştırmanız gerekirdi; birini atlarsanız gösterge tahtanız yalanı sergilerdi. Marimo'nun reaktivite belgelerinde anlatıldığı gibi, motor pahalı hücreleri (uzun çalışan model eğitimleri gibi) mo.stop() veya @mo.cache ile kontrol etmenize izin verir, böylece her küçük değişiklikte 20 dakikalık bir eğitim tetiklenmez.
UI elemanları ile etkileşimli veri keşfi
marimo.ui modülü, notebook'unuza tek satırlık kod ile interaktif bileşenler ekler. Bir slider, dropdown, date_range veya form tanımladığınızda, o bileşen bir Python değişkeni gibi diğer hücrelerde referans alınabilir; kullanıcı değeri değiştirdiği anda türeyen tüm hücreler yeniden çalışır. Bu, ayrı bir Streamlit veya Panel katmanı kurmadan interaktif keşfi doğrudan notebook'ta yapmanıza olanak tanır.
import marimo as mo
import pandas as pd
import altair as alt
df = pd.read_parquet("uretim_metrikleri.parquet")
# Etkileşimli kontroller
bolge = mo.ui.dropdown(
options=sorted(df["bolge"].unique().tolist()),
value="Marmara",
label="Bölge seçin",
)
esik = mo.ui.slider(start=0, stop=100, value=25, label="Alt eşik (%)")
mo.hstack([bolge, esik])
# Sonraki hücrede filtre otomatik reaktif
filtrelenmis = df.query("bolge == @bolge.value and verim_yuzde >= @esik.value")
chart = (
alt.Chart(filtrelenmis)
.mark_line(point=True)
.encode(x="tarih:T", y="verim_yuzde:Q", color="hat_id:N")
.properties(width=640, height=320)
)
chart
bolge.value veya esik.value değiştiği an filtreli DataFrame ve grafik otomatik yeniden hesaplanır. mo.ui.table() ile sanallaştırılmış, aranabilir bir DataFrame görünümü elde edersiniz; bir milyon satıra kadar akıcı çalışır, çünkü sunucu tarafında sayfalama yapılır. Python veri görselleştirme rehberimde anlattığım Matplotlib ve Plotly çıktıları da Marimo hücrelerinde birinci sınıf desteklidir; mo.mpl.interactive(fig) ile Matplotlib figürlerini yakınlaştırılabilir hale getirebilirsiniz.
Marimo vs Jupyter: detaylı karşılaştırma tablosu
Kararı hızlıca vermeniz için 2026 sürümlerini (Marimo 0.10, JupyterLab 4.4) yan yana koydum. Ekipçe geçiş kararı verirken bu tabloyu yönetici toplantısında da kullandım; en çok tartışmayı dosya biçimi ve reprodüksiyon satırları başlattı.
Özellik
Marimo 0.10
JupyterLab 4.4
Dosya biçimi
Saf .py (çalıştırılabilir modül)
.ipynb (JSON, çıktılar dahil)
Yürütme modeli
Reaktif DAG, otomatik yeniden hesaplama
Elle sıralı, gizli durum riski
Sürüm kontrolü
git diff okunabilir; çakışmalar minimal
JSON çakışmaları; nbdime gerektirir
UI bileşenleri
Yerleşik marimo.ui
ipywidgets (ayrı paket, ekstra kurulum)
Web uygulaması dağıtımı
marimo run ile tek komut, WASM ihracatı
Voilà veya nbconvert gerekir
SQL hücresi
Yerleşik (DuckDB tabanlı)
JupySQL uzantısı gerekir
Test edilebilirlik
pytest notebook'u modül olarak alır
nbval veya testbook plugin'i gerekir
Bağımlılık izolasyonu
--sandbox ile PEP 723 uv ortamı
Manuel kernel yönetimi
Öğrenme eğrisi
Orta (reaktif zihniyet gerekir)
Düşük (herkes tanıyor)
Sonuç: yeni bir proje başlatıyorsanız veya ekibin çoğaltılabilirlik acısı gerçekse, Marimo net kazanır. Ancak makine öğrenimi araştırmasında %matplotlib inline, %%timeit gibi IPython magic'lerine bağımlıysanız ya da Colab/Kaggle üzerinde çalışıyorsanız (Marimo'nun bu ortamlarda desteği hâlâ deneysel), Jupyter kalmaya devam eder. Marimo'nun 0.10 sürümünde eklenen marimo.notebook.magics shim'i bazı magic'leri destekliyor, ama tümünü değil.
Pandas, Polars ve DuckDB entegrasyonu
Marimo, tablo tabanlı Python kütüphanelerinin çıktısını otomatik olarak zengin bir görünümle sunar. Pandas DataFrame'leri sayfalanabilir bir tabloya, Polars LazyFrame'leri koleksiyona alındıklarında aynı görünüme dönüşür. Polars rehberimde anlattığım gibi Polars'ın lazy API'si Marimo'nun reaktif motoruyla çok iyi uyum sağlar: bir LazyFrame'i başka bir hücrede .collect() ile materiye ettiğinizde, motor önce ucuz plan aşamasını yeniden hesaplar, ağır hesaplama yalnızca gerekliyken tetiklenir.
0.10 sürümünde eklenen en sevdiğim özellik yerel SQL hücreleridir. Bir SQL hücresi oluşturduğunuzda, altında çalışan motor DuckDB'dir ve mevcut pandas/Polars DataFrame'lerinizi otomatik olarak tablo gibi görür; hiçbir register() çağrısı gerekmez. Bu davranışın performans temelini DuckDB rehberimde ayrıntılı ele almıştım.
import marimo as mo
import polars as pl
# Hücre 1: Polars ile veri yükleme
satislar = pl.scan_parquet("s3://veri/satislar_2026/*.parquet")
# Hücre 2: SQL hücresi (mo.sql, Marimo'nun UI'ında SQL rozetiyle gelir)
en_iyi_bolgeler = mo.sql(
"""
SELECT bolge,
SUM(tutar) AS toplam,
COUNT(*) AS islem_sayisi
FROM satislar
WHERE tarih >= '2026-01-01'
GROUP BY bolge
ORDER BY toplam DESC
LIMIT 10
"""
)
en_iyi_bolgeler
mo.sql() çıktısı da bir Polars DataFrame'dir; sonraki hücrelerde doğrudan .plot() veya .filter() zincirleyebilirsiniz. Bu, "önce SQL ile çekirdek büyük veriyi ez, sonra Python ile detaylı işle" akışını tek notebook'ta kesintisiz yapabilmenizi sağlıyor. FastAPI arka planında yıllardır özlediğim bir ergonomiydi bu, açıkçası.
Marimo notebook'unu web uygulaması olarak nasıl yayınlarsınız?
Marimo'nun ekiplerde en hızlı benimsenen yönü, aynı .py dosyasının hem geliştirme notebook'u hem de üretimde çalışan bir web uygulaması olabilmesidir. Üç yayınlama seçeneği var:
App modu:marimo run notebook.py --port 8080. Kod hücreleri gizlenir, yalnızca UI ve çıktı görünür; kullanıcılar interaktif olarak keşif yapabilir ama kod düzenleyemez. Bu modu Docker imajına koyup Kubernetes'te sunuyoruz.
WASM ihracatı:marimo export html-wasm notebook.py -o dist/. Notebook, Pyodide üzerinde tarayıcıda çalışan tek bir statik HTML paketine dönüşür. Sunucu maliyeti sıfır; GitHub Pages veya S3 üzerinde yayınlanabilir. Ağır ML kütüphaneleri (torch gibi) WASM'da çalışmaz, ama pandas/Polars/scikit-learn küçük-orta veriler için mükemmel.
Statik HTML:marimo export html notebook.py -o rapor.html. Reaktivite yoktur; sadece son çıktının bir anlık görüntüsüdür. Yönetici raporları için ideal.
--no-token bayrağı yalnızca kimlik doğrulamayı bir ters proxy (Nginx, Traefik) veya kimlik sağlayıcısı (Auth0, Cognito) arkasında yaptığınızda kullanılmalıdır. Aksi hâlde, notebook'u açık web'e bırakırsanız herkes uygulamayı görüntüleyebilir. Ben ekipçe Marimo uygulamalarını FastAPI'nin APIRouter'ıyla montajlanan bir starlette.middleware.wsgi arkasına koyuyorum, böylece token, telemetri ve rate-limit merkezî geliyor.
Sık Sorulan Sorular
Marimo, Jupyter'dan daha mı iyi?
Çoğaltılabilirlik, sürüm kontrolü ve web uygulaması dağıtımı önceliğinizse Marimo net şekilde daha iyidir. Ekosistem olgunluğu (özellikle IPython magic'leri, Colab entegrasyonu, ders materyalleri) ve tanışıklık önemliyse Jupyter'ın bugünkü avantajı hâlâ devam ediyor. Yeni projelerde Marimo'yu, mevcut araştırma projelerinde Jupyter'ı öneriyorum.
Marimo notebook'larını Jupyter'a geri dönüştürebilir miyim?
Evet. marimo export ipynb notebook.py -o notebook.ipynb komutu Marimo notebook'unu klasik .ipynb formatına dönüştürür. Ancak reaktif bağımlılık grafı düz sıralı bir listeye düşürülür; sıra genellikle DAG'ın topolojik dizilimidir.
Marimo ücretsiz ve açık kaynak mı?
Evet, Marimo Apache 2.0 lisansı altında tamamen açık kaynaktır. Kaynak kodu github.com/marimo-team/marimo adresinde bulunur. Marimo ekibi ayrıca ticari bir bulut ürünü (Marimo Cloud) sunuyor, ancak notebook motoru ve tüm özellikleri OSS tarafında serbestçe kullanılabilir.
Marimo hangi Python sürümlerini destekler?
Marimo 0.10, Python 3.9 ve üzerini resmi olarak destekler. Reaktif motor Python'un ast modülüne dayandığı için 3.11+ sürümlerinde belirgin şekilde daha hızlı çalışır. Yeni projelerde Python 3.12 kullanmanızı, mevcut projelerde ise 3.11'e yükselmenizi öneririm.
Marimo'da yan etkili işlemleri nasıl kontrol ederim?
Yan etkili kodları (dosya yazma, API çağrısı, veritabanı UPDATE, e-posta gönderme) her zaman bir mo.ui.run_button() veya mo.ui.form() arkasına sarın; hücre yalnızca kullanıcı butona basınca çalışır. Ayrıca mo.stop(kosul, cikis) ile bir hücrenin belirli koşullar altında yayılmayı durdurmasını sağlayabilirsiniz.
Ibis 10.x ile tek Python dataframe API üzerinden DuckDB, BigQuery ve Snowflake'i sorgulayın. Kurulum, kod örnekleri, Pandas'tan geçiş ve dört ambarda edindiğim üretim ipuçları.
Great Expectations 1.x ile Python veri boru hatlarınızı pandas ve Airflow üzerinden otomatik test edin. Fluent API, Checkpoint kurulumu ve Data Docs paylaşımı için üretim odaklı örnekler.
ONNX Runtime ile PyTorch ve scikit-learn modellerini üretimde 2-5x hızlı, %85 daha az bellekle sunun. INT8 kuantalama, execution provider seçimi ve FastAPI servisi gerçek benchmark rakamlarıyla.