Python
MachineLearning
Jupyter
JupyterLab
Jupyter-notebook

Jupyter Notebook ファイルのままdiffをとったり、マージしたり出来るツール nbdime


Jupyter Notebook の問題点

Jupyter Notebook は、ソースコードとアウトプットが一つの ノートブックファイル.ipynb で管理・実行することができるので、非常に便利です。しかし、その代償として、.ipynb ファイルにはソースコード以外のメタデータやアウトプットデータが含まれる為に、ソースコード部分の差分が非常に分かりにくくなってしまいます。

jupytext等で、.pyファイルにエクスポートして diffを取ることも考えられますが、.pyファイルが増えてしまい、本来の .pyファイルと混じって、これはこれで管理しづらい。

結構困った問題です。


ノートブックdiffツール nbdime

ノートブックのままdiffをとったりマージしたり出来ないかと思っていたところ、nbdime というツールでばっちりそれができるらしい。

さっそく試してみました。


nbdime で出来ること


  1. ブラウザで、2つのノートブックのdiff を左右に並べて表示。

  2. コマンドラインでも、ソースコードの部分だけのdiffを表示。つまり、サーバ上でそのままdiffを確認することが出来ます。

  3. git と融合して使用。

  4. Jupyter Notebook の extention で、ボタン一つで簡単に git diff を実行。

    Extention のインストール方法

    image.png


  5. マージ機能

    3ペインのマージも可能。

    git mergetool としても使えます。

    image.png

    公式ドキュメントより)



使用例


2つのノートブックのdiff


CUI

nbdiff -s notebook1.ipynb notebook2.ipynb

-sオプションで、ソースコード(Codeセル)の部分だけdiff を取ることが出来ます。Markdownセルなども含まれます。


結果

 (master *+%) $ nbdiff -s notebook1.ipynb notebook2.ipynb 

nbdiff notebook1.ipynb notebook2.ipynb
--- notebook1.ipynb 2019-03-24 20:57:03.681159
+++ notebook2.ipynb 2019-03-24 20:55:42.867497
## modified /cells/2/source:
@@ -1,2 +1,2 @@
-df = pd.Series(np.random.normal(10, 5, 10000))
-df.hist(bins=80)

+df = pd.Series(np.random.randn(10000))
+df.hist(bins=50)


ソースコード以外にも、オプションで メタ情報、アウトプットを含む・含めないを指定することが出来ます。


GUI

ブラウザでノートブックを左右に並べて比較します。

今度は -sを外して、アウトプットの差分も表示してみます。

nbdiff-web notebook1.ipynb notebook2.ipynb

image.png

-sオプションをはずしたので、アウトプットの画像が異なっていることもわかります。


git diff

nbdime config-git --enable --global を実行しておくことで、ipynb ファイルに対する git diff は、nbdiff で実行することが出来ます。


設定適用前のgit_diff例

@@ -20,7 +20,8 @@

"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
- "import hoge\n",
+ "import seaborn as sns\n",
+ "\n",
"from lightgbm import LGBMRegressor\n"
]
},


設定適用後のgit_diff例

@@ -1,4 +1,5 @@

import numpy as np
import matplotlib.pyplot as plt
-import hoge
+import seaborn as sns
+
from lightgbm import LGBMRegressor