33

我写了一个 ipython notebook,它分析了一个数据集。现在我想用这段代码循环不同的数据集。

代码分为大约 50 个单元格(包括注释、降价解释……)。有没有办法循环运行笔记本的一部分或运行具有不同输入参数的整个笔记本?

我不想将所有单元格合并到一个函数中或将代码下载为 python 脚本,因为我真的很喜欢通过仅执行某些单元格来运行(和试验)部分分析。

基本上它将脚本的部分重构为一个函数并循环调用该函数,只是“脚本的部分”是笔记本单元格。

4

3 回答 3

34

我通常在这些场景中做的是将重要的单元格包装为函数(您不必合并其中的任何一个),并有一个特定的主单元格来迭代参数列表并调用这些函数。例如,这是我的一个笔记本中“主单元”的样子:

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 

这使您可以进行现场实验,并且仍然可以从主单元调用通用功能。

我知道使用函数重构笔记本是一些额外的工作,但我发现它实际上增加了我的笔记本的可读性,当你在较长时间后返回它时很有用,并且如果它更容易将其转换为“正确的”脚本或模块必要的。

于 2013-03-26T12:25:17.680 回答
3

一个便宜但快速的技巧是在一种 while 循环中使用“运行所有单元格”:

Ipython/Jupyter - 我们可以编写一个“运行上面的所有单元格”吗?

更改参数

你的代码

把它放在你的最后一个单元格中:

显示(Javascript('IPython.notebook.execute_all_cells()'))

于 2020-06-16T13:00:30.437 回答
1

papermill.execute_notebook设计用于执行此任务:

import papermill as pm

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

更多信息:文档| 例子

于 2021-07-26T13:13:41.610 回答