Skip to content

Jupyter Notebook 快速上手

数据科学家最爱的交互式编程环境


什么是 Jupyter Notebook?

Jupyter Notebook 是一个 交互式编程环境,让你可以:

  • 边写代码边看结果(类似 Stata 的 do-file editor + Results window)
  • 混合代码、图表、文本说明(类似 R Markdown)
  • 在浏览器中运行,无需复杂配置

对比其他环境

环境优点缺点适用场景
Jupyter Notebook交互式、可视化、易分享不适合大型项目数据分析、教学、原型开发
VS Code功能强大、适合大项目学习曲线陡峭软件开发、大型项目
Google Colab免费 GPU、云端运行需要网络深度学习、协作
PyCharm专业 IDE占用资源多专业开发

社科学生推荐:先学 Jupyter Notebook,熟练后再学 VS Code


快速开始:三种方式使用 Jupyter

方式 1:在线使用(最简单,0 配置)

访问本网站的 Python 运行环境,无需安装任何软件!

方式 2:Google Colab(免费 + 云端)

  1. 访问 colab.research.google.com
  2. 登录 Google 账号
  3. 点击 "新建笔记本"
  4. 开始编程!

优点

  • 完全免费
  • 提供免费 GPU(适合深度学习)
  • 可以直接访问 Google Drive

方式 3:本地安装(推荐,长期使用)

步骤 1:安装 Anaconda

Anaconda 是 Python 的科学计算发行版,包含 Jupyter Notebook 和常用库。

下载地址anaconda.com/download

安装后检查

bash
# 在终端(Mac/Linux)或 Anaconda Prompt(Windows)中运行
jupyter --version

步骤 2:启动 Jupyter Notebook

bash
# 在终端中运行
jupyter notebook

浏览器会自动打开 http://localhost:8888


Jupyter Notebook 基础操作

1. 创建新笔记本

  1. 点击右上角 "New" → "Python 3"
  2. 笔记本会打开,默认名为 "Untitled"
  3. 点击标题重命名为 "my_first_analysis"

2. 单元格(Cell)的类型

Jupyter 有两种主要单元格:

(1) 代码单元格(Code Cell)

python
# 在代码单元格中写 Python 代码
x = 10
y = 20
print(x + y)

运行方式

  • Shift + Enter:运行并跳到下一个单元格
  • Ctrl + Enter:运行但停留在当前单元格

运行结果

30

(2) Markdown 单元格(文本说明)

切换方式:选中单元格 → 按 M

markdown
# 这是标题
这是普通文本

**粗体***斜体*

- 列表项 1
- 列表项 2

3. 快捷键(必会)

快捷键功能
Shift + Enter运行当前单元格,跳到下一个
Ctrl + Enter运行当前单元格,停留
A在上方插入新单元格
B在下方插入新单元格
D + D(按两次D)删除当前单元格
M切换为 Markdown 单元格
Y切换为代码单元格
Ctrl + S保存笔记本

实战:用 Jupyter 完成数据分析

示例:分析学生成绩数据

Cell 1: 导入库和创建数据

python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
data = {
    'student_id': range(1, 21),
    'math_score': [85, 72, 90, 68, 88, 75, 92, 70, 85, 78,
                   95, 65, 88, 72, 90, 77, 85, 70, 92, 80],
    'study_hours': [10, 5, 12, 3, 11, 6, 13, 4, 10, 7,
                    14, 2, 11, 5, 12, 7, 10, 4, 13, 8],
    'gender': ['M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F',
               'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F']
}

df = pd.DataFrame(data)
df.head()  # 显示前 5 行

Cell 2: 描述性统计

python
print(" 基本统计信息:")
print(df[['math_score', 'study_hours']].describe())

print("\n 按性别统计:")
print(df.groupby('gender').agg({
    'math_score': ['mean', 'std'],
    'study_hours': ['mean', 'std']
}))

Cell 3: 可视化

