56
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-24

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
56
49
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
56
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?