Программно добавлять ячейки в блокнот ipython для генерации отчетов - программирование
Подтвердить что ты не робот

Программно добавлять ячейки в блокнот ipython для генерации отчетов

Я видел несколько разговоров разработчиков iPython о том, как конвертировать ipython-ноутбук в сообщение в блоге, PDF или даже к целая книга (~ мин. 43). Преобразователь PDF-to-X интерпретирует ячейки iPython, которые написаны в методе уценки или кода, и выплескивает только отформатированный документ за один шаг.

Моя проблема в том, что я хотел бы создать большой документ, в котором многие из рисунков и разделов программно сгенерированы - что-то вроде this. Чтобы это работало в iPython с использованием вышеприведенных методов, мне нужно было бы написать функцию, которая будет писать другие iPython-Code-Blocks. Существует ли эта возможность?

#some pseudocode to give an idea
for variable in list:
    image = make_image(variable)
    write_iPython_Markdown_Cell(variable)
    write_iPython_Image_cell(image)

Я думаю, что это может быть полезно, поэтому мне интересно, если:

  • создание iPython ячеек через iPython возможно
  • Если есть причина, что это плохая идея, и я должен придерживаться "классического" решения, такого как библиотека шаблонов (Jinja).

спасибо, zach cp

EDIT: По предложению Томаса я разместил в список рассылки ipython и получил некоторую обратную связь о возможности этой идеи. Короче говоря, есть некоторые технические трудности, которые делают эту идею менее идеальной для оригинальной идеи. Для повторяющегося отчета, в котором вы хотели бы генерировать метки-метки и соответствующие изображения/таблицы, сложно работать через ядро ​​/браузер ipython, чем создавать отчет напрямую с помощью системы шаблонов, таких как Jinja.

4b9b3361

Ответ 1

Здесь есть блокнот Fernando Perez здесь, который демонстрирует, как программно создавать новые ячейки. Обратите внимание, что вы также можете передавать метаданные, поэтому, если вы создаете отчет и хотите превратить ноутбук в слайд-шоу, вы можете легко указать, должна ли ячейка быть слайдом, суб-слайдом, фрагментом и т.д.

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

from IPython.nbformat import current as nbf

nb = nbf.new_notebook()

cells = []

for var in my_list:
    # Assume make_image() saves an image to file and returns the filename
    image_file = make_image(var)
    text = "Variable: %s\n![image](%s)" % (var, image_file)
    cell = nbf.new_text_cell('markdown', text)
    cells.append(cell)

nb['worksheets'].append(nbf.new_worksheet(cells=cells))

with open('my_notebook.ipynb', 'w') as f:
        nbf.write(nb, f, 'ipynb')

Ответ 2

Я не буду судить, хорошая ли это идея, но если вы вызовете get_ipython().set_next_input(s) в записной книжке, она создаст новую ячейку со строкой s. Это то, что IPython использует внутри своих команд %load и %recall.

Ответ 3

Использование магии может быть другим решением. например

get_ipython().run_cell_magic(u'HTML', u'', u'<font color=red>heffffo</font>')

Теперь, когда вы можете программно генерировать HTML-код в ячейке, вы можете форматировать любым способом по своему усмотрению. Изображения, конечно, поддерживаются. Если вы хотите повторно генерировать выходные данные для нескольких ячеек, просто выполните несколько из них, чтобы строка была замещающей.

p.s. У меня когда-то была эта потребность и я достиг этой темы. В то время я хотел отобразить таблицу (а не ascii-вывод списков и кортежей). Позже я нашел, что pandas.DataFrame поразительно подходит для моей работы. Он автоматически генерирует таблицы в формате HTML.

Ответ 4

Обратите внимание, что принятый ответ Tal немного устарел и становится более устаревшим: в ipython v3 вы можете (/should) импортировать nbformat напрямую, а после этого вам нужно указать, какую версию ноутбука вы хотите создать.

Итак,

from IPython.nbformat import current as nbf

становится

from nbformat import current as nbf

становится

from nbformat import v4 as nbf

Однако в этой окончательной версии совместимость ломается, потому что метод write находится в родительском модуле nbformat, где все остальные методы, используемые Фернандо Пересом, находятся в модуле v4, хотя некоторые из них находятся под разными именами (например, new_text_cell('markdown', source) становится new_markdown_cell(source)).

Здесь приведен пример использования v3: см. generate_examples.py для кода и plotstyles.ipynb для вывода. IPython 4 на момент написания статьи настолько новый, что использование веб-интерфейса и нажатие "нового ноутбука" по-прежнему выпускает ноутбук v3.

Ответ 5

Вы можете использовать Shift + Enter вместо Ctrl + Enter, если вы хотите запустить ячейку.

Shift + Enter автоматически сгенерирует новую ячейку.