計算筆記本
2020 年 11 月 18 日
計算筆記本是一種撰寫散文文件環境,讓作者可以嵌入程式碼,並能輕鬆執行程式碼,其結果也會納入文件中。這是一個特別適合資料科學工作的平台。此類環境包括 Jupyter Notebook、R Markdown、Mathematica 和 Emacs 的 org-mode。
當我在探索某些資料時,將筆記與執行探索的程式碼放在一起會很有用。我喜歡嘗試一些程式碼,查看結果,並記下我從執行中觀察到的任何事項。計算筆記本讓我能輕鬆地將這些內容結合在單一文件中。
以下是一個範例,查看我對 martinfowler.com 的 Google Analytics 資料進行的分析。我在 R Studio 中執行此操作,它使用 R Markdown 格式。

此處的範例是一個圖表,因為筆記本非常適合繪製各種圖表。不過,在程式碼中嵌入各種資料處理,並以表格形式在文件中顯示資料,同樣也很有用。
我第一次接觸到計算筆記本是在 1980 年代後期,當時使用 Mathematica。我記得我當時希望在大學學位期間就能使用這種工具,但直到最近幾年,隨著資料科學界開始使用計算筆記本,我才再次使用計算筆記本。我聽說最多的筆記本軟體是 Jupyter Notebook,它在 Python 社群中很受歡迎,但由於我使用 R 進行資料整理,所以我傾向於使用 R Markdown,通常是在 R Studio 中。我也使用一個比較小眾的筆記本 org-mode,它是 Emacs 的一部分。
嵌入在 Mathematica 中的程式碼是其自有的程式語言,專門用於表達數學。儘管 Jupyter 最初在 Python 世界中,但它支援廣泛的程式語言,就像 R Markdown 一樣。Mathematica 是一種商業工具,但 Jupyter 和 R Markdown 是開源的。Jupyter 將其檔案儲存在 JSON 中,R Markdown 使用 markdown 檔案,並對程式碼區塊使用一些特殊標記。使用文字格式來儲存文件,讓它們能夠儲存在一般的版本控制工具中,而使用標記語言則讓差異化變得更簡單。使用標記語言讓文件能夠在其他編輯器中編輯,但它們需要有適合的環境來執行程式碼區塊。
在探討問題時,計算筆記本很有用,例如對資料集嘗試各種形式的分析。該文件作為已嘗試事項的記錄,以及研究人員在嘗試時所做的所有觀察。透過將程式碼和結果放在一起,撰寫者可以清楚地看到他們做了什麼,以及產生了哪些結果。程式碼和結果的這種結合是一種 說明性程式設計 形式,讓環境對非專業程式設計師更具吸引力。然而,需要注意的一件事是,如果任何外部環境因素改變了結果,例如資料庫的內容。如果資料集不太大,則可以匯出並保存在版本控制系統中,但通常其大小會造成阻礙。
筆記本也可用於準備報告,通常透過產生 PDF、HTML 或其他格式的文件。如果我要向作者報告其文章的流量,我會取得最後一份此類報告,變更主題 URL,重新執行所有程式碼,並調整任何我認為適當的散文評論。如果我足夠有動力,我可以在幾個月內自動產生此類報告。我喜歡此類報告可以輕鬆包含用於產生結果的程式碼,因此讀者可以準確地了解他們所看到的數字背後的邏輯。
然而,筆記本不應當作為生產系統的組成部分來使用。 筆記本結構(其隨意混合了 IO、計算和 UI)的存在是為了鼓勵互動性,但它與用作更廣泛程式碼庫一部分的程式碼所需的模組化背道而馳。最好將筆記本視為探索邏輯的一種方式,一旦你找到路徑,該邏輯就應複製到專門用於生產用途的程式庫中。