43
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

今年も恒例のアドベントカレンダーの季節となり、なんのテーマで記事を書こうか?と、github上を彷徨っていたわけですが、jupyter等に変わる新たなpython notebookである、marimoがちょっと流行っていそうだったので、チュートリアルを触りつつ、記事にしてみようと思います。

本稿について

本記事では、marimo の公式チュートリアルを実際に操作しながらJupyter Notebook に比べた優位性を確認します。

なお、説明にgif動画を使っている関係で、PCでの閲覧が推奨です。
携帯だと動画が再生されない場合があります。

marimoって

jupyter notebookやjupyterlabは以下のようなモヤモヤポイントがありました。

  • インタラクティブなUIには、別途、ipywidgets, Streamlit等が必要
  • それ単独では、コードアシストや保管、ヒント等が若干貧弱1
  • あるセルの変数を更新しても、他のセルを再実行しないと変更が反映されない
  • pythonコードを書いてるが、ファイル形式が*.pyでなく*.ipynb(JSON)
  • 加えて、JSONということで、Git等でバージョン管理しづらい

こういった、モヤモヤポイントを解消しているのが、marimoです。
加えて以下のような優位性もあります。

  • Pythonによる透過的なデータベース操作、SQLへの対応
  • 依存関係、スニペット、AI接続等の様々な付加機能(左ペイン)

これだけ書いても、現時点では読者としてはなにかわからないと思うので、早速、公式のチュートリアルを参考にしつつ触っていきましょう。

introチュートリアル

marimoのintroチュートリアルがイメージを掴むのに良さそうでしたので、このチュートリアルを最初~最後まで解説しながら説明をすすめて行きたいと思います。ではチュートリアルに従って、インストール&実行から進めていきます

インストール&実行

pipしてください。

pip install marimo && marimo tutorial intro

uv、condaの方は以下で

# uv
uv add marimo && uv run marimo tutorial intro

# conda
conda install -c conda-forge marimo && marimo tutorial intro

エディタ起動

ローカルホストのURLでブラウザが起動し、このようなエディタが表示されます。

image.png

実行

では、notebookを実行していきましょう。
この黄色いボタンを押すか「shift + enter」でセルを実行することができます。

1.execution.gif

「Python cell」であればPythonのコードが実行され、「markdown cell」であればマークダウンが表示されます。上記ではスライダーを表示していますが、確かに外部ライブラリに依存することなく、marimo単体でUIウィジェットを表示しています。

ちなみにcellの種類いくつかあり、pythonとmarkdown以外に、SQLとSetupがあります。

image.png

UI制御とコード非表示

UI制御のみの目的のコード等は表示上邪魔なので、コードを非表示とすることができます。たとえば、チュートリアルのアコーディオン表示、マークダウン表示を実施するスニペットは以下ですが、チュートリアル上非表示の設定となっています。

アコーディオン表示
mo.accordion(
    {
        "Tip: disabling automatic execution": mo.md(
            rf"""
        marimo lets you disable automatic execution: in the notebook
        ~中略~ 
        still giving guarantees about the notebook state.
        """
        )
    }
)
マークダウン表示
mo.md(
    """
    Tip: This is a tutorial notebook. You can create your own notebooks
    by entering `marimo edit` at the command line.
    """
).callout()

非表示設定の場合、このアイコン()が表示され1行に畳まれた状態となります。

2.hidden_v2.gif

API仕様の確認

では、このUI制御をちょこっと変えてみましょう。marimoのライブラリの仕様を確認しながらコードを変更していきます。marimoではマウスオーバで、API仕様をツールチップで確認できるので結構便利です。たしか、jupyter系だと、API仕様の表示にはクリックが必要であった気がするので、細かい差ではありますが地味に便利です。

3.tooltip.gif

calloutの仕様は以下ですので、引数を変えることで表示色を変更することができます。

image.png

リアクティブな実行

冒頭のモヤモヤポイントに記載していた、

  • あるセルの変数を更新しても、他のセルを再実行しないと変更が反映されない

に対応する内容となります。まずは、見ていただくのが早いので以下を確認ください。

4.reactive.gif

以下のマークダウンの表示部ですが、changedという変数のTrue/falseに対応し表示が変更される実装となっています。

changed = Falseのとき

image.png

changed = Trueのとき

image.png

変数changedによる表示の出し分け
(
    mo.md(
        f"""
        **✨ Nice!** The value of `changed` is now {changed}.
    ~中略~
        enables marimo notebooks to double as tools and  apps.
        """
    )
    if changed
    else mo.md(
        """
        **🌊 See it in action.** In the next cell, change the value of the
        variable  `changed` to `True`, then click the run button.
        """
    )
)

「マークダウン表示セル」と「変数changedのセル」は別のセルなので、Jupyter系では変数が変更になったとしても、「マークダウン表示セル」を再実行しなければ、表示はUpdateされませんが、marimoはこの変数を全セルで共有しており、その変数に依存するセルは、変数変更とともにリアクティブに再実行される仕様となっています。2

なお、marimoでは、変数は基本グローバル変数として扱われますが、アンダースコアで始まる変数名とすると、セルに閉じたプライベート変数を宣言できます。3

セル間の依存関係の確認

上記のように、変数の変更に応じてリアクティブにセルの再実行が行われるので、セル間の依存関係が重要となりますが、依存関係も簡単に確認できます。
画面左側のペインにある「Explore dependencies」をクリックするとセル間の依存関係が表示されます。

image.png

5.depend.gif

上記で見たように

changed = False

の変更に応じ、マークダウンの表示が切り替わる構造であったため、このように依存関係が表示されます。

