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(免费 + 云端)
- 访问 colab.research.google.com
- 登录 Google 账号
- 点击 "新建笔记本"
- 开始编程!
优点:
- 完全免费
- 提供免费 GPU(适合深度学习)
- 可以直接访问 Google Drive
方式 3:本地安装(推荐,长期使用)
步骤 1:安装 Anaconda
Anaconda 是 Python 的科学计算发行版,包含 Jupyter Notebook 和常用库。
安装后检查:
bash
# 在终端(Mac/Linux)或 Anaconda Prompt(Windows)中运行
jupyter --version步骤 2:启动 Jupyter Notebook
bash
# 在终端中运行
jupyter notebook浏览器会自动打开 http://localhost:8888
Jupyter Notebook 基础操作
1. 创建新笔记本
- 点击右上角 "New" → "Python 3"
- 笔记本会打开,默认名为 "Untitled"
- 点击标题重命名为 "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
- 列表项 23. 快捷键(必会)
| 快捷键 | 功能 |
|---|---|
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)
如果代码运行出错或变量混乱:
菜单栏 → Kernel → Restart & 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-gitJupyter 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 Plain3. 时间性能分析
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
| 功能 | Stata | R (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
- 访问 nbviewer.jupyter.org
- 输入 GitHub 链接
Q3: 为什么图表不显示?
解决方法:在笔记本开头运行
python
%matplotlib inline实战练习
练习 1:创建你的第一个分析笔记本
- 创建新笔记本,命名为 "income_analysis"
- 创建以下数据:
python
data = {
'country': ['USA', 'China', 'India', 'Brazil', 'UK'],
'gdp_per_capita': [65000, 12000, 2500, 9000, 45000],
'population': [330, 1400, 1380, 213, 67]
}- 计算:
- 各国 GDP 总量(GDP per capita × population)
- 平均 GDP per capita
- 绘制条形图
练习 2:使用 Markdown
在笔记本中添加 Markdown 单元格,包含:
- 标题
- 研究问题
- 数据来源说明
下一步
在下一节中,我们将学习 VS Code 配置,它是更专业的开发环境,适合大型项目。
继续前进!