Выборочный импорт из другого ноутбука Jupyter - PullRequest
0 голосов
/ 23 января 2019

Я расположил свои блокноты Jupyter в: data.ipynb, methods.ipynb и results.ipynb. Как можно выборочно импортировать ячейки из данных и методов записных книжек для использования в результатах записной книжке?

Я знаю nbimporter и ipynb, но ни один из них не предлагает выборочный импорт переменных. Существует возможность импортировать определения, в том числе переменные в верхнем регистре, но это не работает для меня, поскольку мне пришлось бы преобразовать большинство переменных в моих записных книжках в верхний регистр.

Я бы предпочел импортировать все, кроме двух или трех ячеек, для оценки которых требуется много времени. В идеале я хотел бы отложить выполнение некоторых заданий до того момента, когда я получу к ним доступ (ленивая оценка) - но я понимаю, что это может быть трудно реализовать.

Вот обзор в псевдокоде (каждая строка соответствует ячейке):

data.ipynb

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

methods.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

results.ipynb

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

Мотивация заключается в том, что мои настоящие данные и методы записные книжки:

  • намного длиннее и сложнее, поэтому я хочу использовать систему импорта
  • есть только пара ячеек, для оценки которых требуется больше секунды

записная книжка также не может быть заменена файлом methods.py. На самом деле, у меня есть такой файл, который содержит детали реализации моего метода. Записная книжка - это больше место для указания параметров по умолчанию, демонстрации работы моего метода и объяснения результатов примера.

Этот вопрос по сути является комбинацией:

Я прочитал ответы на оба вопроса, и никто не удовлетворил мои требования.

В моем ответе ниже я представляю свое решение, которое использует магию ячейки и патчирование обезьян. Однако я бы предпочел решение, которое позволяет указать, какие ячейки / выражения исключать / включать не в блокноте происхождения (например, 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 Ответ

0 голосов
/ 23 января 2019

До сих пор я исправлял обезьяны nbimporter и выбирал ячейки, которые нужно исключить, используя магию клеток:

from IPython.core import magic

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

Код, используемый для обезьяны-патча для удаления клеток:

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

И фактический пример, data.ipynb:

data.ipynb

И methods.ipynb (предназначено исключение в конце - это означает успех!):

methods.ipynb

Редактировать : я опубликовал приведенный выше код как часть jupyter-helpers некоторое время назад. Используя этот пакет, нужно просто импортировать импортер в импортирующую записную книжку:

from jupyter_helpers.selective_import import notebooks_importer 

и клеточную магию можно импортировать в импортированную записную книжку с помощью:

from jupyter_helpers.selective_import import skip_on_import

Вот пример импортированной записной книжки: Data.ipynb и пример импортированной записной книжки: Results.ipynb

...