十大至簡規則,用Jupyter Notebook寫代碼應該這樣來

2021-01-10 機器之心Pro

選自arXiv

作者:Adam Rule、Amanda Birmingham等

機器之心編譯

參與:韓放、路

你真的是 Jupyter Notebook 高手嗎,真的能將代碼和文檔打造成鐵桶一般的整體嗎?

Jupyter Notebook 是一個非常常用的代碼編輯器,它非常適合做數據分析與代碼展示,很多雲服務也採用它作為代碼編輯器。此外,因為用這種編輯器看代碼比較輕鬆,文檔描述和輸出效果也能進一步幫助理解,很多研究者都會採用 Jupyter 作為解釋研究實現的工具。

如果 Jupyter Notebook 寫的好,那麼研究實現及復現就更優美,如果再放到 Colab 等具有免費算力的工具上,那就比較完美了。

在機器之心之前介紹過的文章中,我們關注 Jupyter Notebook 的炫酷插件與主題風格,更強調工具本身的使用姿態。而一篇發在 arXiv 上的文章介紹了什麼是展示實現代碼的十大簡單規則,我該又該如何利用它們構建 Jupyter 項目。這對於研究者和希望展示項目實現的開發者而言非常重要,我們可以像說故事一樣介紹我們的實現。

論文連結:https://arxiv.org/pdf/1810.08055.pdf

下面,我們就以展示可復現性研究成果為目標,看看 Jupyter 要怎樣寫才比較合理。

Jupyter Notebook 與研究的可復現性

可復現性(Reproducibility)需要提供研究所用數據、軟體、依賴項和計算環境(如硬體或雲配置)的人類可讀和機器可讀的描述,以及介紹如何組合以上所有部分的文檔。

之前分析人員通常將這些信息保存在單獨的數據、分析、結果、配置和注釋文件中(這些文件通常很難組合和共享),不過他們越來越多地使用計算型 notebook(如 Jupyter Notebooks 和 R Notebooks),在單個交互式和可移植文檔中組合可執行代碼、渲染可視化效果和描述性文本。

Jupyter Notebooks 大大降低了可復現性的困難,它使科學家能夠輕鬆地編寫混合了代碼、結果和文本的共享計算敘述,從而支持可復現性研究。然而,像 Jupyter Notebook 這樣的計算型 notebook 並沒有解決實現可復現性的所有障礙,而且它們還引入了另一些獨特的挑戰,其中部分挑戰源於它們的交互性。

考慮到在 Jupyter Notebooks 上發布可復現研究的技術和社會障礙,來自加州大學聖地牙哥分校和伯克利分校的研究者編制了一套規則、提示、工具和示例 notebook。這套規則專注於 Jupyter Notebooks,不過也適用於其他混合了實時代碼和敘述性描述的文檔。

下圖 1 展示了在 notebook 開發周期不同階段所應用的規則。

圖 1:將十個簡單規則應用於創建 Jupyter Notebooks 的工作流。從上到下,該圖描述了開發一個記錄詳盡、功能良好、用於可復現性研究的 Jupyter Notebooks 所需的三個不同的階段。

規則 1:為觀眾講故事

使用 Jupyter Notebooks 的一個主要好處是,它能將解釋性文本與代碼和結果交織在一起,創建計算性敘述 [8]。不要只保留零星的筆記,而是用解釋性文字講述一個引人入勝的故事,故事的開頭介紹主題,中間介紹步驟,結尾解釋結果。不僅要描述你做了什麼,還要描述為什麼要這樣做、這些步驟是如何連接的,以及它們意味著什麼。

如何講述這個故事將取決於你的觀眾。你打算和實驗室的非技術同事、另一個實驗室的分析師、某一期刊的讀者還是公眾分享你的 notebook?你可能需要為每一類觀眾提供不同種類和級別的解釋。

規則 2:記錄過程,而不僅僅是結果

計算型 notebook 的交互特性使得嘗試和對比不同方法或參數更加快速和容易,以至於我們在執行這些交互式調研時往往無法將其記錄下來。因此,這個建議變得更加重要:確保記錄下所有的探索,甚至那些導致進入死胡同的探索!這些將幫助你記住做了什麼和為什麼做。

