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

时间:2013-03-26 10:59:17

标签: ipython ipython-notebook

我编写了一个分析数据集的ipython笔记本。现在我想使用此代码循环遍历不同的数据集。

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

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

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

3 个答案:

答案 0 :(得分:19)

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

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 

这使您可以实时进行实验,并仍然可以从主单元格中调用通用功能。

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

答案 1 :(得分:2)

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

Ipython/Jupyter - can we program a "run all cell above"?

change_parameters

您的代码

将其放在您的最后一个单元格中:

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

答案 2 :(得分:0)

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)
)

更多信息:docs | example