通常,notebook被認為是促進糟糕的編碼實踐,因為它們很難進行版本控制,經常依賴于以特定順序運行的單元格來返回正確的結果,并且測試和調試可能很棘手。
但是,當涉及到探索性數據分析和初始機器學習模型開發等任務時,jupiter notebooks 仍然是大多數數據科學家的首選。根據代碼可視化輸出(如圖表和表)以及向分析中添加豐富注釋的能力是任何其他工具都無法復制的。
雖然notebook仍然是如此受歡迎的選擇,但值得研究一些可用的選項,以克服可能使notebook代碼不那么健壯的一些問題。在本文中,我將通過代碼示例簡要介紹為某些問題提供解決方案的4種工具。這些包括:
- Nbdime 更好的版本控制
- nbQA 運行lint
- Jupyter-nbrequirements 管理依賴
- nbval 進行驗證
Nbdime更好的版本控制
使用Github之類的工具對notebook進行版本控制可能很困難。版本控制工具不能很好地呈現差異,因為它們不能理解典型notebook的邏輯結構。這可能會使跟蹤更改和合并代碼變得困難,
Nbdime是一個旨在解決這個問題的工具,它提供了更豐富的、可視化的差異,可以很容易地看到同一notebook的不同版本之間的變化。
Nbdime可以通過pip安裝。
- pip install nbdime
這應該會自動安裝和啟用擴展。如果沒有正確安裝,可以使用以下命令手動安裝,添加一個標志來確定為——system(系統范圍)、——user(當前用戶)、——sys-prefix(當前虛擬環境)安裝。
nbdime extensions --enable [--sys-prefix/--user/--system]
一旦一切都安裝好,如果你打開一個jupiternotebook,你現在應該有以下新圖標在你的工具欄。

我創建了一個notebook來展示nbdime的功能,它在波士頓房價數據集上訓練一個簡單的線性模型。

新的圖標現在應該在notebook的工具欄上可用,形成nbdime的web視圖功能。這個視圖提供了對notebook所做的更改的豐富的可視化表示。
點擊git按鈕將顯示上次提交和當前保存的notebook版本之間的差異。
單擊看起來像鐘面的圖標將顯示最新檢查點和當前保存的版本之間的差異。
我將對notebook做一些改變,并使用web視圖查看與上次提交的差異。
在notebook中,我改變了我正在使用的模型,并對殘差圖做了一個小的改變。讓我們看一下nbdime提供的結果差異。
從下面的圖片中可以看到,nbdime逐行和單元格顯示了自上次提交以來所更改的內容。它甚至顯示了每個單元格的輸出是如何改變的,包括圖形。

nbQA進行代碼檢查
Linting是一個檢查代碼質量的過程。linting工具會掃描代碼并檢查常見的樣式錯誤。例如,Python lint通常檢查不符合廣泛使用的風格指南(如Pep8)的代碼。
NbQa是一個可以讓你在jupiternotebook上運行任何標準python linter的工具。下面的代碼可以通過這個工具訪問:pylint, black, auto flake, check-ast, doctest, flake8, mypy和yapf。
要安裝,只需運行以下程序。
- pip install nbqa
讓我們在我最近創建的notebook上運行pylint,這是一個常用的python linter。為此,您需要在命令行上運行以下命令。
- $ nbqa pylint dataframe_basics.ipynb
這給了我一個標準的pylint輸出,它突出顯示了代碼中的錯誤。

使用jupyter-nbrequirements管理依賴項
您使用notebook完成的每個項目可能需要不同的依賴項集。傳統上,這些是在jupiternotebook外部使用虛擬環境管理的。
Jupyter nbrerequirements是一個工具,它可以讓你管理依賴關系,并創建一個獨立的優化環境,所有這些都在notebook中管理。
要開始使用pip安裝庫并使用下面所示的命令啟用notebook擴展名。
- $ pip install jupyter-nbrequirements
- $ jupyter nbextension install --user --py jupyter_nbrequirements
您可以通過使用單元魔術命令或使用將在notebook頂部顯示的UI來在notebook中安裝庫。

要使用單元格魔法安裝像pandas這樣的庫,只需在notebook單元格中輸入以下內容。
- %dep add pandas --version ">=0.24.0"
使用nbval進行驗證
正如本文前面所描述的,notebook最常用于模型的探索性分析和初始開發。通常,存儲這種類型的分析和最初的項目開發是非常有用的,既可以用于文檔目的,也可以用于將來可能基于這項工作的發現進行構建。
py測試插件nbval是驗證存儲的notebook的有用工具。Nbval將自動運行notebook中的每個單元格,并檢查當前輸出是否與存儲在上一個保存版本的.ipynb文件中的輸出匹配。這作為對底層源代碼中沒有任何更改的檢查,從而驗證原始分析或實驗的結果仍然是可靠的。
要使用此工具,首先通過以下命令進行pip安裝。
- pip install nbval
通過運行以下命令,可以對目錄中包含的所有文件執行測試。
- py.test --nbval
或者在一個特定的notebook上運行這行代碼。
我在現有的兩本notebook上進行測試。第一個運行沒有錯誤,并給出如下輸出。

下面給出了一個notebook測試失敗的例子。

雖然notebook經常用于探索性分析和初始模型開發,而不是生產代碼,但仍然應該被視為一個重要的工作存儲。最初的實驗和分析是過去結果的有用記錄,在以后的日子里應該可以回到notebook上建立你的工作。因此,值得探索的工具可以幫助使在notebook中編寫的代碼更加健壯和可復制。
本文介紹了四種工具,它們可以幫助使notebook中的代碼更好、更可重用。有關可重復數據科學代碼的更多提示,請參閱下面我之前的文章。