在循环中运行ipython笔记本的部分内容/使用不同的输入参数

46 投票
5 回答
28482 浏览
提问于 2025-04-17 20:18

我写了一个ipython笔记本,用来分析一个数据集。现在我想用这段代码来循环处理不同的数据集。

这段代码分成了大约50个单元(包括注释、markdown解释等等)。有没有办法在循环中运行笔记本的某些部分,或者用不同的输入参数运行整个笔记本呢?

我不想把所有单元合并成一个函数,也不想把代码下载成python脚本,因为我真的很喜欢通过只执行某些单元来运行(和实验)分析的部分。

基本上就是把脚本的某些部分重构成一个函数,然后在循环中调用这个函数,只不过这里的“脚本部分”是笔记本的单元。

5 个回答

6

一个便宜但快速的技巧是使用“运行所有单元格”的方式,放在一个类似于循环的结构里:

Ipython/Jupyter - 我们能编写一个“运行所有上方单元格”的功能吗?

更改参数

你的代码

把这个放在你的最后一个单元格里:

display(Javascript('IPython.notebook.execute_all_cells()'))

39

在这种情况下,我通常会把重要的单元格做成函数(你不需要合并它们),然后有一个主单元格,它会遍历一系列参数并调用这些函数。例如,这就是我在一个笔记本中设置的“主单元格”的样子:

import itertools
# parameters
P_peak_all = [100, 200]
idle_ratio_all = [0., 0.3, 0.6]
# iterate through these parameters and call the notebook's logic
for P_peak, idle_ratio in itertools.product(P_peak_all, idle_ratio_all):
    print(P_peak, idle_ratio, P_peak*idle_ratio)
    print('========================')
    m_synth, m_synth_ns = build_synth_measurement(P_peak, idle_ratio)
    compare_measurements(m_synth, m_synth_ns, "Peak pauser", "No scheduler", file_note="-%d-%d" % (P_peak, int(idle_ratio*100)))

你仍然可以在整个笔记本中拖动一些数据(也就是说,在单元格底部用你的数据调用每个函数),这样可以实时测试每个单元格的内容。比如,有些单元格可能会写:

def square(x):
    y = x**2
    return y
square(x) # where x is your data running from the prior cells 

这让你可以实时实验,同时仍然可以从主单元格调用通用功能。

我知道用函数重构你的笔记本会多花一些时间,但我发现这样做实际上提高了笔记本的可读性。当你过了一段时间再回来查看时,这样更容易理解。如果需要的话,也更容易把它转换成一个“正式”的脚本或模块。

9

papermill.execute_notebook 是由Netflix设计的,目的是让我们能够像调用函数一样运行笔记本(这有助于代码的重复使用、实验的可复现性和内存的高效利用——它以批处理模式运行笔记本,不同于标准的Python交互式环境):

import papermill as pm

pm.execute_notebook(
   'path/to/input.ipynb',
   'path/to/output.ipynb',
   parameters=dict(alpha=0.6, ratio=0.1)
)

更多信息请查看:文档 | 示例

撰写回答