python
# 设置中文字体(避免乱码)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # Mac
# plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows

# 散点图
plt.figure(figsize=(10, 5))

# 子图 1: 成绩 vs 学习时长
plt.subplot(1, 2, 1)
plt.scatter(df['study_hours'], df['math_score'], alpha=0.6)
plt.xlabel('Study Hours per Week')
plt.ylabel('Math Score')
plt.title('Score vs Study Hours')

# 子图 2: 成绩分布
plt.subplot(1, 2, 2)
plt.hist(df['math_score'], bins=8, edgecolor='black', alpha=0.7)
plt.xlabel('Math Score')
plt.ylabel('Frequency')
plt.title('Score Distribution')

plt.tight_layout()
plt.show()

Cell 4: 回归分析

python
from scipy import stats

# 线性回归
slope, intercept, r_value, p_value, std_err = stats.linregress(
    df['study_hours'], df['math_score']
)

print(f" 回归方程:Math Score = {intercept:.2f} + {slope:.2f} * Study Hours")
print(f"   R² = {r_value**2:.3f}")
print(f"   p-value = {p_value:.4f}")

# 解释:每多学习 1 小时,成绩提高 {slope:.2f} 分
if p_value < 0.05:
    print("    结果显著(p < 0.05)")
else:
    print("    结果不显著(p >= 0.05)")

Jupyter 的高级功能

1. 魔法命令(Magic Commands)

python
# 查看所有魔法命令
%lsmagic

常用魔法命令:

命令功能
%time计算单行代码运行时间
%%time计算整个单元格运行时间
%matplotlib inline在笔记本中显示图表
%load file.py加载外部 Python 文件
%who列出所有变量

示例

python
%%time
# 计算 1 到 1000000 的和
total = sum(range(1000000))
print(total)

2. 显示多个输出

python
# 普通情况下,只显示最后一个表达式的结果
df.head()
df.tail()  # 只会显示这个

# 解决方法:使用 display()
from IPython.display import display
display(df.head())
display(df.tail())  # 两个都会显示

3. 内联数据框

python
# 更漂亮的数据框显示
df.style.background_gradient(cmap='viridis', subset=['math_score'])

Jupyter 的最佳实践

1. 组织结构建议

python
# Cell 1: 导入所有库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Cell 2: 设置参数
plt.rcParams['figure.figsize'] = (10, 6)
pd.set_option('display.max_columns', None)

# Cell 3: 加载数据
df = pd.read_csv('data.csv')

# Cell 4-N: 分步骤分析
# 每个单元格做一件事

2. 添加 Markdown 说明

markdown
# 数据分析:学生成绩研究

## 1. 研究问题
我们想知道:学习时长是否影响数学成绩?

## 2. 数据来源
虚拟的学生调查数据(n=20)

## 3. 分析方法
- 描述性统计
- 相关分析
- 线性回归

3. 重启内核(Kernel)

如果代码运行出错或变量混乱:

菜单栏KernelRestart & Clear Output

4. 笔记本命名规范

行业标准命名格式

01_data_cleaning.ipynb
02_exploratory_analysis.ipynb
03_regression_models.ipynb
04_robustness_checks.ipynb

为什么用数字前缀?

  • 保证执行顺序清晰
  • 便于团队协作
  • 符合学术研究工作流

5. 单元格原子化原则

** 错误做法**(一个单元格做太多事):

python
# 不推荐:所有步骤混在一起
df = pd.read_csv('data.csv')
df = df.dropna()
df['log_income'] = np.log(df['income'])
result = df.groupby('education')['log_income'].mean()
plt.bar(result.index, result.values)
plt.show()
model = smf.ols('log_income ~ education + age', data=df).fit()
print(model.summary())

** 正确做法**(每个单元格一个功能):

python
# Cell 1: 数据加载
df = pd.read_csv('data.csv')
print(f"Loaded {len(df)} observations")

