kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

nbdime : 簡単に Jupyter Notebook の diff を取る

Jupyter Notebook を使っていると「バージョン管理がしにくい」と感じることがある.当然ながら Jupyter Notebook (.ipynb) は JSON なので diff を取ることはできるけど,Notebook 自体のメタデータも含まれてしまって見にくすぎる.今回はそんな課題を解消できる nbdime (Jupyter Notebook Diff and Merge tools) を紹介する.

github.com

導入する

詳細な手順はドキュメントに載っている.今回は以下のコマンドを使った.環境によっては依存する JupyterLab も必要になるかも.

$ pip install nbdime
$ pip install jupyterlab
$ nbdime extensions --enable

nbdime.readthedocs.io

導入後に Jupyter Notebook にアクセスすると,以下のように nbdiff ボタンが表示される.

nbdime「GUI」を試す

nbdime「GUI」「コマンド」で使うことができる.まずは「GUI」を試す.

適当に「scikit-learnload_iris() でデータセットを取得して train_test_split() で分割するコード」を書いて GitHub(リモート側)に push しておく.次にコードを書き換えてから nbdiff ボタンを押すと,以下のように表示される.コード/表示結果/セルなど,コードに関係する部分に限定して diff を取ることができる.便利〜👏

nbdime「コマンド」を試す

次に「コマンド」を試す.nbdime を導入すると nbdiff コマンドが使えるため,実行すると以下のようにシンプルに diff を取ることができる.追加したセルは YAML フォーマットっぽく表示されていて少し見にくいかも?それでも便利〜👏

$ nbdiff sandbox-nbdime.ipynb

(中略)

## modified /cells/2/outputs/0/data/text/plain:
-  120
+  105

## modified /cells/2/source:
@@ -1,2 +1,2 @@
-X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
 len(X_train)


## inserted before /cells/3:
+  code cell:
+    execution_count: 4
+    source:
+      len(X_test)
+    outputs:
+      output 0:
+        output_type: execute_result
+        execution_count: 4
+        data:
+          text/plain: 45

nbdime「コマンド」は他にもある

個人的に使う機会は多くなさそうだけど,nbdime には nbdiff コマンド以外も使える.Notebook をうまく merge できるのは便利そう!

  • nbmerge : Notebook を merge する(3-way-merge)
  • nbdiff-web Notebook の差分を GUI で表示する(Notebook で nbdiff ボタンを押すのと同じ)
  • nbmerge-web : Notebook を GUI で merge する(3-way-merge)
  • nbshow : Notebook をターミナル用に表示する(YAML フォーマットに近かった)

まとめ

Jupyter Notebook でコードに関係する部分に限定して diff を取ることができる nbdime を試した.「GUI」で diff を確認できるのは頻繁に使うことになりそう!

github.com