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

问题描述 投票:21回答:2

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

代码被分割成大约50个单元格(包括注释、标记解释...)。有没有办法在循环中运行笔记本的一部分,或者用不同的输入参数运行整个笔记本?

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

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

ipython ipython-notebook
2个回答
25
投票

在这种情况下,我通常做的是将重要的单元格包装成函数(你不必合并任何一个单元格),并有一个特定的主单元格,在参数列表中迭代并调用这些函数。例如,这就是我的一个笔记本中 "主单元格 "的样子。

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
投票

一个便宜但快速的技巧是在一种while循环中使用 "run all cells"。

IpythonJupyter - 我们能不能编一个 "run all cell above "的程序?

改变参数

您的代码

把这个放在最后一个单元格里。

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

© www.soinside.com 2019 - 2024. All rights reserved.