jupyter notebookよりもMarimoが便利そう

データ分析・機械学習においてjupyter notebookは広く利用されています。EDAやモデルの学習、教育など多くのユースケース利用されてきましたが、notebookは以下のようなデメリットがあります。

# Jupyter Notebookのつらみ
1. 再現性の担保が難しい
    - 共有されたnotebookを実行してもエラーが出て上手くいかない
https://marimo.io/blog/introducing-marimo
      > JetBrainsがGithub上の1千万のnotebookを分析したところ、36%のnotebookに再現性がなかったとのこと
    - notebook上の変数はグローバル変数で、明示的に削除するかセッションを再起動しないとメモリに残り続ける
    - 異なる役割の同じ名前の変数が至るところに存在する
    -　一定規模のnotebookではコードを追うのが大変で、異なる役割で同じ名前の変数が複数回で定義されていたり
1. バージョン管理がめんどくさい
    - notebookはplain textではなく、差分を追うのが難しい
1. 直接の成果物とならない
    - 実験用のスクリプトを書く場合はあまり考えないですが、データ分析の結果をチームメンバーもしくは第三者に見せる場合雑多なコードが目に付くnotebookを直接共有することは多くないかもしれません。markdownに変換したり、別途ドキュメントやスライドを作ることもあるかと思います。ですがコードを変更した場合に画像の更新が行われなかったり、インタラクティブなダッシュボードの構築はできません

## よくある対処法
これらの課題への対処法として、例えば、単純に**notebookを共有する際には上から下まで問題なく実行できるか確認してから共有すること**、といった決まりをチーム内で定めることも有るかと思います。

最近ではgithubのnotebookのdiff対応や、streamlitやgradioなどのエコシステムの充実により部分的に解決している箇所もあるかもしれません。

https://github.blog/changelog/2023-03-01-feature-preview-rich-jupyter-notebook-diffs/

https://streamlit.io/


# Marimo

Marimoはjupyter notebookにとってかわる新たなnotebookを提供するPythonライブラリです。

> marimo is an open-source reactive notebook for Python — reproducible, git-friendly, executable as a script, and shareable as an app.

https://marimo.io/



- あるセルを変更するとそれに依存するセルが自動実行するため、コードの整合性を保ち再現性を高めることが可能
- notebookが.pyファイルであるため、jsonファイルのjupyter notebookと異なりgit-friendly
- WASMで動き、ブラウザで動作可能
- 現在はβ版だが、marimo cloudを提供予定

他にもpands, polarsのGUIでのEDAや、Plotly, Altairを含む描画ライブラリのサポート、スプレッドシートとの連携機能などがあります。

また、開発体験を高めるためのIDEやEditorとの連携と、CopilotやOllamaなどのLLMによるコード補完機能も備わっています。

pythonファイルからWebアプリとして実行可能
![image.gif](https://marimo.io/images/blog/1/docs-model-comparison.gif)

ビルトインのUIコンポーネントが自動で同期的に描画を行ってくれる
![image.gif](https://docs.marimo.io/_static/faq-marimo-ui.gif)


![image.gif](https://marimo.io/images/use-cases1.gif)


現在verは0.9.20です。本記事執筆中にv1への[roadmap](https://github.com/marimo-team/marimo/discussions/2899)が作られました。


Marimoの開発者の言葉を載せておきます。


> Hi! I’d like to share marimo, an open-source reactive notebook for Python. It aims to solve many well-known problems with Jupyter notebooks, while giving you new capabilities: marimo notebooks are reproducible (no hidden state), git-friendly (stored as a Python file), executable as Python scripts, and deployable as web apps

> I chose to develop marimo because I believe that the ML community deserves a better programming environment to do research and communicate it. I’ve seen lots of research start in Jupyter notebooks (much of my own has). I’ve also seen lots of that same research fail to reproduce or get slowed down by hidden bugs, due to shortcomings inherent to Jupyter notebooks.
> 
> I strongly believe that the quality of our work depends on the quality of our tools, and that the tools we use shape the way we think — better tools, for better minds. I worked at Google Brain as a software engineer in 2017-2018, when TensorFlow was transitioning to TensorFlow 2 and JAX was in its early stages. I saw firsthand the increase in productivity that PyTorch and JAX brought to our community, and later to my own research when I did a PhD at Stanford with Stephen Boyd. Our goal with marimo is to do something analogous but via a new programming environment.
> 
> marimo has been developed with the close input of scientists and engineers, and with inspiration from many tools, including Pluto.jl and streamlit. It’s just two of us working on it — we open sourced it recently because we feel it’s ready for broader use. Please try it out (pip install marimo && marimo tutorial intro). We’d really love any and all feedback you may have!

source: https://www.reddit.com/r/MachineLearning/comments/191rdwq/p_i_built_marimo_an_opensource_reactive_python/?rdt=60096


# 動かしてみる

実際に使ってみます
動作環境はApple SiliconのMacbookで、パッケージマネージャーはuvを利用しています。

marimo[recommend]をインストールすることでduckdb, altair, polars, openai, ruffも追加で含まれます。
```sh
$ uv init --python 3.12
$ uv add 'marimo[recommended]'

# uv run marimo tutorial intoでもいい
$ uv run marimo edit example.py 
```

最初は以下の画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/df778941-86d5-143d-37a4-be568f4e78ed.png)


各セルにpythonやmarkdown, sqlなどを書くことが可能です。実行は右上の▷ボタンか、Command + Enterで実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/63ce07ce-2690-32c6-7fab-23c225b813f2.png)


## セルの自動実行

marimoの再現可能性は、変数の依存関係を基にしたセルの自動実行にあります。

2つのセルを書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/144a7cd3-8baa-7b24-95bc-04a80201e67f.png)

x=10と変更すると、上のセルに実行されていない変更が存在することを表示してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/a0698820-dcf4-0125-aca7-f6f888979b3d.png)

上のセルを実行すると**自動で下のセルの結果も変わってくれます**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/014ed7cf-19f0-c1d4-d587-9a318f988415.png)



なぜこのようなことが可能なのかというと、marimoではセル間の依存関係がDAGでモデリングされているからです。そのため異なるセル間での変数の再代入や、変数のcyclicな依存関係は定義できません( e.g. `x=y; y=x` )。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/13f72165-4e5b-e7dc-8073-1fca36299428.png)

これは例えばループ変数の`i`なども再定義ができなくなるため不便にも思えますが、変数名にアンダースコアをつければ問題なく再適宜できます。



セル間の依存関係は横のdependencyタブから見ることができます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/0f68f8f5-988a-2cae-8ed6-2c711a91b90f.png)


前述の通りmarimo notebookは.pyファイルで、該当部分はこのようになっています。

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


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

## アプリとして実行

notebookを編集するときは`mario edit main.py`でしたが、`mario run main.py`とすればWebアプリとして立ち上げることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/92cc9318-93ca-bc1d-519c-8c53b0feaefb.png)


## その他

ちゃんと補完が効くのもありがたいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/42bcb97f-efc3-5b2e-e990-e63e9a7b48a3.png)


他にも色々できそう
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/622f4241-6ff8-4128-95e1-be0c5180146d.png" width="220px">



### Gallaly
公式サイトにMarimoで構築されたnotebookの例があります。
https://marimo.io/p/@mzai/on-hypothesis-testing?show-code=false

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/696be1f5-93bd-ff91-a6af-9a9cdafcbe32.png)

https://huggingface.co/spaces/marimo-team/seam-carving


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793316/dbf9b301-e766-21d9-74b2-ffd173e92646.png)



# 最後に
こちらで誰でも動かすことができます！

https://marimo.app/