minminの備忘録

フルスタックになりたいエンジニアの備忘録 → https://zuminblog.com/ へ引越し中

jupyter notebookを簡単に管理できるjupytextの紹介

データ分析とかを行うときにjupyter notebookをよく使うと思うんですが、それをgitで簡単に管理できるようにするjupytextなるものを知ったので、備忘録としてまとめてみたいと思います。

背景


  • jupyter notebookの中身はjsonで書かれているため、gitとかで管理しづらい

    • jupyter上での表示

      f:id:minmin_21:20190303095100p:plain
      jupyter notebookのサンプル

    • git上での表示
      printした結果や実行回数まで差分として出力されてしまう

      f:id:minmin_21:20190303095331p:plain
      jupyte notebookのgit上での表示

  • データ分析を行う際に、jupyter notebookを使いたい派 vs 使いたくない派の戦争が発生する(?)

    • 使いたい派:step by stepで途中経過を確認しながら分析したい
    • 使いたくない派: コードが煩雑になりがちなので、出来れば.pyファイルを使いたい

jupytextとは


  • jupyter notebookをpython script(.py)として保存することができるツール

    • .ipynbファイル(左)、変換された.pyファイル(右)
      f:id:minmin_21:20190303095331p:plainf:id:minmin_21:20190303095441p:plain
      .ipynbファイルと変換された.pyファイルの比較
  • 他にも以下のような機能がある

基本的な使い方


使い方はとても簡単で、以下の3ステップを実行するだけ!!

  1. pip install jupytext
  2. ~/.jupyter/jupyter_notebook_config.py内の末尾に以下を追加
    • c.NotebookApp.contents_manager_class = "jupytext.TextFileContentsManager"
  3. jupyter notebookを立ち上げ、Edit>Edit Notebook Metadataを開き、以下を追加
    • "jupytext": {"formats": "ipynb,py"}

これを仕込んでおくだけで、
jupyter notebookを保存する度に.pyファイルが自動で作成・更新されます
さらに、作成された.pyファイルを変更しても、自動的に変更が.ipynbに反映されます

発展的(?)な使い方


  • すべての.ipynbファイルに対して.pyファイルを作成したい場合、~/.jupyter/jupyter_notebook_config.py内の末尾に以下を追加
    • c.ContentsManager.default_jupytext_formats = "ipynb,py"
  • 作成される.pyファイルの場所も指定することができる
    • Edit Notebook Metadataに、
      "jupytext": {"formats": "ipynb, scripts//py"}と書くと、以下のようにscriptディレクトリの下に.pyファイルが作成される
|--- hoge.ipynb  
|--- scripts/  
           |----hoge.py  
  • コマンドラインからでも変換を行うことができる
    jupytext --to py hoge.ipynb #hoge.ipynbをhoge.pyに変換する

メリット・デメリット


  • メリット
    • .py, .ipynb 片方を変更すると、もう片方のファイルも自動で同期される
    • jupyter notebookのgitでの管理が簡単になる
  • デメリット
    • 純粋にファイルの数が増える
      • これは、作成場所をうまく指定してあげることで何とかなりそう

まとめ


  • jupytextを用いると、自動で.pyファイルが生成・変更され、コードの差分が分かりやすくなる
  • .ipynb.pyファイルそれぞれの変更が保存のタイミングで反映されるため、どちらの派閥にも対応できる

余談

jupytextを使って、.ipynb.mdに変更してみると、コード部分だけが抽出されたmarkdownが作成された。

f:id:minmin_21:20190303095733p:plain
変換された.mdファイル

参考