数据STUDIO

90% 的 Python 开发人员在滥用 Jupyter Notebook?

Image

Image

作为一名数据科学家和 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 -设为星标,干货速递ImageImage