MarimoJupyterQuartoPythonNotebooks@mo.cellReactive Programming

Marimo vs Jupyter vs Quarto : Le Guide Complet des Notebooks Python 2025 (@mo.cell)

GP
Gaël Penessot
Marimo vs Jupyter vs Quarto : Le Guide Complet des Notebooks Python 2025 (@mo.cell)

36% des notebooks Jupyter sur GitHub ne s'exécutent pas.

Cette statistique, issue d'une étude 2023, révèle un problème que tout data scientist connaît : les notebooks Jupyter sont fondamentalement cassés.

Vous l'avez déjà vécu :

  • Vous exécutez les cellules dans le désordre → variables fantômes
  • Vous partagez le notebook à un collègue → "Ça ne marche pas chez moi"
  • Vous faites un git diff → 500 lignes de JSON incompréhensible
  • Vous revenez sur le notebook 3 mois plus tard → impossible à reproduire

Aujourd'hui, je vais vous montrer pourquoi les notebooks traditionnels sont obsolètes, et comment Marimo révolutionne complètement l'expérience avec son système de cellules réactives @mo.cell.

Qu'est-ce que @mo.cell ? La Révolution des Notebooks Réactifs

Avant de plonger dans les problèmes de Jupyter, comprenons ce qui rend Marimo différent : @mo.cell, le décorateur Python qui transforme chaque cellule en fonction pure et réactive.

import marimo as mo

# Chaque cellule est une fonction décorée avec @mo.cell
@mo.cell
def __():
    # Les variables retournées sont accessibles aux autres cellules
    x = 10
    return x,

@mo.cell
def __(x):  # Dépendance explicite : cette cellule utilise x
    # Si x change, cette cellule se ré-exécute AUTOMATIQUEMENT
    y = x * 2
    return y,

@mo.cell
def __(y):
    # Graphique mis à jour en temps réel quand y change
    import plotly.express as px
    fig = px.bar(x=['A', 'B'], y=[y, y+10])
    return fig,

Ce qui se passe automatiquement :

  1. Marimo analyse le graphe de dépendances entre cellules
  2. Si vous modifiez xy se recalcule → le graphique se met à jour
  3. Zéro exécution manuelle, zéro état incohérent

C'est comme avoir React pour notebooks Python : tout est réactif, tout est cohérent, toujours.

Le Problème Fondamental de Jupyter

Jupyter a révolutionné l'analyse de données en 2014. Mais 10 ans plus tard, ses limitations sont criantes.

Problème 1 : L'Ordre d'Exécution Chaotique

# Cellule 1
x = 10

# Cellule 2
y = x * 2
print(y)  # Output: 20

# Vous modifiez x et ré-exécutez Cellule 1
x = 5

# Mais vous oubliez de ré-exécuter Cellule 2
# y vaut toujours 20 au lieu de 10 !

Impact : État global incohérent qui mène à des analyses erronées.

Problème 2 : Variables Fantômes

# Vous testez une variable temporaire
temp_result = df.groupby('region').sum()

# Vous supprimez la cellule
# Mais temp_result existe toujours en mémoire !

# Des heures plus tard...
final_result = temp_result.merge(other_df)  # Ça marche !

# Votre collègue exécute le notebook de haut en bas
# NameError: name 'temp_result' is not defined

Impact : Irreproductibilité totale.

Problème 3 : Conflits Git Impossibles

Le format .ipynb est du JSON avec métadonnées :

{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 47,
      "metadata": {
        "scrolled": true,
        "collapsed": false
      },
      "outputs": [...]
    }
  ]
}

Un simple changement de variable génère des diffs de 500 lignes avec :

  • Numéros d'exécution modifiés
  • Métadonnées de cellules
  • Outputs encodés en base64

Impact : git diff inutilisable, merge conflicts cauchemardesque.

Problème 4 : Production Impossible

Pour mettre un notebook en production :

  1. Convertir en .py (nbconvert)
  2. Refactorer le code
  3. Extraire les fonctions
  4. Ajouter les tests
  5. Gérer les dépendances