リアクティブな実行によるUIの更新

上述のとおり、marimoでは、基本、変数はグローバル変数としてセル間で共有され、その変更に応じてセルがリアクティブに再実行されるため、変数の更新に合わせて複数のUIセルの表示を自動更新するのも簡単です。

6.ui_update.gif

以下の4行のソースコードは、4つの異なるセルにまたがっていますが、表示アイコン、表示数の変更がそれら変数に依存するセルに即時反映されます。

複数セルにまたがるUIの自動更新
# (セル1)アイコン選択のドロップダウンを準備
icon = mo.ui.dropdown(["🍃", "🌊", ""], value="🍃")

# (セル2)スライダーで表示数を決定
repetitions = mo.ui.slider(1, 16, label=f"number of {icon.value}: ")

# (セル3)ドロップダウン、スライダを表示
icon, repetitions

# (セル4)マークダウンで<h1>でアイコンを表示
mo.md("# " + icon.value * repetitions.value)

intro.pyを見てみる

これまで使ってきたmarimoのチュートリアルであるintro.pyを見てみましょう。

ノートブックの一番上に現在開いているpythonファイル(intro.py)のパスが表示されているので、そのファイルを直接開く。もしくは、右上のメニューから以下の要領で、pythonファイルをダウンロードします。

jupyter系だとファイル形式は、*.ipynb(JSON)で単に見づらいだけではなく、git等での差分管理もしづらい状況でしたが、どうでしょうか?
デコレータ等が付与されてはいますが、通常のpythonのコードですので、可読性や差分管理の面で優れています。

intro.py
# Copyright 2024 Marimo. All rights reserved.

import marimo

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


@app.cell
def _():
    import marimo as mo

    mo.md("# Welcome to marimo! 🌊🍃")
    return (mo,)


@app.cell
def _(mo):
    slider = mo.ui.slider(1, 22)
    return


@app.cell(hide_code=True)
def _(mo):
    mo.accordion(
        {
            "Tip: disabling automatic execution": mo.md(
                rf"""
            marimo lets you disable automatic execution: in the notebook
            footer, change "On Cell Change" to "lazy".

            When the runtime is lazy, after running a cell, marimo marks its
            descendants as stale instead of automatically running them. The
            lazy runtime puts you in control over when cells are run, while
            still giving guarantees about the notebook state.
            """
            )
        }
    )
    return
    
# ~以下略~

まとめ

marimoの標準チュートリアルを触りながらjupyter系に対してどのような点で優位性があるかを確認してきました。冒頭に上げたjupyter系のモヤモヤポイントを再掲すると

jupyter系のモヤモヤポイント(再掲)

  • インタラクティブなUIには、別途、ipywidgets, Streamlit等が必要
  • それ単独では、コードアシストや保管、ヒント等が若干貧弱1
  • あるセルの変数を更新しても、他のセルを再実行しないと変更が反映されない
  • pythonコードを書いてるが、ファイル形式が*.pyでなく*.ipynb(JSON)
  • 加えて、JSONということで、Git等でバージョン管理しづらい

marimoでの対応

marimoでは、標準ウィジェットが具備され、コードアシスト等も使いやすく、リアクティブな実行によりセルが自動更新される。かつ、ファイル形式も*.pyで見通しがよい。

marimoの優位性

よって、marimo の強みは 「Python スクリプト + UI + リアクティブ計算」 が追加ライブラリなしで一貫して実現できる点にあるといえるでしょう。

新たなpython notebookとしては有望格かと思いますので、もう少し使い続けて見たいと思います。皆さんもトライしていただければ嬉しいです。

宣伝

最後に宣伝で、本稿は、所属のアドベントカレンダーの12/8の記事となります。
他の記事も覗いていっていただけると嬉しいです。

では、皆様、良い、アドベントカレンダーライフを!

おまけ

introのあとは

marimoの他の機能も試してみたい方は、他にもtutorialがあるのでそれらを実行いただくとどんな機能があるか概観を掴んでいただけるかと思います。

$ marimo tutorial --help

上記コマンドにてどんなチュートリアルがあるかが表示されます。

Usage: marimo tutorial [OPTIONS] {intro|dataflow|ui|markdown|plots|sql|layout|
                       fileformat|markdown-format|for-jupyter-users}

  Open a tutorial.

  marimo is a powerful library for making reactive notebooks and apps. To get
  the most out of marimo, get started with a few tutorials, starting with the
  intro:

          marimo tutorial intro

  Recommended sequence:

          - intro
          - dataflow
          - ui
          - markdown
          - plots
          - sql
          - layout
          - fileformat
          - markdown-format
          - for-jupyter-users

たとえば、プロットについてのチュートリアルであれば以下の要領で起動できます。

$ marimo tutorial plots

特に、jupyterを使い慣れている方は、for-jupyter-usersにjupyterとの差分の説明があるのでそちらを参照いただければと。

VSCode拡張

VSCode拡張もあるようなので、日々VSCodeな方はこちらも便利かもです。
Qiitaにも記事があったのでリンクさせていただきます~

  1. JupyterLab 3.x 以降は Pylance / LSP サーバを入れると hover tooltip が出るが、単独ではやはり若干貧弱 2

  2. Jupyterでは、実行順に依存した線形ログで管理しますが、marimoはDAG(依存グラフ)を元に自動計算する仕組みなのでリアクティブな表示が実現できます。

  3. この変数仕様は、marimo 独自仕様であり Python のスコープとは別物です。marimoの*.pyソースを見ていただくとわかりますが、セルの戻り値が隣接フローに受け渡されるようなソースコードが生成されます。

43
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?