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 :
- Marimo analyse le graphe de dépendances entre cellules
- Si vous modifiez
x→yse recalcule → le graphique se met à jour - 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 :
- Convertir en
.py(nbconvert) - Refactorer le code
- Extraire les fonctions
- Ajouter les tests
- 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 difflisible - ✅ 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 rapide → Marimo (réactivité + @mo.cell)
- Publication scientifique/rapports → Quarto (multi-format export)
- Écosystème riche/widgets → Jupyter (10 ans d'extensions)
- Prototype → Production → Marimo (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 :
- Vérifier les dépendances entre cellules
- Refactorer les variables globales
- 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€
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.

📚 Approfondir avec mon livre
"Business Intelligence avec Python" - Le guide complet pour maîtriser l'analyse de données
Voir sur Amazon →