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

























