斷斷續續做過幾個資料分析方面的專案,使用的是 Python 愛好者耳熟能詳的 Jupyter Notebook。一開始把各種 .ipynb
檔案、資料源檔案都放在同一個專案目錄下,看上去特別雜亂無章,整理的時候也是一團亂麻。
後來在谷歌上找到一篇介紹 Jupyter Notebook 最佳實踐的文章,受益匪淺。按照書中所提的建議來組織專案,確實要清晰的多了,而且特別適合團隊共同完成資料科學專案。
因此摘錄其中的關鍵點分享出來,希望能幫助到正在學習使用 Jupyter 的朋友。
整體思路
將資料科學專案的 notebook 分為兩大類:實驗版和交付版,分別進行針對性的管理。
實驗版 notebook
參考傳統實驗室中整理筆記的方法,在使用 Jupyter notebook 時,遵循以下幾點:
- 每個 notebook 都要保留分析歷史(和日期)記錄
- 每個 notebook 僅用於開發和實驗。
- 每個 notebook 只有一位作者:標註作者的首字母縮寫。
- notebook 如果太長,可以進行拆分
- 如果需要,可以按主題區分 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(model,os_path,contents_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/
朋友會在“發現-看一看”看到你“在看”的內容