許多 notebook 用戶等到分析結束、得到了可靠結果後,才添加這樣的解釋性文字。不要等,到那時你可能已經忘記了為什麼選擇某個特定參數值、從哪裡複製了一段代碼,或者中間結果的有趣之處是什麼。如果你沒有時間全面記錄你此刻正在做什麼或在想什麼,那麼留下簡短的描述性筆記來提醒自己,在可以停下時抓緊把這些內容添加上。

規則 3:添加分割,使步驟更清晰

notebook 是一個交互式的環境,所以它很容易編寫和運行單行單元格。這有利於實驗,但會讓 notebook 凌亂不堪,充滿難以理解的短小片段。那麼,嘗試讓 notebook 中的每個單元格執行一個有意義的分析步驟,並且該步驟可以根據單元格中的代碼或周圍的 markdown 描述很容易地理解。

按單元格模塊化代碼,並在單元格上方用 markdown 標記。將每個單元格想像為一個段落、擁有一個函數或完成一個任務(例如,創建一個繪圖)。避免長單元格(任何超過 100 行或一頁的內容都太長了)。在代碼注釋中放入低級文檔。使用描述性的 markdown header 將 notebook 分區,使其可以輕鬆導航和添加目錄。將長 notebook 拆分為一系列 notebook,並保留一個 top-level index notebook,其中包含指向各個 notebook 的連結。

規則 4:模塊化代碼

避免重複代碼總是很好的做法,但是在 notebook 中,複製一個單元格、調整幾行、將生成的代碼粘貼到新單元格或其他 notebook 中並再次運行是特別容易的。這種試驗形式很方便,但如果你想更改複製的代碼的功能或修復其中的 bug,就會使 notebook 難以閱讀,並且幾乎不可能進行維護。因此你可以將要複製和重用的代碼包裝在一個函數中,這樣就可以根據需要從任意多個單元格中調用該函數。如果你要在其他項目或 notebook 中重用代碼,請考慮將其轉換為模塊、包或庫,並遵循良好的軟體開發實踐(如單元測試)。

模塊化不僅節省空間,支持維護,調試方便,還使增加交互性變得更加簡單。

規則 5:記錄依賴項

未來重新生成分析時,不僅需要訪問代碼,還需要訪問依賴項。計算科學的最佳實踐是,從一開始就使用諸如 conda 的 environment.yml 或 pip 的 requirements.txt 之類的工具明確地管理依賴項,以列出所有相關的依賴項(包括它們的軟體版本)。始終在這些依賴項創建的環境中工作,以確保不添加未記錄的依賴項。

在 notebook 中,你可以使用 notebook 的擴展(如 watermark)顯式列印依賴項。列出 notebook 中關鍵依賴項的版本(最好列在最下方),如果 notebook 與環境隔離使用,那麼這將保證 notebook 中仍然包含關鍵信息,從而幫助讀者複製結果。

規則 6:使用版本控制

版本控制是 notebook 使用的一個重要輔助工具,因為 notebook 的交互特性使其很容易意外地更改或刪除重要內容。此外,由於 notebook 中包含代碼,代碼不可避免會有 bug,因此確定 bug 引入與修復的時間(及其可能影響的分析)是科學計算中的一項關鍵能力。

但是,請注意,Jupyter Notebook 將每個單元格的代碼和特定且廣泛的元數據存儲為 JSON 格式的文本文件。版本控制系統比較這些 JSON 文件中的差異,而不是用戶友好型 notebook GUI(圖形用戶界面)中的差異。

規則 7:構建 pipeline

記錄初步探索性研究的 notebook 很少能被廣泛推廣,但一旦確定了某種穩定的分析方法,設計良好的 notebook 就可以通過 pipeline 推廣到其他任務中,從而使用不同的輸入數據和參數很容易地重複分析。記住這一點,從一開始就設計你的 notebook,以允許將來重新調整用途。把關鍵變量聲明(尤其是在進行新的分析時會改變的變量)放在 notebook 的頂部,而不是埋在中間的某個地方。直接在 notebook 中執行準備步驟,如數據清理,並儘可能避免手動幹預。

