Jupyter Notebook高级用法
高效的交互式数据分析环境
一、Magic命令详解
Jupyter Notebook的Magic命令是一组以 % 或 %% 开头的特殊指令,它们大大扩展了Notebook的功能。行Magic(%)作用于单行,单元格Magic(%%)作用于整个单元格。以下是最常用的Magic命令及其详细用法。
1.1 性能分析命令
%timeit 与 %%time
%timeit 用于精确测量单行Python代码的执行时间,它会自动运行多次取平均值,结果更可靠。%%time 则测量整个单元格的执行时间。
# %timeit 测量单行代码执行时间
In [1]: %timeit sum(range(1000000))
2.34 ms ± 45.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# %%time 测量整个单元格执行时间
In [2]: %%time
import time
time.sleep(2)
result = sum(i * i for i in range(100000))
print(result)
333328333350000
Wall time: 2.03 s
%timeit 比Python内置的 timeit 模块更易用,且自动处理重复次数和循环次数。对于需要精确对比算法性能的场景非常有用。
%prun 与 %lprun
%prun 运行代码并显示详细的性能分析报告,包括每个函数的调用次数和耗时。
In [3]: %prun -s cumulative -l 10 sum(range(1000000))
4 function calls in 0.012 seconds
Ordered by: cumulative time
List reduced from 4 to 3 due to restriction <10
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.012 0.012 0.012 0.012 {built-in method builtins.sum}
1 0.000 0.000 0.012 0.012 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {built-in method builtins.range}
要使用 %lprun(逐行分析器),需要先安装 line_profiler 包:pip install line_profiler,然后通过 %load_ext line_profiler 加载。
1.2 可视化相关命令
%matplotlib inline
这是数据分析中最常用的Magic命令之一,它让Matplotlib图表直接显示在Notebook中,而不是弹出独立窗口。
In [4]: %matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), 'b-', label='sin(x)')
plt.plot(x, np.cos(x), 'r--', label='cos(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('正弦与余弦函数')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
如果需要在图表中支持交互式操作(缩放、平移),可以使用 %matplotlib notebook。但在JupyterLab中推荐使用 %matplotlib widget,它基于ipympl提供了更丰富的交互体验。
# 安装交互式matplotlib
$ pip install ipympl
# 在Notebook中使用
In [5]: %matplotlib widget
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 2 * np.pi, 200)
line, = ax.plot(x, np.sin(x))
# 支持缩放、平移、保存等交互操作
1.3 代码管理与调试
%run
%run 允许你在Notebook中直接执行外部Python脚本,并将脚本中定义的变量和函数导入到当前命名空间。
# 运行外部脚本
In [6]: %run data_processing.py
# 运行后可以直接使用脚本中定义的变量
In [7]: print(processed_data.shape)
# 带参数运行脚本
In [8]: %run train_model.py --epochs 100 --batch_size 32
%who 与 %who_ls
%who 列出当前命名空间中的所有变量,%who_ls 以列表形式返回变量名,方便程序化处理。
In [9]: a = 10
b = 'hello'
c = [1, 2, 3]
%who
a b c
In [10]: %who_ls
['a', 'b', 'c']
In [11]: %who str
b
还可以按类型过滤,例如 %who int 只列出整数类型的变量。
%debug
当代码抛出异常时,%debug 可以在事后启动交互式调试器,让你在出错环境中检查变量和执行代码。
In [12]: def divide(a, b):
return a / b
divide(1, 0)
ZeroDivisionError: division by zero
In [13]: %debug
> <ipython-input-12-...>(1)divide()
1 ----> 1 def divide(a, b):
2 return a / b
ipdb> a
1
ipdb> b
0
ipdb> a / b
*** ZeroDivisionError: division by zero
ipdb> quit
在调试器中可以使用 pdb 的所有命令:n(下一步)、s(进入函数)、c(继续)、l(查看代码)、p(打印变量)等。
1.4 数据持久化与跨Notebook共享
%store
%store 允许你在Notebook之间共享变量,变量会被序列化并存储在IPython的数据库文件中。
# Notebook A: 存储变量
In [14]: import pandas as pd
df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
%store df
Stored 'df' (DataFrame)
# Notebook B: 恢复变量
In [1]: %store -r df
print(df)
x y
0 1 4
1 2 5
2 3 6
# 查看所有已存储的变量
In [15]: %store
Stored variables (ipy_db):
df (pandas.core.frame.DataFrame)
# 删除存储的变量
In [16]: %store -d df
这对于需要分步处理大型数据分析任务非常有用,例如在一个Notebook中清洗数据,然后在另一个Notebook中进行分析和可视化,避免了重复处理。
1.5 扩展与外部命令
%load_ext
%load_ext 用于加载IPython扩展,扩展可以是语言功能增强、新Magic命令等。
# 加载自动重载扩展(修改模块后自动重新导入)
In [17]: %load_ext autoreload
%autoreload 2
# 加载SQL扩展(在Notebook中直接写SQL)
In [18]: %load_ext sql
%sql sqlite:///mydatabase.db
# 加载R魔法扩展
In [19]: %load_ext rpy2.ipython
# 加载Google Charts可视化扩展
In [20]: %load_ext googlecharts
%%writefile
将单元格内容直接写入外部文件,非常适合在Notebook中生成Python模块、配置文件或数据文件。
In [21]: %%writefile utils.py
def clean_text(text):
"""清理文本:去除空白和特殊字符"""
import re
text = text.strip()
text = re.sub(r'\s+', ' ', text)
return text
def tokenize(text):
"""中文分词封装"""
import jieba
return list(jieba.cut(text))
Writing utils.py
# 写入后可以直接导入使用
In [22]: from utils import clean_text
clean_text(' Hello World! ')
'Hello World!'
%%bash
在Notebook单元格中直接运行Shell命令,无需切换到终端。
In [23]: %%bash
echo "当前目录文件列表:"
ls -la
echo ""
echo "磁盘使用情况:"
df -h
# %%bash 也支持管道和重定向
In [24]: %%bash
ps aux | grep python | head -5
技巧提示
使用 %lsmagic 可以列出所有可用的Magic命令。%magic 显示详细文档。每个Magic命令也可以通过加 ? 查看文档,例如 %timeit?。
二、快捷键与效率提升
Jupyter Notebook有两种模式:命令模式(Command Mode) 和 编辑模式(Edit Mode)。熟练使用快捷键可以极大提升操作效率。命令模式下按键执行Notebook级操作,编辑模式下按键在单元格内输入内容。
2.1 模式切换
| 操作 |
快捷键 |
说明 |
| 进入命令模式 |
Esc |
从编辑模式切换到命令模式,边框变为蓝色 |
| 进入编辑模式 |
Enter |
从命令模式切换到编辑模式,边框变为绿色 |
2.2 命令模式快捷键(蓝色边框)
| 快捷键 |
功能 |
说明 |
Enter | 进入编辑模式 | 切换到当前单元格编辑状态 |
Shift+Enter | 运行当前单元格并选中下一个 | 最常用的操作 |
Ctrl+Enter | 运行当前单元格 | 运行后停留在当前单元格 |
Alt+Enter | 运行并在下方插入新单元格 | 适合边写边运行的工作流 |
A | 在上方插入单元格 | Above 的缩写 |
B | 在下方插入单元格 | Below 的缩写 |
X | 剪切当前单元格 | 配合 V 键移动单元格 |
C | 复制当前单元格 | 配合 V 键粘贴 |
V | 在下方粘贴单元格 | 粘贴剪切的单元格 |
Shift+V | 在上方粘贴单元格 | 在上方插入粘贴的单元格 |
D, D | 删除当前单元格 | 连按两次 D 删除 |
Z | 撤销删除单元格 | 恢复被删除的单元格 |
Y | 切换为代码单元格 | Code 类型 |
M | 切换为Markdown单元格 | Markdown 类型 |
R | 切换为Raw单元格 | Raw NBConvert 类型 |
1~6 | 设置Markdown标题级别 | 1到6级标题 |
Up/K | 选中上方单元格 | 向上移动选择 |
Down/J | 选中下方单元格 | 向下移动选择 |
Shift+Up/K | 向上扩展选中 | 多选单元格 |
Shift+Down/J | 向下扩展选中 | 多选单元格 |
Ctrl+Shift+减号 | 拆分当前单元格 | 在光标位置拆分 |
Shift+O | 切换输出滚动 | 长输出自动折叠 |
H | 显示快捷键帮助 | 所有快捷键一览 |
II | 中断内核 | 连按两次 I |
00 | 重启内核 | 连按两次 0 |
Space | 向下滚动 | 翻页 |
Shift+Space | 向上滚动 | 向上翻页 |
2.3 编辑模式快捷键(绿色边框)
| 快捷键 |
功能 |
说明 |
Tab | 代码补全或缩进 | 智能提示变量、方法、模块 |
Shift+Tab | 查看函数/对象文档 | 按一次显示简短文档,四次显示详细窗口 |
Ctrl+Shift+减号 | 在光标处拆分单元格 | 将一个单元格拆为两个 |
Ctrl+] | 增加缩进 | 向右缩进代码块 |
Ctrl+[ | 减少缩进 | 向左缩进代码块 |
Ctrl+A | 全选 | 选中单元格所有内容 |
Ctrl+Z | 撤销 | 撤销上一步操作 |
Ctrl+Y | 重做 | 恢复撤销的操作 |
Ctrl+/ | 注释/取消注释 | 选中行切换注释状态 |
Ctrl+D | 删除整行 | 删除光标所在行 |
Ctrl+Home | 跳到单元格开头 | 光标移到最前 |
Ctrl+End | 跳到单元格结尾 | 光标移到最后 |
Ctrl+Left | 向左跳一个单词 | 按单词移动 |
Ctrl+Right | 向右跳一个单词 | 按单词移动 |
Ctrl+Shift+P | 打开命令面板 | JupyterLab 中搜索所有命令 |
效率提升建议
- 最常用的快捷键组合:
Shift+Enter(运行并前进)、A(上方插入)、B(下方插入)、D,D(删除)、M/Y(切换单元格类型)。掌握这6个快捷键可覆盖80%的日常操作。
- 自定义快捷键:JupyterLab支持在 Settings > Advanced Settings Editor > Keyboard Shortcuts 中自定义快捷键映射。
- 代码折叠:在JupyterLab中可以使用
Ctrl+Shift+[ 折叠代码,Ctrl+Shift+] 展开代码。
三、Markdown高级排版
Jupyter Notebook使用Markdown作为富文本编辑语言,支持丰富的排版功能,包括LaTeX数学公式、表格、图片、HTML和目录生成等。
3.1 LaTeX数学公式
Jupyter Notebook支持LaTeX数学公式渲染,使用 $...$ 表示行内公式,$$...$$ 表示独立公式。
%%markdown 单元格内容示例:
# 线性回归模型
## 模型定义
线性回归假设目标变量 $y$ 与特征 $x$ 之间存在线性关系:
$$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n + \varepsilon $$
## 损失函数
使用最小二乘法(OLS)估计参数:
$$ J(\beta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\beta(x^{(i)}) - y^{(i)})^2 $$
## 梯度下降更新规则
$$ \beta_j := \beta_j - \alpha \frac{\partial J(\beta)}{\partial \beta_j} $$
## 矩阵形式
正规方程(Normal Equation)的闭式解:
$$ \beta = (X^T X)^{-1} X^T y $$
常用LaTeX符号速查表
| 类别 |
LaTeX代码 |
渲染效果 |
说明 |
| 希腊字母 | \alpha, \beta, \gamma, \theta, \lambda, \mu, \sigma, \omega | $\alpha, \beta, \gamma, \theta, \lambda, \mu, \sigma, \omega$ | 常用希腊字母 |
| 大运算符 | \sum_{i=1}^n, \prod_{i=1}^n, \int_a^b | $\sum_{i=1}^n, \prod_{i=1}^n, \int_a^b$ | 求和、求积、积分 |
| 分数 | \frac{a}{b} | $\frac{a}{b}$ | 分数形式 |
| 平方根 | \sqrt{x}, \sqrt[n]{x} | $\sqrt{x}, \sqrt[n]{x}$ | 开根号 |
| 上标下标 | x^2, x_i, x_{ij} | $x^2, x_i, x_{ij}$ | 幂次和索引 |
| 矩阵 | \begin{matrix}1&2\\3&4\end{matrix} | $\begin{matrix}1&2\\3&4\end{matrix}$ | 矩阵排版 |
| 方程组 | \begin{cases} x+y=1 \\ x-y=0 \end{cases} | $\begin{cases} x+y=1 \\ x-y=0 \end{cases}$ | 分段函数或方程组 |
| 向量 | \vec{v}, \mathbf{v} | $\vec{v}, \mathbf{v}$ | 向量表示 |
| 集合 | \in, \subset, \cup, \cap, \emptyset | $\in, \subset, \cup, \cap, \emptyset$ | 集合运算 |
| 箭头 | \rightarrow, \Rightarrow, \longrightarrow | $\rightarrow, \Rightarrow, \longrightarrow$ | 各种箭头 |
3.2 表格排版
Markdown支持使用 | 和 - 绘制表格,但在Jupyter中建议直接使用Pandas DataFrame展示,效果更好。
# 使用Pandas直接展示表格(代码单元格)
In [25]: import pandas as pd
import numpy as np
df = pd.DataFrame({
'模型': ['线性回归', '决策树', '随机森林', 'XGBoost', '神经网络'],
'准确率': [0.85, 0.88, 0.91, 0.93, 0.95],
'训练时间(s)': [1.2, 3.5, 8.1, 15.3, 120.5],
'内存(MB)': [120, 180, 350, 420, 1200]
})
df.style.highlight_max(color='lightgreen', subset=['准确率']) \
.highlight_min(color='lightcoral', subset=['训练时间(s)', '内存(MB)'])
3.3 图片嵌入与排版
Jupyter支持多种方式嵌入图片,包括网络图片、本地图片和在代码中生成图片。
%%markdown 单元格中嵌入图片:
![] (https://matplotlib.org/stable/_images/sphx_glr_logo_001.png)
<!-- 调整图片大小 -->
<img src="https://matplotlib.org/stable/_images/sphx_glr_logo_001.png" width="400">
# 代码单元格中嵌入本地图片
In [26]: from IPython.display import Image, display
display(Image(filename='chart.png', width=600))
# 嵌入SVG矢量图
In [27]: from IPython.display import SVG
display(SVGA(filename='diagram.svg'))
3.4 HTML直接嵌入
Jupyter Notebook支持在Markdown单元格中直接使用HTML标签,实现更丰富的排版效果。也可以使用 IPython.display 中的 HTML 对象在代码单元格中动态生成HTML内容。
# 在代码单元格中动态生成HTML
In [28]: from IPython.display import HTML
html_content = '''
<div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 20px; border-radius: 10px; color: white; text-align: center;">
<h2>自定义HTML卡片</h2>
<p>这是通过IPython.display.HTML渲染的带样式的HTML内容</p>
<button style="background: white; color: #667eea; border: none;
padding: 10px 20px; border-radius: 5px; cursor: pointer;
font-weight: bold;">点击按钮</button>
</div>
'''
display(HTML(html_content))
# 使用HTML嵌入交互式iframe
In [29]: display(HTML('<iframe src="https://example.com" width="800" height="600"></iframe>'))
3.5 目录生成
在Jupyter Notebook中可以通过以下方式生成目录:
# 方法1:使用nbextensions的Table of Contents扩展
# 安装后自动在工具栏显示TOC按钮
$ pip install jupyter_contrib_nbextensions
# 方法2:在Notebook中使用JavaScript动态生成目录(代码单元格)
In [30]: from IPython.display import HTML
display(HTML('''
<div id="toc-container" style="background:#f8f9fa;padding:15px;border-radius:5px;border:1px solid #ddd;">
<h3>📑 目录</h3>
<ul id="toc-list"></ul>
</div>
<script>
(function() {
var toc = document.getElementById('toc-list');
var headers = document.querySelectorAll('.rendered_html h1, .rendered_html h2, .rendered_html h3');
headers.forEach(function(h) {
var li = document.createElement('li');
var a = document.createElement('a');
var level = parseInt(h.tagName[1]);
a.style.marginLeft = (level-1)*20 + 'px';
a.textContent = h.textContent;
a.href = '#' + h.id;
a.style.textDecoration = 'none';
a.style.color = '#2980b9';
li.appendChild(a);
toc.appendChild(li);
});
})();
</script>
'''))
Markdown排版最佳实践
- 使用标题层级 # 到 ###### 组织内容结构,每个Notebook建议只使用一个一级标题
- LaTeX公式中使用 \tag{} 添加公式编号,使用 \label{} 和 \ref{} 交叉引用
- 长代码块和输出使用 Shift+O 折叠输出,保持Notebook整洁
- 在单元格开头使用Markdown标题做注释,替代代码中的大段注释块
四、Widget交互组件
ipywidgets库为Jupyter Notebook提供了丰富的交互式控件,可以创建滑块、按钮、下拉菜单等,实现参数调节和动态可视化。
4.1 基础安装与导入
# 安装ipywidgets
$ pip install ipywidgets
$ jupyter nbextension enable --py widgetsnbextension # 经典Notebook中启用
# 导入常用组件
In [31]: import ipywidgets as widgets
from ipywidgets import interact, interactive, interactive_output, fixed
from IPython.display import display
4.2 基础控件使用
# 滑块(Slider)
In [32]: slider = widgets.IntSlider(
value=50, min=0, max=100, step=1,
description='参数值:',
style={'description_width': 'initial'},
layout=widgets.Layout(width='80%')
)
display(slider)
# 按钮(Button)
In [33]: button = widgets.Button(
description='点击运行',
button_style='success', # 'primary', 'success', 'info', 'warning', 'danger'
icon='check'
)
output = widgets.Output()
def on_button_clicked(b):
with output:
output.clear_output()
print(f'当前滑块值: {slider.value}')
button.on_click(on_button_clicked)
display(button, output)
# 下拉菜单(Dropdown)
In [34]: dropdown = widgets.Dropdown(
options=['线性回归', '决策树', '随机森林', 'XGBoost', '神经网络'],
value='随机森林',
description='选择模型:',
style={'description_width': 'initial'}
)
display(dropdown)
# 复选框(Checkbox)
In [35]: checkbox = widgets.Checkbox(
value=True,
description='显示网格',
indent=False
)
# 文本输入框(Text)
text = widgets.Text(
value='Hello Jupyter',
placeholder='请输入文本',
description='输入:',
disabled=False
)
# 组合显示
display(checkbox, text)
4.3 @interact 装饰器
@interact 装饰器是创建交互式控件最便捷的方式,它会根据函数参数自动推断控件类型。
In [36]: import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
@interact
def plot_sine(
amplitude=(0.1, 3.0, 0.1),
frequency=(0.1, 5.0, 0.1),
phase=(0.0, 2*np.pi, 0.1),
color=['blue', 'red', 'green', 'purple', 'orange']
):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
plt.figure(figsize=(10, 4))
plt.plot(x, y, color=color, linewidth=2)
plt.ylim(-3.5, 3.5)
plt.grid(True, alpha=0.3)
plt.title(f'y = {amplitude} * sin({frequency}x + {phase:.2f})')
plt.show()
4.4 interactive_output 精确控制
相比 @interact 的自动控件生成,interactive_output 可以手动创建控件布局,实现更复杂的交互界面。
In [37]: from ipywidgets import HBox, VBox, Label
# 手动创建控件
freq_slider = widgets.FloatSlider(value=1.0, min=0.1, max=5.0, step=0.1, description='频率')
amp_slider = widgets.FloatSlider(value=1.0, min=0.1, max=3.0, step=0.1, description='振幅')
phase_slider = widgets.FloatSlider(value=0.0, min=0.0, max=2*np.pi, step=0.1, description='相位')
noise_check = widgets.Checkbox(value=False, description='添加噪声')
# 定义响应函数
def update_plot(frequency, amplitude, phase, noise):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
if noise:
y += np.random.normal(0, 0.1, size=y.shape)
plt.figure(figsize=(10, 4))
plt.plot(x, y, 'b-', linewidth=1.5)
plt.ylim(-3.5, 3.5)
plt.grid(True, alpha=0.3)
plt.show()
# 连接控件和函数
ui = VBox([freq_slider, amp_slider, phase_slider, noise_check])
out = interactive_output(update_plot, {
'frequency': freq_slider,
'amplitude': amp_slider,
'phase': phase_slider,
'noise': noise_check
})
display(ui, out)
4.5 高级布局:Tab与Accordion
ipywidgets支持复杂的布局容器,可以创建多标签页和折叠面板。
In [38]: # 创建Tab标签页
tab = widgets.Tab()
# 每个标签页的内容
page1 = widgets.VBox([
widgets.HTML('<h3>数据概览</h3><p>此处显示数据集的统计摘要</p>'),
widgets.Button(description='刷新数据')
])
page2 = widgets.VBox([
widgets.HTML('<h3>可视化</h3><p>调整参数生成图表</p>'),
widgets.IntSlider(value=10, min=5, max=100, description='样本数'),
widgets.Dropdown(options=['散点图', '折线图', '柱状图'], description='图表类型')
])
page3 = widgets.VBox([
widgets.HTML('<h3>模型配置</h3><p>设置训练参数</p>'),
widgets.FloatSlider(value=0.01, min=0.001, max=0.1, description='学习率'),
widgets.IntSlider(value=100, min=10, max=1000, description='迭代次数')
])
tab.children = [page1, page2, page3]
tab.set_title(0, '数据')
tab.set_title(1, '图表')
tab.set_title(2, '模型')
display(tab)
# 创建折叠面板(Accordion)
accordion = widgets.Accordion(children=[
widgets.HTML('<p>这是展开后的详细说明内容。Accordion适合存储辅助信息。</p>'),
widgets.HTML('<p>第二部分的详细说明。</p>')
])
accordion.set_title(0, '使用说明')
accordion.set_title(1, '参数详解')
display(accordion)
Widget最佳实践
- 使用 widgets.interactive_output 而非 @interact 实现更复杂的布局控制
- 为长时间运行的计算添加 widgets.ProgressBar 进度条,提升用户体验
- 使用 widgets.Output 作为专用输出区域,避免输出混乱
- 控件布局使用 HBox(水平排列)和 VBox(垂直排列)组合
- 通过 widgets.Layout 设置控件的CSS样式,如 width、margin、display 等
- 在JupyterLab中推荐使用 %matplotlib widget 替代 %matplotlib inline,获得更好的交互体验
五、nbconvert导出与模板定制
nbconvert是Jupyter内置的Notebook转换工具,可以将.ipynb文件导出为多种格式,包括HTML、PDF、Slides、Markdown和Python脚本等。它支持高度定制的模板系统,满足不同场景的输出需求。
5.1 安装与基础用法
# nbconvert 随 Jupyter 一起安装,无需单独安装
# 命令行基础用法
$ jupyter nbconvert --to html my_notebook.ipynb
$ jupyter nbconvert --to pdf my_notebook.ipynb
$ jupyter nbconvert --to slides my_notebook.ipynb
$ jupyter nbconvert --to script my_notebook.ipynb
$ jupyter nbconvert --to markdown my_notebook.ipynb
5.2 导出为HTML
HTML导出是最常用的格式,支持富文本、数学公式和代码高亮。
# 基础HTML导出
$ jupyter nbconvert --to html report.ipynb
# 不执行代码(仅导出已有输出)
$ jupyter nbconvert --to html --no-execute report.ipynb
# 导出时隐藏代码
$ jupyter nbconvert --to html --TemplateExporter.exclude_input=True report.ipynb
# 导出时隐藏输出
$ jupyter nbconvert --to html --TemplateExporter.exclude_output=True report.ipynb
# 显示代码行号
$ jupyter nbconvert --to html --HTMLExporter.lineno=True report.ipynb
5.3 导出为PDF
PDF导出需要LaTeX引擎(如TeX Live或MiKTeX),或者可以使用WebPDF方法。
# 方法一:通过LaTeX导出PDF(推荐,质量最高)
$ jupyter nbconvert --to pdf report.ipynb
# 需要系统中安装了 pandoc 和 LaTeX 发行版
# 方法二:通过WebPDF(无需LaTeX)
$ jupyter nbconvert --to webpdf --allow-chromium-download report.ipynb
# 方法三:先导出HTML再用浏览器打印为PDF
$ jupyter nbconvert --to html report.ipynb
# 在浏览器中打开HTML,使用 Ctrl+P 打印为PDF
# 自定义PDF模板
$ jupyter nbconvert --to pdf --template report_template.tplx report.ipynb
5.4 导出为幻灯片
利用nbconvert可以将Notebook转换为Reveal.js幻灯片,非常适合技术分享和教学场景。
# 导出为幻灯片
$ jupyter nbconvert --to slides my_presentation.ipynb
# 启动幻灯片服务器(自动打开浏览器)
$ jupyter nbconvert --to slides my_presentation.ipynb --post serve
# 自定义幻灯片主题
$ jupyter nbconvert --to slides my_presentation.ipynb \
--SlidesExporter.reveal_theme=serif \
--SlidesExporter.reveal_transition=slide
# 可用的reveal主题:sky, beige, simple, serif, night, moon, solarized, white, black, league
# 可用的过渡效果:slide, convex, concave, zoom, fade, none
在Notebook中,需要通过工具栏的"Cell Toolbar > Slideshow"为每个单元格设置幻灯片类型:Slide(主幻灯片)、Sub-Slide(子幻灯片)、Fragment(逐段显示)、Skip(跳过)、Notes(演讲者备注)。
5.5 导出为Python脚本
将Notebook转换为可执行的Python脚本,代码单元格成为Python语句,Markdown单元格成为注释。
# 导出为Python脚本
$ jupyter nbconvert --to script analysis.ipynb
# 生成 analysis.py 文件
# 导出时保留Markdown为注释
$ jupyter nbconvert --to script --ScriptExporter.comment_markdown=True analysis.ipynb
5.6 模板定制
nbconvert支持使用Jinja2模板引擎定制输出格式,可以创建自定义模板满足特定的样式需求。
# 使用内置模板
$ jupyter nbconvert --to html --template classic report.ipynb
$ jupyter nbconvert --to html --template lab report.ipynb
# 创建自定义模板文件 (my_template.html.j2)
$ cat << 'EOF' > my_template.html.j2
{%- extends 'lab/index.html.j2' -%}
{% block header %}
<div style="background: #2c3e50; color: white; padding: 20px; text-align: center;">
<h1>{{ nb.metadata.get('title', '数据分析报告') }}</h1>
<p>生成日期: {{ resources.metadata.get('date', '') }}</p>
</div>
{% endblock header %}
{% block footer %}
<div style="text-align: center; color: #999; padding: 20px; font-size: 0.8em;">
<p>本文档由 Jupyter Notebook 自动生成 | 仅供内部使用</p>
</div>
{% endblock footer %}
EOF
# 使用自定义模板导出
$ jupyter nbconvert --to html --template my_template.html.j2 report.ipynb
# 使用模板变量
$ jupyter nbconvert --to html \
--template my_template.html.j2 \
--TemplateExporter.extra_template_basedirs='.' \
report.ipynb
nbconvert最佳实践
- 批量导出:使用 jupyter nbconvert --to html *.ipynb 批量转换当前目录下所有Notebook
- 自动化报告:结合 Papermill 和 nbconvert 实现参数化报告的自动生成
- 隐藏代码单元格:使用 {"tags": ["hide"]} 在单元格元数据中标记隐藏,结合模板过滤
- 输出预处理:使用 --output-dir 指定输出目录,避免源文件目录混乱
- 执行后再导出:使用 --execute 参数在执行后自动导出,一步完成
六、Jupyter配置与扩展
Jupyter Notebook提供丰富的配置选项和扩展生态系统,可以显著提升开发效率和用户体验。
6.1 配置文件 jupyter_notebook_config.py
Jupyter的配置文件位于 ~/.jupyter/jupyter_notebook_config.py,可以通过以下命令生成默认配置。
# 生成默认配置文件
$ jupyter notebook --generate-config
# 生成的文件路径:~/.jupyter/jupyter_notebook_config.py
# 常用配置项示例 (jupyter_notebook_config.py)
c = get_config()
# 设置工作目录
c.NotebookApp.notebook_dir = '/home/user/notebooks'
# 设置访问密码(先通过 jupyter notebook password 设置)
c.NotebookApp.password = 'argon2:$argon2id$v=19$m=...'
# 设置监听端口
c.NotebookApp.port = 8888
# 允许远程访问
c.NotebookApp.ip = '0.0.0.0'
# 不自动打开浏览器
c.NotebookApp.open_browser = False
# 设置会话超时(分钟)
c.NotebookApp.shutdown_no_activity_timeout = 60
# 禁用某些功能
c.NotebookApp.disable_check_xsrf = False
# 自定义资源限制
c.MappingKernelManager.max_kernels = 10 # 最大并行内核数
# JupyterLab 配置 (~/.jupyter/lab/user-settings/)
# 可通过 JupyterLab 界面 > Settings > Advanced Settings Editor 配置
6.2 nbextensions 扩展插件
jupyter_contrib_nbextensions 提供了大量社区贡献的扩展插件,极大增强了Notebook的功能。
# 安装nbextensions
$ pip install jupyter_contrib_nbextensions
$ jupyter contrib nbextension install --user
# 启用/禁用特定扩展
$ jupyter nbextension enable codefolding/main
$ jupyter nbextension enable toc2/main
$ jupyter nbextension enable execute_time/ExecuteTime
$ jupyter nbextension enable collapsible_headings/main
$ jupyter nbextension enable snippets/main
推荐扩展列表
| 扩展名称 |
功能描述 |
启用ID |
| Table of Contents (2) | 自动生成侧边栏目录,支持章节导航 | toc2/main |
| Codefolding | 代码折叠功能,支持缩进和括号折叠 | codefolding/main |
| Execute Time | 显示每个单元格的执行时间和结束时间 | execute_time/ExecuteTime |
| Collapsible Headings | 可折叠的Markdown标题,便于长文档导航 | collapsible_headings/main |
| Snippets Menu | 代码片段菜单,快速插入常用代码模板 | snippets/main |
| Hide Input | 一键隐藏/显示代码单元格 | hide_input/main |
| Scratchpad | 临时代码草稿本,不影响主Notebook | scratchpad/main |
| Variable Inspector | 变量查看器,查看当前命名空间中所有变量 | varInspector/main |
| Autopep8 | 一键格式化代码(需要安装autopep8) | autopep8/main |
| Ruler | 编辑器标尺,帮助控制代码行长度 | ruler/main |
| Highlight Selected Word | 高亮光标所在单词的所有出现位置 | highlight_selected_word/main |
| Spell Checker | Markdown单元格拼写检查 | spellchecker/main |
扩展配置与启用方式
# 在Notebook中直接启用/禁用扩展
In [39]: from jupyter_contrib_nbextensions import install
import IPython
# 查看当前启用的扩展列表
!jupyter nbextension list
# 也可以通过Nbextensions配置页面启用
# 启动Jupyter后,在浏览器中访问:
# http://localhost:8888/nbextensions
# 勾选需要的扩展即可
6.3 JupyterLab扩展
JupyterLab是Jupyter的下一代界面,其扩展系统基于npm包管理器,功能更强大。
# 安装JupyterLab扩展
$ pip install jupyterlab
# JupyterLab 3.x 使用pip安装扩展
$ pip install jupyterlab-git
$ pip install jupyterlab-spreadsheet
$ pip install jupyterlab-drawio
$ pip install jupyterlab-python-file
# JupyterLab 4.x 兼容的扩展
$ pip install jupyterlab-latex # LaTeX实时预览
$ pip install jupyterlab-toc # 目录导航
$ pip install jupyterlab-variable-inspector # 变量查看器
$ pip install jupyterlab-code-formatter # 代码格式化
# 查看已安装的扩展
$ jupyter labextension list
6.4 主题与CSS自定义
Jupyter支持通过自定义CSS改变界面外观,包括字体、颜色、布局等。
# 自定义CSS文件位置:~/.jupyter/custom/custom.css
$ cat << 'EOF' > ~/.jupyter/custom/custom.css
/* 修改Notebook背景色 */
body {
background-color: #f5f5f5;
}
/* 修改单元格字体 */
div.CodeMirror pre {
font-family: 'Fira Code', 'Consolas', monospace;
font-size: 14px;
}
/* 修改输出区域样式 */
div.output_area pre {
font-family: 'Fira Code', monospace;
font-size: 13px;
}
/* 修改Markdown标题颜色 */
h1 { color: #2c3e50; }
h2 { color: #2980b9; }
h3 { color: #16a085; }
/* 隐藏滚动条(保持整洁) */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-thumb {
background: #ccc;
border-radius: 4px;
}
EOF
# 安装第三方主题
$ pip install jupyterthemes
# 查看可用主题
$ jt -l
# 应用主题
$ jt -t oceans16 -f fira -fs 12 -nfs 13 -tfs 14 -dfs 10 -ofs 12
# 恢复默认主题
$ jt -r
6.5 远程访问与安全配置
在生产环境中部署Jupyter时,需要配置SSL证书和访问控制。
# 配置SSL(jupyter_notebook_config.py)
c.NotebookApp.certfile = '/path/to/mycert.pem'
c.NotebookApp.keyfile = '/path/to/mykey.key'
# 创建自签名证书
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout mykey.key -out mycert.pem
# 配置密码
$ jupyter notebook password
# 输入密码后,密码哈希值自动写入 jupyter_notebook_config.json
# Docker部署
$ docker run -p 8888:8888 \
-v /host/notebooks:/home/jovyan/work \
-e JUPYTER_ENABLE_LAB=yes \
jupyter/datascience-notebook
七、多语言内核
Jupyter的强大之处在于其多内核架构,通过安装不同的内核,可以在同一个Notebook界面中使用不同的编程语言。
7.1 内核管理基础
# 查看已安装的内核列表
$ jupyter kernelspec list
Available kernels:
python3 /usr/share/jupyter/kernels/python3
# 安装新内核到指定位置
$ python -m ipykernel install --user --name myenv --display-name "Python (MyEnv)"
# 删除不需要的内核
$ jupyter kernelspec uninstall myenv
7.2 IRkernel(R语言内核)
在Jupyter中使用R语言进行统计分析,可以无缝结合Python和R的生态。
# 在R中安装IRkernel
$ R -e "install.packages('IRkernel', repos='https://cran.r-project.org')"
# 注册内核
$ R -e "IRkernel::installspec(user = TRUE)"
# 配置文件位置:~/.jupyter/kernels/ir/kernel.json
# R内核Notebook示例
In [1]: # 在R内核中加载数据分析包
library(ggplot2)
library(dplyr)
# 加载内置数据集
data(mtcars)
summary(mtcars)
# 绘制散点图矩阵
pairs(mtcars[, 1:5], col=mtcars$cyl, pch=19)
# 使用ggplot2绘图
ggplot(mtcars, aes(x=wt, y=mpg, color=factor(cyl))) +
geom_point(size=3) +
geom_smooth(method="lm", se=FALSE) +
labs(title="MPG vs Weight",
x="Weight (1000 lbs)", y="Miles per Gallon") +
theme_minimal()
通过 rpy2 也可以在Python内核中直接使用R代码,无需切换内核。
# 在Python内核中使用R代码
In [40]: %load_ext rpy2.ipython
In [41]: %%R
library(ggplot2)
summary(mtcars)
In [42]: # Python和R之间传递数据
%R -i df # 将Python变量df传入R
%%R -o result # 将R变量result传回Python
result <- lm(mpg ~ wt + hp, data=df)
summary(result)
7.3 bash_kernel(Shell内核)
bash_kernel将Shell环境带入Jupyter,适合系统管理、DevOps和文件操作场景。
# 安装bash_kernel
$ pip install bash_kernel
$ python -m bash_kernel.install
# bash内核Notebook示例
In [1]: echo "=== 系统信息 ==="
uname -a
echo ""
echo "=== CPU信息 ==="
lscpu | head -10
echo ""
echo "=== 内存信息 ==="
free -h
echo ""
echo "=== 磁盘信息 ==="
df -h
In [2]: # 使用管道和重定向
ps aux | grep python | awk '{print $2, $11}' | sort -k1 -n
In [3]: # 文件操作
for f in *.csv; do
lines=$(wc -l < "$f")
echo "$f: $lines lines"
done
7.4 SQL内核与%%sql Magic
ipython-sql 扩展让你在Python内核中直接执行SQL查询,支持多种数据库后端。也可以安装专用的SQL内核。
# 安装ipython-sql
$ pip install ipython-sql
# 在Notebook中使用
In [43]: %load_ext sql
# 连接SQLite数据库(内存数据库)
%sql sqlite:///
# 创建表示例
In [44]: %%sql
CREATE TABLE employees AS
SELECT * FROM (
VALUES (1, '张三', '技术部', 25000),
(2, '李四', '市场部', 18000),
(3, '王五', '技术部', 22000),
(4, '赵六', '财务部', 20000)
) AS emp(id, name, department, salary)
# 执行SQL查询
In [45]: %%sql
SELECT
department,
COUNT(*) as emp_count,
ROUND(AVG(salary), 0) as avg_salary,
MAX(salary) as max_salary
FROM employees
GROUP BY department
ORDER BY avg_salary DESC
# 连接远程数据库
In [46]: %sql postgresql://user:pass@localhost:5432/mydb
%sql mysql://user:pass@localhost:3306/mydb
%sql mssql://user:pass@localhost:1433/mydb
# 查询结果直接转为Pandas DataFrame
In [47]: result = %sql SELECT * FROM employees
df = result.DataFrame()
print(df.head())
7.5 其他常用内核
| 内核名称 |
语言 |
安装命令 |
适用场景 |
| Julia | Julia | pip install julia | 科学计算、数值分析、机器学习 |
| Octave | Octave/MATLAB | pip install octave_kernel | 数值计算、矩阵运算、信号处理 |
| Scala | Scala | pip install spylon-kernel | Spark大数据处理、函数式编程 |
| Groovy | Groovy | pip install groovy_kernel | Java生态、Jenkins脚本 |
| Kotlin | Kotlin | pip install kotlin-jupyter | Android开发、后端服务 |
| Ruby | Ruby | pip install iruby | Web开发、脚本处理 |
| NodeJS | JavaScript/Node.js | pip install ijavascript | 前端开发、Node.js脚本 |
| Wolfram Language | Wolfram/Mathematica | pip install wolframlanguage | 符号计算、数学建模 |
多内核协同工作流
一个高效的数据分析工作流可以同时使用多个内核:
- Python内核:数据抓取、预处理、深度学习模型训练
- R内核:统计分析、假设检验、可视化
- SQL内核:数据查询、数据仓库操作、ETL流程
- bash内核:数据管道构建、文件处理、自动化运维
- Scala内核:大规模数据集的Spark分布式处理
通过 %store 命令在不同内核的Notebook之间传递数据,实现语言间的无缝协作。
八、核心要点总结
- Magic命令:%timeit/%%time 测量性能,%matplotlib inline/widget 控制图表渲染,%debug 事后调试,%store 跨Notebook共享变量,%%writefile 生成文件,%%bash 执行Shell命令,%load_ext 加载扩展
- 快捷键:
Shift+Enter 运行并前进,A/B 插入单元格,D,D 删除,M/Y 切换类型,Tab 自动补全,Shift+Tab 查看文档
- Markdown排版:$...$/$$...$$ 数学公式,|...| 表格,IPython.display.HTML 嵌入HTML,TOC目录扩展自动生成导航
- Widget交互:@interact 快速创建交互,interactive_output 精确布局控制,Tab/Accordion 容器组织复杂界面
- nbconvert导出:--to html/pdf/slides/script 多种格式,Jinja2模板引擎定制输出样式,结合Papermill实现自动化报告生成
- 配置与扩展:jupyter_notebook_config.py 全局配置,nbextensions提供TOC/代码折叠/变量查看等实用扩展,jupyterthemes定制外观
- 多语言内核:IRkernel、bash_kernel、ipython-sql 在同一平台实现多语言开发,通过 rpy2 或 %store 在不同语言间传递数据
- 核心原则:选择最适合任务的语言和工具,利用Jupyter的交互性和可重复性构建高效的数据分析工作流