90% 的 Python 開發(fā)人員在濫用 Jupyter Notebook?
作為一名數(shù)據(jù)科學家和 Python 開發(fā)者,Jupyter Notebook 多年來一直是我每天的創(chuàng)作畫布。但直到交付了多個雜亂的項目、排查了各種模糊的 bug,并重新翻看了六個月前的舊Notebook后,我才意識到該如何避免使用它們。
這篇文章并非討論重啟內(nèi)核或使用%matplotlib inline之類的基本技巧。這些技巧是我多年來一直忽略的細節(jié),并使你的筆記本更簡潔、更快速、更專業(yè)。
為了更實際地實現(xiàn)這一點,我們將使用一個虛構(gòu)的美國寵物收養(yǎng)趨勢數(shù)據(jù)集。我們深入研究一下。
1. 使用配置單元來配置項目級常量
太多筆記本會將參數(shù)埋藏在隨機單元格中。在筆記本頂部使用專用的配置單元格,可以避免全局混亂。
# 配置
DATA_DIR = "data/"
RAW_FILE = DATA_DIR + "pet_adoptions.csv"
FIG_DIR = "figures/"
RANDOM_SEED = 42
TOP_BREEDS = 10好處:
- 可重復性:你不必滾動來查找參數(shù)的定義位置。
- 易于修改:在一個地方更改路徑、種子或參數(shù)。
- 鼓勵模塊化設(shè)計。
對于大型項目,請使用Config類甚至.yaml/.env文件。
2. 提交到 Git 之前務必清除輸出
臟筆記本 = 版本控制不佳。請使用 Jupyter 的內(nèi)置選項或類似nbstripout的 CLI 工具。
使用 CLI:
pip install nbstripout
nbstripout install或者使用 VSCode 或 JupyterLab 選項:
File → Save and Clear All Outputs
好處:
- Git 中更清晰的差異。
- 避免臃腫的倉庫。
- 防止敏感數(shù)據(jù)/輸出的意外泄露。
3. 使用輔助函數(shù)構(gòu)造代碼
避免重復。即使在筆記本中,也可以將邏輯抽象為函數(shù)。這可以提高清晰度和可重用性。
import pandas as pd
def load_pet_data(filepath: str) -> pd.DataFrame:
df = pd.read_csv(filepath, parse_dates=["adoption_date"])
df.dropna(subset=["breed", "age", "adoption_date"], inplace=True)
return df
# 加載數(shù)據(jù)
df = load_pet_data(RAW_FILE)
df.head()你可以進一步創(chuàng)建utils.py共享代碼文件:
project/
│
├── notebook.ipynb
├── utils.py然后導入:
from utils import load_pet_data4. 有效使用 Markdown
(包括待辦事項單元!)
我以前會忽略 Markdown,或者寫一些模糊的單元格注釋?,F(xiàn)在,我把 Markdown 當作項目文檔。
以下是我對此的解釋:
## 數(shù)據(jù)清理計劃
- [x] 刪除空值
- [x] 解析日期
- [ ] 處理年齡異常值好處:
- 未來——你會感謝你自己。
- 合作者了解你的意圖。
- 使筆記本更加美觀且易讀。
5.明確驗證數(shù)據(jù)
永遠不要假設(shè)數(shù)據(jù)是干凈的。要盡早并經(jīng)常驗證。
# 驗證:檢查重復條目
duplicates = df.duplicated().sum()
print(f"Found {duplicates} duplicate rows.")
# 可視化驗證
import matplotlib.pyplot as plt
import seaborn as sns
def plot_adoption_trends(df: pd.DataFrame):
monthly = df.resample('M', on='adoption_date').size()
sns.lineplot(x=monthly.index, y=monthly.values)
plt.title("Monthly Pet Adoptions")
plt.xlabel("Month")
plt.ylabel("Number of Adoptions")
plt.tight_layout()
plt.show()
plot_adoption_trends(df)還可以通過assert語句進行驗證:
assert df['age'].min() >= 0, "發(fā)現(xiàn)寵物年齡為負數(shù)!"示例項目——寵物收養(yǎng)趨勢
以下是這些做法在快速寵物收養(yǎng)趨勢分析中的體現(xiàn)。
1. 加載并檢查數(shù)據(jù)
df = load_pet_data(RAW_FILE)
df.info()2. 數(shù)據(jù)清洗
# 提取月份和星期
df["month"] = df["adoption_date"].dt.month
df["weekday"] = df["adoption_date"].dt.weekday3. 分析頂級品種
top_breeds = df["breed"].value_counts().head(TOP_BREEDS)
top_breeds.plot(kind= 'barh' , title= "十大最受歡迎的品種" , figsize=(8, 5))
plt.gca().invert_yaxis()
plt.show()4.季節(jié)性趨勢
sns.boxplot(x="month", y="age", data=df)
plt.title("按月份劃分的被收養(yǎng)寵物的年齡")
plt.xlabel("月份")
plt.ylabel("年齡(歲)")
plt.show()寫在最后
Jupyter Notebook 功能強大,但也容易被誤用。我們介紹的 5 個實踐看似簡單,但它們能讓你 Jupyter Notebook 更易于維護、更易于共享,并且更適合生產(chǎn)環(huán)境:
- 使用配置單元
- 在 Git 之前清除輸出
- 將邏輯抽象為函數(shù)
- 有效地使用Markdown進行文檔和規(guī)劃
- 嚴格驗證你的數(shù)據(jù)和視覺效果
在處理現(xiàn)實世界的數(shù)據(jù)(例如寵物領(lǐng)養(yǎng))時,每個決策都至關(guān)重要。這些習慣正是一次性分析與可靠、可審查項目的區(qū)別所在。
























