Jupyter Notebook の問題点
Jupyter Notebook は、ソースコードとアウトプットが一つの ノートブックファイル.ipynb
で管理・実行することができるので、非常に便利です。しかし、その代償として、.ipynb
ファイルにはソースコード以外のメタデータやアウトプットデータが含まれる為に、ソースコード部分の差分が非常に分かりにくくなってしまいます。
jupytext等で、.py
ファイルにエクスポートして diffを取ることも考えられますが、.py
ファイルが増えてしまい、本来の .py
ファイルと混じって、これはこれで管理しづらい。
結構困った問題です。
ノートブックdiffツール nbdime
ノートブックのままdiffをとったりマージしたり出来ないかと思っていたところ、nbdime というツールでばっちりそれができるらしい。
- Github リポジトリ https://github.com/jupyter/nbdime
- 公式ドキュメント https://nbdime.readthedocs.io/en/latest/index.html
さっそく試してみました。
nbdime で出来ること
-
ブラウザで、2つのノートブックのdiff を左右に並べて表示。
-
コマンドラインでも、ソースコードの部分だけのdiffを表示。つまり、サーバ上でそのままdiffを確認することが出来ます。
-
git と融合して使用。
-
Jupyter Notebook の extention で、ボタン一つで簡単に git diff を実行。
Extention のインストール方法
-
マージ機能
3ペインのマージも可能。
git mergetool としても使えます。
(公式ドキュメントより)
使用例
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
-s
オプションをはずしたので、アウトプットの画像が異なっていることもわかります。
git diff
nbdime config-git --enable --global
を実行しておくことで、ipynb ファイルに対する git diff
は、nbdiff で実行することが出来ます。
@@ -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"
]
},
@@ -1,4 +1,5 @@
import numpy as np
import matplotlib.pyplot as plt
-import hoge
+import seaborn as sns
+
from lightgbm import LGBMRegressor