Impact : Le notebook reste un POC jetable, jamais en prod.

Marimo : La Nouvelle Génération de Notebooks

Après avoir testé Marimo pendant 3 mois sur des projets réels, voici pourquoi c'est un game changer.

1. Python Pur (Fini le JSON)

Les notebooks Marimo sont des fichiers .py standards :

import marimo

__generated_with = "0.8.0"
app = marimo.App()

@app.cell
def __():
    import polars as pl
    import duckdb
    return pl, duckdb

@app.cell
def __(pl):
    df = pl.read_csv("data.csv")
    return df,

if __name__ == "__main__":
    app.run()

Avantages :

  • git diff lisible
  • ✅ Merge conflicts triviaux
  • ✅ Éditeurs de code standard (VS Code, PyCharm)
  • ✅ Linters, formatters, type checkers natifs

2. Réactivité Native (Zéro Variable Fantôme)

Marimo analyse automatiquement les dépendances entre cellules :

@app.cell
def __():
    x = 10
    return x,

@app.cell
def __(x):  # Dépendance explicite
    y = x * 2
    return y,

Si vous modifiez x, Marimo recalcule automatiquement y.

Impossible d'avoir un état incohérent. C'est comme React pour notebooks.

3. SQL Intégré avec DuckDB

@app.cell
def __():
    import duckdb
    con = duckdb.connect()
    return con,

@app.cell
def __(con):
    result = con.sql("""
        SELECT region, SUM(sales) as total
        FROM 'sales.parquet'
        GROUP BY region
        ORDER BY total DESC
    """).df()
    return result,

Support natif pour :

  • DuckDB (fichiers Parquet, CSV, JSON)
  • PostgreSQL, MySQL, SQLite
  • Snowflake, BigQuery, Redshift

Pas besoin d'extensions. C'est built-in.

4. IA Embarquée (CodePilot)

Marimo intègre des assistants IA :

# Demandez en langage naturel
# "Crée un graphique des ventes par région avec Plotly"

# Marimo génère le code
@app.cell
def __(result):
    import plotly.express as px
    fig = px.bar(result, x='region', y='total', title='Ventes par région')
    return fig,

Modèles supportés :

  • OpenAI GPT-4
  • Anthropic Claude
  • Google Gemini
  • Modèles locaux (Ollama)

5. Déploiement Unifié (Notebook → App → Script)

Le même fichier .py fonctionne dans 3 modes :

Mode Notebook (Développement)

marimo edit my_analysis.py

Interface interactive avec cellules, outputs, graphiques.

Mode App (Production)

marimo run my_analysis.py

Application web Streamlit-like, sans réécriture.

Mode Script (Batch)

python my_analysis.py

Exécution batch standard, parfait pour cron jobs.

Un seul fichier, trois usages. Fini la duplication Jupyter → Streamlit.

Cas d'Usage Réel : Simulateur de Prêt Immobilier

J'ai créé un simulateur de prêt avec Marimo pour comparer l'approche traditionnelle.

Fonctionnalités

  • Paramètres interactifs (montant, durée, taux)
  • Comparaison de scénarios (fixe vs variable)
  • Graphiques réactifs (amortissement, intérêts)
  • Export CSV des résultats
  • Déploiement web public

Le Code (Extrait)

import marimo as mo

@mo.cell
def __():
    # Sliders interactifs
    montant = mo.ui.slider(50_000, 500_000, value=200_000, label="Montant")
    duree = mo.ui.slider(5, 30, value=20, label="Durée (années)")
    taux = mo.ui.slider(1.0, 5.0, value=2.5, step=0.1, label="Taux (%)")
    return montant, duree, taux

@mo.cell
def __(montant, duree, taux):
    # Calcul réactif automatique
    mensualite = calculer_mensualite(montant.value, duree.value, taux.value)
    total_interets = mensualite * duree.value * 12 - montant.value
    return mensualite, total_interets