規則 8:分享和解釋數據

如果底層數據被鎖定,那麼訪問清晰注釋的 notebook 對可復現性也幾乎沒有用處。努力使你的數據或數據樣本與 notebook 一起公開。notebook 可以很容易地提供輸入數據和上遊處理步驟的描述,這對於解釋結果至關重要。

理想情況下,你可以在 notebook 中共享整個數據集。我們認識到許多數據集太大或太敏感,無法以這種方式共享。在這些情況下,考慮將大型和複雜的數據集分解為多個層次,這樣即使原始數據太大,無法與已發布的 notebook 一起共享,或者受到隱私或其他訪問問題的限制,也不會影響到可復現性。

規則 9:允許閱讀、運行和探索 notebook

如果你遵循了前面的規則,那麼你的 notebook 應該能夠捕獲整個過程並易於閱讀。但是其他人如何訪問、運行和探索它們呢?你可以通過多種方式支持他人重用你的 notebook。首先,將 notebook 存儲到一個具備清晰 README 文件的公共代碼庫中。

除了允許重用之外,你還要考慮如何利用 notebook 的獨特結構來支持閱讀和探索。至少,將所有 notebook 的靜態 HTML/PDF 版本存儲在出版物附帶代碼庫的最終版本中。

規則 10:促進可復現和開放的研究

顯然,僅使用計算型 notebook 並不能保證研究的可復現。如果 notebook 的便利性和交互性讓你滿意,那你可以採取下一步行動,在實驗室或工作場所宣傳其可復現性。讓實驗室的同事試著運行你的 notebook,然後聽他們解釋在什麼地方出了問題。也試著運行他們的 notebook,讓他們知道你是否遇到了障礙。

將可復現性作為研究小組所有計算工作的關鍵要素,而不是在分析完成後才執行,或被期刊或評審人員要求後才思考。

