MarimoJupyterQuartoPythonNotebooks@mo.cellReactive Programming

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

GP
Gaël Penessot

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 2026 :

  • 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 2026, 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

Remplacer les notebooks par des scripts modulaires ne suffit pas si personne ne peut voir ce que vous faites. Un portfolio data analyst impactant structure vos projets GitHub pour qu'un recruteur comprenne votre valeur en 10 secondes.

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 manque rien de l'actualité data

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

S'abonner gratuitement
Prochaine révision : Trimestre prochain