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
defload_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_data
4. 有效使用 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
defplot_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.weekday
3. 分析顶级品种
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进行文档和规划 严格验证你的数据和视觉效果
在处理现实世界的数据(例如宠物领养)时,每个决策都至关重要。这些习惯正是一次性分析与可靠、可审查项目的区别所在。
🏴☠️宝藏级🏴☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!
长按👇关注- 数据STUDIO -设为星标,干货速递