歡迎光臨
每天分享高質量文章

Jupyter Notebook 最佳實踐

斷斷續續做過幾個資料分析方面的專案,使用的是 Python 愛好者耳熟能詳的 Jupyter Notebook。一開始把各種 .ipynb 檔案、資料源檔案都放在同一個專案目錄下,看上去特別雜亂無章,整理的時候也是一團亂麻。

後來在谷歌上找到一篇介紹 Jupyter Notebook 最佳實踐的文章,受益匪淺。按照書中所提的建議來組織專案,確實要清晰的多了,而且特別適合團隊共同完成資料科學專案。

因此摘錄其中的關鍵點分享出來,希望能幫助到正在學習使用 Jupyter 的朋友。

整體思路

將資料科學專案的 notebook 分為兩大類:實驗版和交付版,分別進行針對性的管理。

實驗版 notebook

參考傳統實驗室中整理筆記的方法,在使用 Jupyter notebook 時,遵循以下幾點:

  1. 每個 notebook 都要保留分析歷史(和日期)記錄
  2. 每個 notebook 僅用於開發和實驗。
  3. 每個 notebook 只有一位作者:標註作者的首字母縮寫。
  4. notebook 如果太長,可以進行拆分
  5. 如果需要,可以按主題區分 notebook。

交付版 notebook:

可交付版的 notebook 則是打磨完善的版本,並且包含有最終的分析輸出。這類 notebook 需要由整個團隊來進行管理,而不是交給某一個人。

版本控制

多人協作進行資料分析時,建議採用 Pull Request 的方式提交程式碼。透過 Git 和 Github 可以很好地實現這點。但是在檢視 PR 的時候,審查人需要能給清晰地辨別出 .ipynb 檔案的變動

推薦將 .ipynb 檔案轉化成 .py 檔案後,再進行檔案差異對比,可以方便地檢視程式碼的變化。

另外,在審查分析程式碼時,最好能給直接檢視輸出的變化。因此推薦儲存一份 HTML 版的輸出檔案。

圖1:修改前的擬合情況

圖2:修改後的擬合情況

Post-save 鉤子

可以透過 post-save 的鉤子,很方便地完成上節所說的 .ipynb 檔案轉換成 .py 檔案的工作。只需要按照如下程式碼所示,修改 ipython 的配置檔案即可:

〜/ .ipython / profile_nbserver / ipython_notebook_config.py

新增以下程式碼:

#如果您想自動儲存筆記本的.html和.py版本:modified from:https://github.com/ipython/ipython/issues/8009

import os

from subprocess import check_call

def post_save(modelos_pathcontents_manager):
    """用於將筆記本轉換為.py指令碼的儲存後掛鉤"""
    if model ['type'] !='notebook'return # only do this for notebooks

    d, fname = os.path.split(os_path)
    check_call(['ipython''nbconvert'' -  to''script',fname],cwd = d)
    check_call(['ipython''nbconvert'' -  to''html',fname],cwd = d)

c.FileContentsManager.post_save_hook = post_save

現在,每次儲存到筆記本都會更新名稱相同的.py和.html檔案。在提交和拉取請求中新增這些,您將從這些檔案格式中獲益。

完整示例

這是正在進行的專案的目錄結構,有一些關於命名檔案的明確規則。

示例目錄結構:

 - develop#(實驗版 notebook)
  + [ISO 8601日期]  -  [DS-作者首字母簡稱]  -  [2-4字描述] .ipynb
  + 2015-06-28 -jw-initial-data-clean.html
  + 2015-06-28-jw-initial-data-clean.ipynb
  + 2015-06-28-jw-initial-data-clean.py
  + 2015-07-02-jw-coal-productivity-factors.html
  + 2015-07-02-jw-coal-productivity-factors.ipynb
  + 2015-07-02-jw-coal-productivity-factors.py
 - deliver#(最終分析,程式碼,簡報等)
  +Coal-mine-productivity.ipynb
  +Coal-mine-productivity.html
  + Coal-mine-productivity.py
- figures
  + 2015-07-16-jw-production-vs-hours -working.png
 -  src#(模組和指令碼)
  + init.py
  + load_coal_data.py
  + figures#(數字和圖表)
  + production-vs-number-employees.png
  + production-vs-hours-working.png
 - data(備份 - 與版本控制分開)
  + coal_prod_cleaned.csv

優點總結

本文分享的這種工作流程和目錄結構,主要由兩大明顯的優點

首先,我們可以看到資料分析的執行過程,透過日期、作者、主題就可以進行檢索

  • 按日期(ls 2015-06 * .ipynb)
  • 作者(ls 2015 * -jw – * .ipynb)
  • 按主題(ls * -coal – * .ipynb)

其次,在審查 PR 時,儲存 .py.html 檔案可以快速定位變動,以及直觀確認輸出的變化。而且採用 post-save 的鉤子也是一勞永逸。

大家可以結合自己團隊的情況,有選擇地採納上述建議。如果有更合理的解決方案,也歡迎大家反饋。

source:https://www.svds.com/jupyter-notebook-best-practices-for-data-science/

贊(0)

分享創造快樂