Jupyter

技术栈
工具链
notebookdata-sciencepythoninteractivereproducible

概览

Jupyter 技术栈概览

Jupyter 是 Fernando Pérez 于 2014 年创建的交互式计算环境,前身是 IPython Notebook。它通过「笔记本」将代码、Markdown 文档、可视化图表、数学公式整合在一个可执行的 Web 文档中,是数据科学、机器学习、学术研究的通用语言。

解决什么问题

  • 代码与文档分离 → Notebook 融合代码+文档+输出
  • 探索性数据分析低效 → 逐个 Cell 执行,随时查看中间结果
  • 结果不可复现 → 记录完整计算过程,支持导出 HTML/PDF
  • 教学演示困难 → 所见即所得,学生可交互式学习
  • 远程计算门槛高 → JupyterHub 多用户服务 + JupyterLab 全功能 IDE

关键特性

  • Cell 式执行:Code Cell(可执行代码)+ Markdown Cell(文档)
  • 丰富输出:表格、Matplotlib/Plotly 图表、LaTeX、HTML
  • 100+ 语言内核:IPython、IRkernel、IHaskell、IJulia...
  • 魔术命令%timeit%matplotlib inline%%bash
  • JupyterLab:下一代 IDE,多标签、终端、文件管理器
  • JupyterHub:多用户服务器,适合教学/企业环境
  • 内核分离:重启内核不影响文档,变量可持久化

安装

环境准备

  • Python:3.8+(推荐 3.10+)
  • 浏览器:Chrome / Firefox / Safari
  • 可选:Anaconda(自带 Jupyter)或 pip/conda 安装

安装命令

pip 安装(轻量)

pip install jupyterlab notebook
# 或仅装 Notebook(经典界面)
pip install notebook

Anaconda(推荐数据科学用户)

# 下载安装 Anaconda: https://www.anaconda.com/download
# 安装后自带 Jupyter Notebook 和 JupyterLab
conda install jupyterlab

启动

# JupyterLab(现代界面,推荐)
jupyter lab

# 经典 Notebook
jupyter notebook

# 指定端口
jupyter lab --port 9999

# 允许远程访问(注意安全)
jupyter lab --ip=0.0.0.0 --no-browser

安装常用内核

# R 内核
install.packages('IRkernel')
IRkernel::installspec()

# Julia 内核
using IJulia; IJulia.installkernel()

常用扩展

pip install ipywidgets           # 交互式控件
pip install jupyter_contrib_nbextensions  # 经典扩展集
pip install jupyterlab-code-formatter     # 代码格式化

常见问题

Q1: 端口被占用

jupyter lab --port 8889lsof -i :8888 查看占用进程。

Q2: 内核一直 Busy

Kernel → Restart Kernel。或终端 jupyter kernelspec list 查看已安装内核。

Q3: 远程访问需要密码

jupyter notebook password       # 设置密码
jupyter lab --ip=0.0.0.0 --no-browser

生产环境务必配合 Nginx 反向代理 + HTTPS。

Q4: ModuleNotFoundError 但 pip list 中有

确认 Jupyter 内核使用的 Python 环境与 pip 一致:!which python(在 Notebook 中运行)。

示例

Jupyter 例程:交互式数据分析工作流

目标

展示 Jupyter Notebook 典型用法:数据加载、清洗、可视化、结论——一个 Cell 一个步骤。

完整 Notebook 内容

将以下内容保存为 data_analysis.ipynb 或在 JupyterLab 中逐 Cell 执行。

Cell 1: Markdown

# 全球人口数据分析

本 Notebook 分析世界银行人口数据,展示 Jupyter 在探索性数据分析中的核心用法。

Cell 2: 导入库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

sns.set_style('whitegrid')
print('✅ 环境准备就绪')

Cell 3: 加载数据

# 模拟世界银行格式的人口数据
data = {
    'Country': ['中国', '印度', '美国', '印尼', '巴基斯坦', '巴西', '尼日利亚', '孟加拉国', '俄罗斯', '墨西哥'],
    'Population_M': [1402, 1380, 331, 273, 220, 213, 206, 164, 146, 128],
    'GDP_B': [17734, 3176, 25346, 1289, 376, 2080, 477, 460, 2240, 1466],
    'Area_KM2': [9597, 3287, 9834, 1905, 881, 8516, 924, 148, 17098, 1964],
}
df = pd.DataFrame(data)

# 派生列
df['Density'] = df['Population_M'] * 1e6 / df['Area_KM2']  # 人/km²
df['GDP_Per_Capita'] = df['GDP_B'] * 1e9 / (df['Population_M'] * 1e6)

df.head(10)

Cell 4: 数据探查

