Jupyter Notebookの差分を明瞭に確認する事ができるpackage : nbdime

Jupyter notebookをご利用の皆さん、朗報です。

例えば、下記の2つのnotebookの差分を比較したい際に、

  • nb_1.ipynb
  • nb_2.ipynb

diffコマンドを用いると下記のような結果になってしまいます。

>> diff nb_1.ipynb nb_2.ipynb [master]
14c14
< “image/png”: “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\nAAAAAElFTkSuQmCC\n”,
— -
> “image/png”: “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\nG/41NTUcOXIk6jJyksJfRHJqYbcw7dq1K+oSctbSpUvZu3cvnTp1iroUSXLgwAHefvtt1q1bx5Yt\nW9i2bRu7du1i//79HD58GDOjtraWiy66iK5du1JaWsqFF17IxRdfzBe+8AXOOOOMqIcgeUThH0P1\n9fXMmzePm2++OepSYu3gwYNUVFRQVlbGwoULeeutt1L6a3XJkiXNPn7xxRdzxRVXcPXVV3PttdfS\nv39/2rdvH3bZUiAU/jH18ssvK/wj0NDQwIIFC5gyZQovvvgitbW1oe1706ZNbNq0ienTpwPQoUMH\n/uIv/oLBgwdzww03cPnll9OmTcHO9EorFWz47969O+oSctqcOXNwd8ws6lJi4cCBA0yePJlf//rX\nWbvA0MGDB1mwYAELFizgH/7hHygpKeHGG29k+PDhDBkyhNNPPz0rdUhuKtjDAB35n9q2bdtYuXJl\n1GUUvIMHD/L444/Tq1cvHnjggUivLPfxxx/zhz/8gZtuuolu3boxcuRIpk6dyr59+yKrSaKj8I+x\nWbNmRV1CwXJ3pk+fzhe/+EUeeuihnPvY8YEDB5gxYwajR4+me/fujBw5kueff54DBw5EXZpkicI/\nxhT+mbFlyxaGDh3KLbfcwvvvvx91OS06ePAgM2bMYNSoUXTv3p2//uu/Zvbs2dTV1UVdmmSQwj/G\nli9frrOgQ+Tu/Ou//itf/vKXeeWVV6IuJy379+/n2Wef5Zvf/CalpaXcd999VFZW6pyZAlSw4a83\nfFMze/bsqEsoCJ9++inDhw/n/vvvL5ipk127djFp0iQGDhzIBRdcwA9+8ANee+013D3q0iQEoYS/\nmQ01s/VmttHMHm7m6+3N7LnE118zs55h9Hsyhw4d0ptYKXrppZeiLiHvLVu2jCuuuKKgp9E++ugj\nnnjiCa655hp69erF2LFjef311/WLII8FDn8zKwImAsOAvsBoM+vbpNndwG53/zzwODAhaL+nkmtv\nruWy+fPn68LuATz11FN87Wtfo7q6OupSsub999/nl7/8JVdffTU9e/bk+9//PgsXLqS+vj7q0qQV\nwjjyvwrY6O6b3b0OmAqMaNJmBDAlcX86cL1l8APmWso5dQcPHqSsrCzqMvLOkSNH+OEPf8g999zD\n4cOHoy4nMh988AG//vWvGTBgAOeccw533HEH06ZNY8+ePVGXJi0I4ySv84APk7argatP1sbd682s\n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\nJIb+P2c9rHcimwD6AAAAAElFTkSuQmCC\n”,
16c16
< “<matplotlib.figure.Figure at 0x10ba48cc0>”
— -
> “<matplotlib.figure.Figure at 0x11037dcc0>”
34c34
< “ax.fill(x, y, zorder=10,facecolor=’green’)\n”,
— -
> “ax.fill(x, y, zorder=10,facecolor=’black’)\n”,

diffは単純な文字列の差分比較を行うだけなので、notebookが`json`で管理されており、`matplotlib`で生成される出力結果の保存内容にも差異がでるのでこうなってしまいます。

jupyter/nbdimeを用いることで、notebook形式のjsonをパースしたうえでの差分比較が可能になります。

提供されるコマンド一覧

  • nbdiff : ノートブックの差分比較をターミナルで行う
  • nbdiff-web : Notebookの差分をブラウザで行う

簡単な実行結果

差分比較

ターミナル上での差分比較

>> nbdiff nb_1.ipynb nb_2.ipynb
nbdiff nb_1.ipynb nb_2.ipynb
— — nb_1.ipynb 2017–02–02 11:00:48
+++ nb_2.ipynb 2017–02–02 11:01:07
## inserted before /cells/0/outputs/0:
+ output:
+ output_type: display_data
+ data:
+ image/png: iVBORw0K…<snip base64, md5=052a34b732d64628…>
+ text/plain: <matplotlib.figure.Figure at 0x11037dcc0>
## deleted /cells/0/outputs/0:
- output:
- output_type: display_data
- data:
- image/png: iVBORw0K…<snip base64, md5=657f3d90cea1a3d0…>
- text/plain: <matplotlib.figure.Figure at 0x10ba48cc0>
## modified /cells/0/source:
@@ -8,6 +8,6 @@ y = np.sin(4 * np.pi * x) * np.exp(-5 * x)
fig, ax = plt.subplots()
ax.fill(x, y, zorder=10,facecolor=’green’)zorder=10,facecolor=’black’)
ax.grid(True, zorder=5)
plt.show()

Webブラウザ上での差分比較

>> nbdiff-web nb_1.ipynb nb_2.ipynb [master]
[I nbdimeserver:274] Listening on 127.0.0.1, port 51809
[I nbdiffweb:48] URL: http://127.0.0.1:51809/diff?base=nb_1.ipynb&remote=nb_2.ipynb
[I web:1971] 200 GET /diff?base=nb_1.ipynb&remote=nb_2.ipynb (127.0.0.1) 15.43ms
[I web:1971] 200 GET /static/nbdime.js?v=ce2758430f38b0ad261242e2b658a8e4 (127.0.0.1) 228.07ms
[I web:1971] 200 POST /api/diff (127.0.0.1) 41.45ms
[W web:1971] 404 GET /favicon.ico (127.0.0.1) 0.79ms
Webブラウザ上での画面

Gitとの連携

Gitの環境下で、複数人でnotebookを編集する機会がある人は便利そう
(Notebook上で複数人でガンガン編集してると、Gitの差分比較を行っても混沌としそうだが…)

そう考えるとJupyter Driveがいいのか。

Jupyterを確認すると、Jupyterに関するパッケージが活発に開発されていて中々楽しい 😄