相關焦點

  • 15個應該掌握的Jupyter Notebook 使用技巧
    計算單元的執行時間我們可以在一個jupyter notebook單元的開頭使用%%time命令來計算執行該單元的時間。2. 進度條可以使用python外部庫創建進度條,它可以實時更新代碼運行的進度。它讓用戶知道正在運行的代碼腳本的狀態。你可以在這裡獲得相關的庫Github庫。
  • jupyter Notebook 安裝
    Jupyter Notebook 安裝:安裝:pip install Jupyter 注意: 前提是需要安裝了Python(3.3版本及以上,或2.7版本) Anaconda解決Jupyter Notebook的安裝: conda install jupyter
  • Jupyter Notebook的三大短板,都被這個新工具補齊了
    它把筆記、代碼、圖表、注釋融合在一個交互式的筆記本裡,還能添加各種擴展功能。可謂機器學習入門進階研究之神器。可是,神器也有短板:文件是固定的JSON格式,體積還非常大;要在瀏覽器裡編輯文檔好煩,好懷念自己喜歡的編輯器;版本控制好艱難,想用標準的合併工具來協作,可是人家只支持文本!最近推出的一個工具,幫Jupyter Notebook把這些短板補齊了。
  • python教程第三課:python IDE之jupyter notebook詳細教程講解
    這次我們先來講一下如何使用Notebook進行python的代碼編寫1、 首先我們在系統安裝裡面找到Anaconda,裡面有一項Jupyter Notebook,點擊它以後將打開下面的界面, 這個界面看網址就知道,是在本地啟動打開的一個頁面,那麼除了可以從anaconda裡面打開,也可以在CMD窗口裡面輸入jupyter notebook
  • VS Code上也能玩轉Jupyter Notebook,這是一份完整教程
    這種探索並不只是因為酷,還是因為每個流行的 IDE 都有其獨特的功能,而我的很多項目都是跟同事合作的,這些同事可能使用不同的 IDE,為了在項目中互相配合,我會儘量用他們的「語言」。在用 Python 的時候,我比較喜歡用 Jupyter Notebook 和 Visual Studio (VS) Code 來編程。
  • 沒用過這幾招,別說你會使用Jupyter Notebook!
    作者:劉早起 來源:早起Python如果你想用python進行數據分析,那麼Jupyter notebook是你必須要熟練掌握的工具之一,而Notebook也有很多省時好用的小技巧,本文將分享我在使用Notebook時習慣使用的一些操作!
  • 敲代碼就像寫小說?Jupyter讓文學編程成為現實
    當時機成熟時,軟體開發人員就會用經典的IDE(集成開發環境),如VisualStudio Code和Pycharm,來將創意實現為庫和框架。那麼,有沒有一種方法可以將Jupyter轉化成一個成熟的IDE,將最初概念變成功能強大且可重用的模塊呢?
  • Jupyter Notebooks三大附加功能,好用到飛起!
    全文共1786字,預計學習時長4分鐘Jupyter Notebooks可以最有效地顯示結果和共享代碼,這在以前的IDEs中並不容易實現。然而,仍有些地方有待改進。在文本編輯器中,希望有一些功能在Jupyter中不是默認的。但別擔心。就像Python一樣,Jupyter也有第三方擴展功能。本文主要介紹一些最有用的擴展功能。
  • 如何優化Jupyter? - CDA數據分析師
    簡單來說,Jupyter Notebook是一個客戶端-伺服器應用程式,用於在瀏覽器中運行能夠同時包含代碼和富文本元素(如段落,方程式等)的文檔。接下來,我們一起來學習一些關於Jupyter Notebook使用的簡單技巧。我們將從有用的快捷方式開始,最後添加主題,自動生成的目錄等。2. 快捷鍵快捷鍵對於加速編寫代碼非常有用。
  • 入門|始於Jupyter Notebooks:一份全面的初學者實用指南
    1.Anaconda對新用戶而言,一般的共識是你應該使用 Anaconda 發行版來安裝 Python 和 Jupyter Notebooks。Anaconda 會同時安裝這兩個工具,並且還包含相當多數據科學和機器學習社區常用的軟體包。
  • Jupyter/IPython筆記本集合 !(附大量資源連結)-上篇
    在筆記本中運行代碼https://nbviewer.jupyter.org/github/jupyter/notebook/blob/master/docs/source/examples/Notebook/Running%20Code.ipynb一個很棒的matplotlib教程,是JR Johansson 使用
  • 如何用matplotlib繪圖呢?
    使用過python做數據分析的小夥伴都知道,matplotlib是一款命令式、較底層、可定製性強、圖表資源豐富、簡單易用、出版質量級別的python 2D繪圖庫。matplotlib算是python繪圖的元老級庫,類似程式語言裡的C語言。
  • Python代碼轉Latex公式,這個開源庫用一行代碼幫你搞定
    機器之心報導編輯:小舟你的代碼中有數學公式嗎?數學是數據科學和機器學習的重要基礎,數學運算的結果對於機器學習項目而言是至關重要的。在編寫代碼時,我們常常需要定義數學公式的計算形式。像 S=r^2 這樣簡單的數學公式,大概不會出現拼寫錯誤。但如果是下面這樣的公式呢?
  • 基礎教程:運用JupyterNotebooks在VS代碼中完成入門級開發
    2019年,隨著最新研發的VS Code Python插件問世,VS Code對Jupyter Notebook提供本機支持,這樣一來,無需運行Jupyter Notebook就可以在notebook上工作。本文將介紹在VS 代碼中使用Jupyter Notebook的基礎知識。
  • 不吹不黑,Jupyter Lab 3.0客觀使用體驗
    圖1那麼目前的jupyter lab好用嗎?是否還存在bug?適合直接升級使用嗎?今天的文章就將通過我的真實使用體驗,來認識jupyter lab3.0。2 jupyter lab 3.0使用體驗為了不幹擾現有的環境,我們通過以下代碼創建新的環境,並安裝最新穩定版本的jupyter lab:conda create -n temp python=3.7 -yconda activate temppip install jupyterlab -U 這樣我們的
  • Jupyter Notebooks嵌入Excel並使用Python替代VBA宏
    使用pip安裝pyxll-jupyter包:  >> pip install pyxll-jupyter  一旦安裝了PyXLL Excel加載項和PyXLL-Jupyter軟體包後,啟動Excel將在PyXLL選項卡中看到一個新的「 Jupyter」按鈕。