lab - Agregar celdas a un cuaderno de ipython mediante programación para la generación de informes
jupyter r (5)
A continuación se muestra el código de la función que cargará el contenido de un archivo y lo insertará en la siguiente celda del cuaderno:
from IPython.display import display_javascript
def make_cell(s):
text = s.replace(''/n'',''//n'').replace("/"", "///"").replace("''", "//'")
text2 = """var t_cell = IPython.notebook.get_selected_cell()
t_cell.set_text(''{}'');
var t_index = IPython.notebook.get_cells().indexOf(t_cell);
IPython.notebook.to_code(t_index);
IPython.notebook.get_cell(t_index).render();""".format(text)
display_javascript(text2, raw=True)
def insert_file(filename):
with open(filename, ''r'') as content_file:
content = content_file.read()
make_cell(content)
Ver detalles en mi blog.
He visto algunas de las charlas de los desarrolladores de iPython sobre cómo convertir un cuaderno de ipython en una publicación de blog, un pdf o incluso un libro completo (~ min 43). El convertidor de PDF a X interpreta las celdas iPython que están escritas en markdown o código y escupe un documento recién formateado en un solo paso.
Mi problema es que me gustaría generar un documento grande donde muchas de las figuras y secciones se generan mediante programación, algo como this . Para que esto funcione en iPython usando los métodos anteriores, necesitaría poder escribir una función que escribiera otros bloques de código de iPython. ¿Existe esta capacidad?
#some pseudocode to give an idea
for variable in list:
image = make_image(variable)
write_iPython_Markdown_Cell(variable)
write_iPython_Image_cell(image)
Creo que esto podría ser útil, así que me pregunto si:
- la generación de células iPython a través de iPython es posible
- Si hay una razón por la que esta es una mala idea y debería seguir una solución "clásica" como una biblioteca de plantillas (Jinja).
gracias zach cp
EDITAR: De acuerdo con la sugerencia de Thomas, publiqué en la lista de correo de ipython y obtuve algunos comentarios sobre la viabilidad de esta idea. En resumen, existen algunas dificultades técnicas que hacen que esta idea no sea ideal para la idea original. Para un informe repetitivo en el que le gustaría generar marcas de reducción (downdown) y las imágenes / tablas correspondientes, es complicado trabajar a través del kernel / navegador ipython que generar un informe directamente con un sistema de plantillas como Jinja.
Aquí hay una lista de notas de Fernando Pérez que demuestra cómo crear nuevas celdas mediante programación. Tenga en cuenta que también puede pasar metadatos, por lo que si está generando un informe y desea convertir el cuaderno en una presentación de diapositivas, puede indicar fácilmente si la celda debe ser una diapositiva, una sub-diapositiva, un fragmento, etc.
Puedes agregar cualquier tipo de celda, así que lo que quieres es sencillo ahora (aunque probablemente no lo fue cuando se hizo la pregunta). Por ejemplo, algo como esto (código no probado) debería funcionar:
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'')
No juzgaré si es una buena idea, pero si llama a get_ipython().set_next_input(s)
en el cuaderno, creará una nueva celda con la cadena s
. Esto es lo que IPython utiliza internamente para sus comandos %load
y %recall
.
Tenga en cuenta que la respuesta aceptada por Tal está un poco en desuso y se está desaprobando: en ipython v3 puede (/ debería) importar nbformat
directamente, y después de eso debe especificar qué versión de notebook desea crear.
Asi que,
from IPython.nbformat import current as nbf
se convierte en
from nbformat import current as nbf
se convierte en
from nbformat import v4 as nbf
Sin embargo , en esta versión final, la compatibilidad se rompe porque el método de write
está en el módulo principal nbformat
, donde todos los demás métodos utilizados por Fernando Pérez están en el módulo v4
, aunque algunos de ellos tienen nombres diferentes (por ejemplo, new_text_cell(''markdown'', source)
convierte en new_markdown_cell(source)
).
Here hay un ejemplo de la forma v3 de hacer las cosas: vea a plotstyles.ipynb
para el código y plotstyles.ipynb
para la salida. IPython 4 es, al momento de escribir, tan nuevo que el uso de la interfaz web y hacer clic en ''nueva notebook'' aún produce una notebook v3.
Usar la magia puede ser otra solución. p.ej
get_ipython().run_cell_magic(u''HTML'', u'''', u''<font color=red>heffffo</font>'')
Ahora que puede generar HTML en una celda programáticamente, puede formatear de la forma que desee. Las imágenes son por supuesto compatibles. Si desea generar repetidamente resultados en varias celdas, simplemente haga varios de los anteriores con la cadena para ser un marcador de posición.
ps una vez tuve esta necesidad y llegué a este hilo. Quería hacer una tabla (no la salida ascii de listas y tuplas) en ese momento. Más tarde encontré pandas.DataFrame
es increíblemente adecuado para mi trabajo. Genera tablas con formato HTML automáticamente.