@mo.cell
def __(mensualite, duree):
    # Graphique mis à jour automatiquement
    import plotly.express as px
    tableau_amortissement = generer_tableau(mensualite, duree.value)
    fig = px.area(tableau_amortissement, x='mois', y=['capital', 'interets'])
    return fig,

Résultat :

  • Changez un slider → tout se recalcule instantanément
  • Zéro st.rerun() ou gestion manuelle d'état
  • Même fichier = notebook + app web

Démo live : marimo-loan-simulator

Marimo vs Jupyter vs Quarto : Tableau Comparatif Complet

Pour choisir le bon outil, voici le comparatif exhaustif des 3 solutions modernes :

Critère Jupyter Quarto Marimo
Format fichier JSON (.ipynb) Markdown (.qmd) Python pur (.py)
Syntaxe Cellules + Markdown Markdown + code blocks @mo.cell (Python)
Git diff ❌ Illisible (JSON) ✅ Propre (texte) ✅ Propre (Python)
État global ❌ Incohérent ❌ Incohérent ✅ Garanti cohérent
Réactivité ❌ Manuelle ❌ Manuelle ✅ Automatique (@mo.cell)
SQL natif ❌ Extensions ✅ SQL blocks ✅ Built-in (DuckDB)
IA assistante ❌ Extensions ❌ Non ✅ CodePilot intégré
Publication ⚠️ nbconvert ✅ HTML/PDF/Word ✅ Web app (marimo run)
Déploiement web ❌ Conversion complexe ⚠️ Statique uniquement ✅ Interactif (marimo run)
Scripts batch ⚠️ nbconvert ⚠️ Render statique python file.py
Linters/formatters ⚠️ Extensions ✅ Markdown tools ✅ Python natif
Multi-langages ✅ Python, R, Julia ✅ Python, R, Observable ❌ Python uniquement
Écosystème ✅ Énorme (10 ans) ✅ Croissant (RStudio) ⚠️ Jeune (2 ans)
Use case principal Exploration interactive Publication scientifique Analyse → App web

