いものやま。

雑多な知識の寄せ集め

Jupytextを使ってみた。

データ分析で必須ともいえるのがJupyter Notebook。 ただこれをバージョン管理しようとするとなかなか大変だったりする。

そこでJupytextというツールを使ってみた。

どんなツール?

すごく簡単に言うと、NotebookとPythonスクリプトを簡単に同期してくれるツール。

NotebookはファイルとしてはJSON形式になっていて、プラグインなどを使えば一応差分を確認もできるんだけど、バージョン管理するにはやっぱり不便。 開くだけでメタデータが変わってしまって差分が生じたりとかもあるし。

それをテキストファイルであるPythonスクリプトにも出力してくれるので、差分がとても確認しやすくなる。

インストールと設定

以下はJupyterLabを使っている前提で。 (Jupyter Notebookだとインタフェースが少し違うかも)

インストールはpip installでOK:

$ pip install jupytext

これでパッケージとコマンドラインツールだけでなくJupyterLabの機能拡張もインストールされる。

で、JupyterLabを起動し直せば機能拡張も有効になってるはずなんだけど、有効になってるのかが正直めっちゃ分かりづらい。 というのも、UIで変わる部分がないので。 なので、とりあえず次の設定までやって確認するといいかもしれない。

設定はJupytextを有効にしたいプロジェクトのpyproject.tomlで行う。

pyproject.tomlに以下を追加する:

[tool.jupytext]
formats = "ipynb,py:percent"

これでそのプロジェクトのNotebookはPythonスクリプトと同期されるようになる。

動作確認

設定ができたら動作確認としてそのプロジェクトで新しいNotebookを作ってみるといい。 Untitled.ipynbというNotebookと一緒にUntitled.pyというPythonスクリプトも作られるはず。 Notebookの名前を変えるとこのPythonスクリプトの名前も連動して変わる。

そしてNotebookを適当に更新して保存し、対応するPythonスクリプトを開いてみるといい。 Notebookの内容がPythonスクリプトに反映されているはず。

もしうまく動いていないようなら、JupyterLabを再起動してみるといいかも。 それでダメなら Installation — Jupytext documentation を読んで試行錯誤が必要かもしれない。

バージョン管理に関して

これでNotebookとPythonスクリプトが同期されるようになったはず。

このとき、バージョン管理の方法として次の2つが考えられる:

  1. NotebookとPythonスクリプトの両方をバージョン管理下におく
  2. Pythonスクリプトのみバージョン管理下におく

これは悩ましいところで、前者なら(Notebookを実行済みの状態で保存するとして)分析の結果を簡単に見れるというメリットが、後者ならバージョン管理がシンプルになるというメリットがある。 ただ、分析結果はCSVや画像として適当なところに吐き出す手もあるので、後者の方がいいかもしれない。 元の目的もバージョン管理をしやすくすることだったはずなので。

後者の場合、.gitignore*.ipynbを追加することになり、git cloneしてきてもNotebookが存在しないので、Pythonスクリプトから同期するNotebookを復元する一手間が必要になる。

これを行う一つの方法は以下のコマンドを実行すること:

$ jupytext --sync <Pythonスクリプト>

こうすると指定したPythonスクリプトと同期するNotebookが作られる。 (なお、このコマンド自体はNotebookとPythonスクリプトを同期させるコマンドで、両方存在する場合はタイムスタンプが新しい方に寄せて同期される)

別の方法はJupyterLabからPythonスクリプトをNotebookとして開く方法:

  1. JupyterLabのファイルブラウザでPythonスクリプトを選択
  2. コンテクストメニューから"Open With" > "Notebook"を選択
  3. PythonスクリプトがNotebookとして開かれるので、それを保存すると同期するNotebookが復元される
  4. 復元されたNotebookを開き直す

使ってみた感想

まだ少し触っただけではあるけど、バージョン管理をテキストで行えるのはやっぱり楽だなという感じがある。 そして試行錯誤自体はNotebookでできるので分析もやりやすいし。

導入のためにドキュメントを読んだり試行錯誤したりとかはちょっと必要だったけど、重要なことは上にまとめたので、これを読めばそこまで苦労せずに導入できると思う。 ぜひ試してみてほしい。

今日はここまで!