# 魔术命令:测量执行时间
%time df.describe()
# 显示 DataFrame 信息
df.info()
print(f"\n数据形状: {df.shape}")
print(f"总人口(百万): {df['Population_M'].sum():,.0f}")

Cell 5: 可视化——人口 vs GDP

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 气泡图
scatter = axes[0].scatter(
    df['GDP_Per_Capita'], df['Density'],
    s=df['Population_M'] / 5,  # 气泡大小 = 人口
    c=range(len(df)), cmap='viridis', alpha=0.7, edgecolors='black'
)
for i, row in df.iterrows():
    axes[0].annotate(row['Country'], (row['GDP_Per_Capita'], row['Density']),
                     fontsize=8, ha='center')
axes[0].set_xlabel('人均 GDP(美元)')
axes[0].set_ylabel('人口密度(人/km²)')
axes[0].set_title('人口密度 vs 人均 GDP(气泡=人口)')

# 柱状图 TOP5
top5 = df.nlargest(5, 'Population_M')
axes[1].barh(top5['Country'], top5['Population_M'], color='steelblue')
axes[1].set_xlabel('人口(百万)')
axes[1].set_title('人口 TOP5 国家')
axes[1].invert_yaxis()

plt.tight_layout()
plt.show()

Cell 6: 结论

# 使用 IPython 的 Markdown 渲染
from IPython.display import Markdown

richest = df.loc[df['GDP_Per_Capita'].idxmax()]
poorest = df.loc[df['GDP_Per_Capita'].idxmin()]

Markdown(f"""
## 📊 分析结论

- **人口最多**:{df.loc[df['Population_M'].idxmax(), 'Country']}
- **人均 GDP 最高**:{richest['Country']} (\${richest['GDP_Per_Capita']:,.0f})
- **人均 GDP 最低**:{poorest['Country']} (\${poorest['GDP_Per_Capita']:,.0f})
- **差距倍数**:{richest['GDP_Per_Capita'] / poorest['GDP_Per_Capita']:.1f}x
""")

魔术命令速查

命令 说明
%timeit 测量代码执行时间
%matplotlib inline 图表内嵌显示
%who 列出当前所有变量
%%bash 执行 Bash 命令
%debug 进入调试模式
%history 查看命令历史

教程

Jupyter 交互式开发入门教程

第一章:Notebook 结构

Jupyter Notebook 由 Cell 序列组成,两种核心类型:

  • Code Cell:包含可执行代码。Shift+Enter 执行,输出直接显示在 Cell 下方
  • Markdown Cell:包含格式化文档。支持标题、列表、链接、图片、LaTeX 数学公式

内核(Kernel)

每个 Notebook 连接一个内核进程,它维护代码执行后的全部变量。重启内核 = 清空所有变量。

第二章:JupyterLab vs 经典 Notebook

特性 JupyterLab 经典 Notebook
界面 IDE 风格,多标签 单页面
终端 内置
文件管理 侧边栏拖放 简单文件列表
扩展系统 丰富 有限
适用场景 日常开发 快速笔记

推荐:新用户直接用 JupyterLab。

第三章:魔术命令全解

魔术命令以 %(行魔术)或 %%(Cell 魔术)开头:

# 性能分析
%timeit sum(range(100000))
%prun some_function()

# 环境管理
%env PATH
%pwd  # 当前工作目录
%cd /path

# 外部代码
%load myscript.py       # 加载文件到 Cell
%run myscript.py        # 运行 Python 文件
%%writefile output.py   # 将 Cell 内容写入文件

# 显示
%matplotlib widget      # 交互式图表
%config InlineBackend.figure_format = 'svg'  # 高清图

第四章:分享与导出

# 导出为多种格式
jupyter nbconvert --to html notebook.ipynb
jupyter nbconvert --to pdf notebook.ipynb
jupyter nbconvert --to slides notebook.ipynb  # 幻灯片
jupyter nbconvert --to markdown notebook.ipynb

隐藏代码(适合报告)

在 Cell 中设置 Tag:hide-input。或使用 --no-input

jupyter nbconvert --to html --no-input notebook.ipynb

第五章:生产级 JupyterHub

多用户场景(教学/企业):

用户 → 浏览器 → JupyterHub → 为每人启动独立 JupyterLab Pod/容器

每个用户有独立环境、持久化存储。支持 GitHub OAuth / LDAP 认证。

思考题

  1. Jupyter 的内核和 Notebook 的关系是什么?为什么内核挂了,Notebook 还能保存?
  2. .ipynb 文件里实际存的是什么?它是纯文本吗?
  3. Jupyter 在数据科学中为何不可替代?VSCode 的 .py + # %% 能否平替?

参考资料

暂无参考文献