Я расположил свои блокноты 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
Все идеи будут оценены по достоинству!