# Cell 2: 数据清洗
df_clean = df.dropna()
print(f"Removed {len(df) - len(df_clean)} rows with missing values")

# Cell 3: 特征工程
df_clean['log_income'] = np.log(df_clean['income'])

# Cell 4: 描述性统计
result = df_clean.groupby('education')['log_income'].mean()
display(result)

# Cell 5: 可视化
plt.bar(result.index, result.values)
plt.title('Mean Log Income by Education')
plt.show()

# Cell 6: 回归分析
model = smf.ols('log_income ~ education + age', data=df_clean).fit()
print(model.summary())

6. 版本控制友好的设置

python
# 在笔记本开头添加
import warnings
warnings.filterwarnings('ignore')

# 固定随机种子(保证可复现性)
np.random.seed(42)

# 清除输出(防止 Git diff 混乱)
# 使用 nbstripout: pip install nbstripout
# 设置:nbstripout --install

学术研究中的 Jupyter 工作流

标准研究项目结构

research_project/
├── data/
│   ├── raw/                    # 原始数据(只读)
│   │   └── survey_2023.csv
│   └── processed/              # 清洗后数据
│       └── clean_survey.csv
├── notebooks/
│   ├── 01_data_cleaning.ipynb       # 数据清洗
│   ├── 02_descriptive_stats.ipynb   # 描述性统计
│   ├── 03_main_regression.ipynb     # 主回归
│   ├── 04_robustness.ipynb          # 稳健性检验
│   └── 05_heterogeneity.ipynb       # 异质性分析
├── scripts/
│   └── helper_functions.py     # 可复用函数
├── outputs/
│   ├── figures/
│   │   └── fig1_scatter.png
│   └── tables/
│       └── tab1_summary.tex
├── README.md
└── requirements.txt

从 Notebook 导出 LaTeX 表格

python
# 将 pandas 表格导出为 LaTeX
summary_stats = df.describe()
latex_code = summary_stats.to_latex(
    caption='Descriptive Statistics',
    label='tab:desc_stats',
    float_format="%.2f"
)

# 保存到文件
with open('../outputs/tables/table1.tex', 'w') as f:
    f.write(latex_code)

print("Table saved to outputs/tables/table1.tex")

从 Notebook 导出高分辨率图表

python
# 设置出版级图表参数
plt.rcParams['figure.dpi'] = 300
plt.rcParams['savefig.dpi'] = 300
plt.rcParams['font.size'] = 12
plt.rcParams['font.family'] = 'serif'

# 绘图
plt.figure(figsize=(8, 6))
plt.scatter(df['education'], df['income'], alpha=0.6)
plt.xlabel('Years of Education')
plt.ylabel('Annual Income ($)')
plt.title('Education and Income Relationship')

# 保存为多种格式
plt.savefig('../outputs/figures/fig1_scatter.png', bbox_inches='tight', dpi=300)
plt.savefig('../outputs/figures/fig1_scatter.pdf', bbox_inches='tight')  # 用于论文
plt.show()

️ Jupyter 扩展和插件

JupyterLab 扩展(推荐)

bash
# 安装 JupyterLab(升级版 Notebook)
pip install jupyterlab

# 启动 JupyterLab
jupyter lab

必装扩展

bash
# 1. 代码格式化(Black)
pip install jupyterlab-code-formatter black
jupyter labextension install @ryantam626/jupyterlab_code_formatter

# 2. 变量查看器
pip install lckr-jupyterlab-variableinspector

# 3. 目录导航
pip install jupyterlab-toc

# 4. Git 集成
pip install jupyterlab-git

Jupyter Notebook 扩展

bash
# 安装 nbextensions
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

# 启动后在 Nbextensions 标签页启用:
# - Table of Contents (目录)
# - ExecuteTime (显示运行时间)
# - Autopep8 (代码格式化)
# - Variable Inspector (变量查看)

高级技巧

1. 并行计算(处理大数据)

python
from joblib import Parallel, delayed
import multiprocessing