Verdict par cas d'usage :

  • Exploration data rapideMarimo (réactivité + @mo.cell)
  • Publication scientifique/rapportsQuarto (multi-format export)
  • Écosystème riche/widgetsJupyter (10 ans d'extensions)
  • Prototype → ProductionMarimo (même fichier = notebook + app)

Ma recommandation 2025 :

  • Commencez avec Marimo pour nouvelles analyses
  • Utilisez Quarto pour rapports académiques/clients
  • Gardez Jupyter pour projets legacy et besoins multi-langages

Marimo vs Streamlit : Le Match Inattendu

Marimo n'est pas qu'un concurrent de Jupyter. C'est aussi un concurrent de Streamlit.

Critère Streamlit Marimo
Dev/Prod ❌ Séparé ✅ Unifié
Réactivité ❌ Re-exécution complète ✅ Granulaire
Notebook interactif ❌ Non ✅ Oui
SQL natif ❌ Non ✅ DuckDB
Facilité ✅ Très simple ⚠️ Courbe apprentissage
Customisation UI ✅ Riche ⚠️ Limitée
Écosystème ✅ Énorme ⚠️ Naissant

Cas d'usage Marimo :

  • Analyses exploratoires → apps web
  • Dashboards simples
  • Prototypes rapides

Cas d'usage Streamlit :

  • Dashboards complexes avec multi-pages
  • UI hautement customisée
  • Apps grand public

Ma recommandation : Marimo pour analyses/prototypes, Streamlit pour apps production complexes.

Adoption en Production : Ça Marche Vraiment ?

Stanford SLAC National Accelerator Laboratory

Utilise Marimo pour recherche scientifique :

  • Analyses physique des particules
  • Notebooks reproductibles partagés entre chercheurs
  • Déploiement web pour visualisations

Marimo Labs

  • Levée de fonds 5M$ série A (2024)
  • 15K+ étoiles GitHub
  • Croissance 300% en 12 mois

Signal fort : Ce n'est pas un side project, c'est une vraie alternative soutenue.

Limitations et Défis

Soyons honnêtes, Marimo n'est pas parfait :

1. Écosystème Moins Mature

Jupyter a 10 ans d'avance :

  • 100K+ extensions
  • Widgets spécialisés partout
  • Documentation abondante

Marimo a 2 ans. Certains widgets nécessitent adaptations.

2. Courbe d'Apprentissage

La réactivité demande un changement de mindset :

# ❌ Pattern Jupyter (impératif)
df = load_data()
df = clean_data(df)
df = transform_data(df)

# ✅ Pattern Marimo (fonctionnel)
@app.cell
def __(load_data):
    raw_df = load_data()
    return raw_df,

@app.cell
def __(raw_df, clean_data):
    clean_df = clean_data(raw_df)
    return clean_df,

@app.cell
def __(clean_df, transform_data):
    final_df = transform_data(clean_df)
    return final_df,

Adaptation : 1-2 semaines pour devenir à l'aise.

3. UI Customisation Limitée (vs Streamlit)

Pour dashboards complexes, Streamlit reste supérieur :

  • Multi-pages natives
  • Injection CSS
  • Layouts avancés

Installation et Premier Pas

Étape 1 : Installation (30 secondes)

pip install marimo

Étape 2 : Tutorial Interactif (10 minutes)

marimo tutorial intro

Marimo lance un notebook interactif qui vous apprend les bases en live.

Étape 3 : Créer Votre Premier Notebook

marimo edit my_first_notebook.py

Interface web s'ouvre → Créez vos cellules → Sauvegardez.

Fichier généré : my_first_notebook.py (Python pur !)

Étape 4 : Déployer en App

marimo run my_first_notebook.py

Votre analyse devient app web instantanément.

Migration Jupyter → Marimo

Vous avez des notebooks Jupyter existants ?

# Convertir .ipynb → .py
marimo convert notebook.ipynb -o notebook.py

# Éditer avec Marimo
marimo edit notebook.py

Attention : La conversion est semi-automatique. Vous devrez :

  1. Vérifier les dépendances entre cellules
  2. Refactorer les variables globales
  3. Tester l'exécution

Temps estimé : 15-30 min par notebook moyen.

🚀 Créez des Applications Data Modernes

Marimo change la donne pour les analyses exploratoires. Mais pour des dashboards production-ready complexes, Streamlit reste imbattable.

Dans ma formation Streamlit Unleashed, je vous montre comment créer des applications data professionnelles :

Ce que vous allez apprendre :

Applications Streamlit Production-Ready

  • Multi-pages avec navigation avancée
  • State management robuste
  • Performance optimisée (cache, Polars, DuckDB)

Intégration Marimo + Streamlit

  • Quand utiliser Marimo vs Streamlit
  • Workflow : Prototype Marimo → Production Streamlit
  • Best practices des deux outils

Déploiement Multi-Cloud

  • Streamlit Cloud, Render, Railway
  • CI/CD avec GitHub Actions
  • Monitoring et alertes

Projets Concrets

  • Dashboard BI complet
  • App d'analyse avec réactivité
  • Interface ML deployment

🎯 Formation Streamlit Unleashed

Maîtrisez Streamlit ET Marimo pour des apps data modernes

20 heures de contenu pratique • Projets concrets • Accès à vie

297€ 197€

Découvrir la Formation →

FAQ : Vos Questions sur Marimo, Jupyter et Quarto

Qu'est-ce que @mo.cell dans Marimo ?

@mo.cell est un décorateur Python qui transforme chaque cellule de notebook en fonction pure et réactive. Quand une variable change, toutes les cellules qui en dépendent se ré-exécutent automatiquement, garantissant un état cohérent sans intervention manuelle.

@mo.cell
def __(x):  # Dépend de x
    y = x * 2
    return y,  # Si x change, y se recalcule automatiquement

Marimo peut-il remplacer Jupyter complètement ?

Pas encore à 100%, mais dans 80% des cas, oui. Marimo excelle pour :

  • Analyses exploratoires reproductibles
  • Prototypes → déploiement web
  • Notebooks git-friendly

Gardez Jupyter pour :

  • Projets nécessitant l'écosystème mature (widgets spécifiques)
  • Multi-langages (R, Julia)
  • Workflows legacy établis

Quarto vs Marimo : lequel choisir ?

Utilisez Quarto si :

  • Vous publiez des rapports (HTML, PDF, Word)
  • Vous travaillez avec R ou Observable
  • Vous avez besoin de contrôle fin sur la mise en page

Utilisez Marimo si :

  • Vous voulez des notebooks interactifs → apps web
  • Vous avez besoin de réactivité automatique
  • Vous préférez Python pur (pas de Markdown)

Comment migrer mes notebooks Jupyter vers Marimo ?

Migration automatique en 3 étapes :

# 1. Convertir .ipynb → .py
marimo convert notebook.ipynb -o notebook.py

# 2. Éditer avec Marimo
marimo edit notebook.py

# 3. Tester et ajuster les dépendances

Temps moyen : 15-30 minutes par notebook.

Marimo est-il gratuit et open-source ?

Oui, Marimo est 100% gratuit et open-source (Apache 2.0 License). Pas de version payante, pas de fonctionnalités limitées. Le projet est soutenu par une levée de fonds de 5M$ (série A, 2024) pour garantir sa pérennité.

Les notebooks Marimo fonctionnent-ils hors ligne ?

Oui, Marimo s'exécute entièrement en local sur votre machine. Aucune connexion internet requise (sauf pour l'assistant IA optionnel).

