当前位置: 首页 > 知识库问答 >
问题:

选择性地从另一个木星笔记本导入

竺勇
2023-03-14

我把我的Jupyter笔记本整理成:数据。ipynb方法。ipynb结果。ipynb。如何从数据和方法笔记本中有选择地导入单元格,以便在结果笔记本中使用?

我知道nbimportipynb,但这两者都不提供变量的选择性导入。有一个导入定义的选项——包括大写的变量——但这对我不起作用,因为我必须将笔记本中的大多数变量转换为大写。

我宁愿导入所有内容,除了两三个需要很长时间才能计算的单元格。理想情况下,我希望将某些任务的执行推迟到我访问它们的那一刻(惰性评估)——但我知道这可能很难实现。

以下是伪代码的概述(每行代表一个单元格):

data.ipynb

raw_data = load_data()
dataset = munge(raw_data)
describe(dataset)             # I want this line to be skipped at import

方法。ipynb

import data
method = lambda x: x * x
# showcase how the method works on a subset of the dataset
method(data.dataset[:5])      # I want this line to be skipped at import

结果。ipynb

import data
import methods
result = methods.method(data.dataset)
describe(result)

动机是我的真实数据和方法笔记本:

  • 要长得多、复杂得多,因此我想使用导入系统
  • 只有几个单元格的计算时间超过秒

此外,方法笔记本不能替换为方法。py文件。事实上,我有这样一个文件,其中包含我的方法的实现细节。笔记本更像是一个指定默认参数、展示我的方法如何工作以及解释示例结果的地方。

这个问题本质上是以下因素的结合:

  • 如何从其他ipython笔记本导入?,和
  • 选择在“全部运行”期间在ipython笔记本中运行哪些单元格的简单方法

我通读了这两个问题的答案,没有一个能满足我的要求。

在下面的回答中,我提出了使用自定义单元格魔法和猴子修补的解决方案。然而,我更喜欢一种解决方案,它允许指定哪些单元格/表达式要排除/包括,而不是在原始笔记本中(例如data.ipynb),而是在目标笔记本中(例如methods.ipynb)。

例如,它可以使用正则表达式:

# all variables starting with 'result' would be ignored
nbimporter.options['exclude'] = '^result.*'

或者(更好的)懒惰的评价:

# only `a` and `b` would be evaluated and imported
from data import a, b

所有想法都将受到赞赏!

共有1个答案

尹乐邦
2023-03-14

到目前为止,我一直在修补nbimport,并选择单元格来排除使用单元格魔法:

from IPython.core import magic

@magic.register_cell_magic
def skip_on_import(args, cell):
    get_ipython().ex(cell)

用于修补cell remover的代码:

import ast

class SkippingTransformer(ast.NodeTransformer):
    # usage:
    # import nbimporter 
    # nbimporter.CellDeleter = SkippingTransformer

    def visit(self, node):
        if (
            isinstance(node, ast.Expr)
            and isinstance(node.value, ast.Call)
            and isinstance(node.value.func, ast.Attribute)
            and node.value.func.attr == 'run_cell_magic'
            and node.value.args[0].s == 'skip_on_import'
        ):
            return
        return node

还有一个实际的例子,数据。ipynb

methods.ipynb(结尾处的异常是有意的-它意味着成功!):

编辑:我在一段时间前发布了上面的代码作为jupyter助手的一部分。使用此软件包,只需导入导入笔记本中的进口商:

from jupyter_helpers.selective_import import notebooks_importer 

细胞魔法可以在进口笔记本中导入:

from jupyter_helpers.selective_import import skip_on_import

下面是导入笔记本的示例:数据。ipynb和导入笔记本的示例:结果。ipynb

 类似资料:
  • 我的数据库中有两个表。一个表包含有关用户的信息,而另一个表包含有关预订的数据。当用户进行预订时,userid将被放置在预订表中。现在,我想展示一张用户的照片,其中包括预订的备注和日期,但是照片在users表中。 这是我的两张桌子: null null

  • 我想将一些通用功能外包给一个模块中的多个笔记本电脑(也用于测试目的)。当前目录结构如下所示 在中,有一个简单的函数 然而,当我想导入和使用在通过使用(我认为有意义的) 我得到一个。我做错了什么?我正在使用Python 3.9。

  • 问题内容: 我正在寻找一个SQL查询来选择所有未由同一表上的另一个查询选择的记录。具体来说,我想选择所有具有特定字段(’fieldA’)重复项的记录,然后删除除其中一个记录以外的所有记录。 因此,一条select语句可能类似于以下内容(不起作用!): 如果不可能进行单个查询,那么最有效的解决方案是什么? 问题答案: 具体来说,我想选择所有具有特定字段(’fieldA’)重复项的记录,然后删除除其中

  • 问题内容: 我正在尝试查找一个表中的行,而不是另一个表中的行,这两个表都在不同的数据库中,并且在我要用来匹配的列上也有不同的列名。 我有一个查询,下面的代码,我认为它可能有效,但是速度太慢: 因此查询尝试执行以下操作: 从R2R.partmaster数据库中选择wpsapi4.product_details数据库中没有的所有ID。我匹配的列是partmaster.id和product_detail

  • 问题内容: 如何使用JOIN从一个表中选择所有列,从另一个表中仅选择一些列?在MySQL中。 问题答案: 只需使用表名: 这将选择所有列和列和从。

  • 非常感谢任何帮助。 编辑:我不敢相信我居然要明确声明我不想复制粘贴它。