def process_chunk(chunk):
    # 处理单个数据块
    return chunk.groupby('category')['value'].mean()

# 分块读取大文件
chunks = pd.read_csv('large_file.csv', chunksize=10000)

# 并行处理
n_cores = multiprocessing.cpu_count()
results = Parallel(n_jobs=n_cores)(
    delayed(process_chunk)(chunk) for chunk in chunks
)

# 合并结果
final_result = pd.concat(results)

2. 进度条(长时间运行)

python
from tqdm.notebook import tqdm

# 在循环中显示进度条
results = []
for i in tqdm(range(1000), desc="Processing"):
    # 模拟耗时操作
    result = some_function(i)
    results.append(result)

3. 交互式可视化(Plotly)

python
import plotly.express as px

# 创建交互式散点图
fig = px.scatter(df, x='education', y='income',
                 color='gender', size='age',
                 hover_data=['country'],
                 title='Income by Education (Interactive)')
fig.show()

# 优点:可以缩放、hover 查看数据点

4. 自动生成报告(Papermill)

bash
# 安装 papermill
pip install papermill

# 批量运行笔记本(参数化)
papermill input_template.ipynb output_2023.ipynb \
  -p year 2023 \
  -p country "USA"

5. 内存监控

python
# 查看变量占用内存
%whos

# 查看 DataFrame 内存使用
df.info(memory_usage='deep')

# 删除不需要的变量
del large_dataframe
import gc
gc.collect()

调试技巧

1. 使用 IPython 调试器

python
# 在出错的地方插入断点
import pdb; pdb.set_trace()

# 运行到这里会暂停,可以检查变量
# 调试命令:
# - n (next): 下一行
# - c (continue): 继续运行
# - q (quit): 退出调试
# - p variable: 打印变量值

2. 显示完整错误信息

python
# 显示详细的错误堆栈
%xmode Verbose

# 恢复默认
%xmode Plain

3. 时间性能分析

python
# 分析函数性能
%prun df.groupby('category').agg({'value': ['mean', 'std']})

# 逐行分析(需要 line_profiler)
%load_ext line_profiler
%lprun -f my_function my_function(df)

Jupyter vs Stata/R

功能StataR (RStudio)Jupyter Notebook
交互式执行
图表内嵌(R Markdown)
混合文本和代码(R Markdown)
在线协作(RStudio Cloud)(Colab)
学习曲线简单中等简单

常见问题

Q1: Jupyter Notebook 和 JupyterLab 有什么区别?

  • Jupyter Notebook:经典界面,简洁
  • JupyterLab:新一代界面,功能更强(多标签页、终端、文件管理器)

建议:初学者先用 Notebook,熟练后再用 Lab

Q2: 如何分享 Jupyter Notebook?

方法 1:导出为 HTML

  • File → Download as → HTML

方法 2:上传到 GitHub

  • GitHub 会自动渲染 .ipynb 文件

方法 3:使用 nbviewer

Q3: 为什么图表不显示?

解决方法:在笔记本开头运行

python
%matplotlib inline

实战练习

练习 1:创建你的第一个分析笔记本

  1. 创建新笔记本,命名为 "income_analysis"
  2. 创建以下数据:
python
data = {
    'country': ['USA', 'China', 'India', 'Brazil', 'UK'],
    'gdp_per_capita': [65000, 12000, 2500, 9000, 45000],
    'population': [330, 1400, 1380, 213, 67]
}
  1. 计算:
    • 各国 GDP 总量(GDP per capita × population)
    • 平均 GDP per capita
    • 绘制条形图

练习 2:使用 Markdown

在笔记本中添加 Markdown 单元格,包含:

  • 标题
  • 研究问题
  • 数据来源说明

下一步

在下一节中,我们将学习 VS Code 配置,它是更专业的开发环境,适合大型项目。

继续前进!

基于 MIT 许可证发布。内容版权归作者所有。