Puis-je déployer une app Marimo en production ?

Absolument ! Trois modes de déploiement :

# App web interactive
marimo run app.py --host 0.0.0.0 --port 8000

# Script batch (cron jobs)
python app.py

# Déploiement cloud (Docker)
docker run -p 8000:8000 my-marimo-app

Compatible avec : Streamlit Cloud, Render, Railway, AWS, GCP, Azure.

Marimo supporte-t-il les bases de données ?

Oui, support natif pour :

  • DuckDB (built-in, recommandé)
  • PostgreSQL, MySQL, SQLite
  • Snowflake, BigQuery, Redshift
  • Fichiers Parquet, CSV, JSON

Exemple :

@mo.cell
def __():
    import duckdb
    df = duckdb.sql("SELECT * FROM 'data.parquet'").df()
    return df,

Conclusion : L'Ère Post-Jupyter

Les notebooks Jupyter ont révolutionné l'analyse de données en 2014. Mais en 2025, leurs limitations sont inacceptables :

  • ❌ État global incohérent
  • ❌ Variables fantômes
  • ❌ Git impossible
  • ❌ Production complexe

Marimo résout tous ces problèmes :

  • ✅ Réactivité automatique
  • ✅ Python pur (git-friendly)
  • ✅ Déploiement unifié (notebook → app → script)
  • ✅ SQL et IA natifs

La question n'est plus "Dois-je essayer Marimo ?" mais "Pourquoi est-ce que je perds encore du temps avec Jupyter ?".

Mon conseil :

  • Essayez Marimo sur votre prochaine analyse exploratoire
  • Si vous validez le concept, migrez progressivement
  • Gardez Jupyter pour les projets legacy et écosystème spécifique

Prêt à passer aux notebooks modernes ?

👉 Découvrez Streamlit Unleashed

Ressources Marimo :

Envie d'aller plus loin ? Rejoignez ma newsletter DataGyver où je partage chaque mois des comparatifs d'outils, case studies et benchmarks techniques.

Des questions sur Marimo vs Jupyter ? Contactez-moi sur LinkedIn où 25K+ professionnels discutent quotidiennement des meilleurs outils data.

Livre Business Intelligence avec Python

📚 Approfondir avec mon livre

"Business Intelligence avec Python" - Le guide complet pour maîtriser l'analyse de données

Voir sur Amazon →

📬 Ne manquez rien de l'actualité data

Rejoignez +1000 professionnels qui reçoivent chaque semaine mes analyses, conseils et découvertes data.

S'abonner gratuitement
Prochaine révision : Trimestre prochain