Saltar al contenido

Convirtiendo un Jupyter notebook a una hoja de cálculos de excel

A veces, llamadme raro, hace falta compartir cierta información en una hoja de cálculos de excel. Podríamos hacerlo de varias formas, entre ellas la que os conté en este tutorial.

Hoy os voy a contar una forma mucho más rápida pero también mucho menos flexible y mucho más limitada. A pesar de sus limitaciones os puede resultar útil en alguna ocasión.

Para poder hacerlo vamos a usar una biblioteca llamada nb2xls. Esta biblioteca nos permite convertir partes de un notebook de jupyter a un fichero en formato xlsx. Para sacarle el mejor provecho es mejor usarlo en combinación con pandas y con matplotlib.

¿Qué necesitaremos?

Antes de nada deberías crear un entorno virtual, activarlo e instalar en el mismo las siguientes bibliotecas:

  • nb2xls, matplotlib, pandas, notebook

Con pip sería:

python -m venv env

. env/bin/activate # en linux

env\\Scripts\\activate # en windows

pip install nb2xls matplotlib pandas notebook

Creamos un notebook

Una vez que tenemos lo anterior instalado podemos crear un notebook y partes de ese notebook las podremos transformar a un fichero xlsx.

¿Qué partes?

  • Podemos meter el resultado de un dataframe de pandas.
  • Podemos introducir la mayor parte de las celdas markdown.
  • Podemos meter los gráficos de matplotlib.
  • Podemos meter los outputs de las celdas de código.

Las celdas de código no se incluirán en el fichero xlsx final.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

Creo un array de numpy.

arr = np.random.randn(100)

Si lo represento usando un print no será excesivamente útil en el fichero xlsx:

print(arr)

Lo anterior mostraría:

[-1.8157311  -1.27558769 -0.06253071  0.5727964   1.30630469  1.08803057
 -1.7177225  -1.36881843 -0.23638803  0.23159165  1.09267723 -0.08126374
 -0.07882755 -0.40860606 -2.0705095   0.15439949  0.23663362 -0.7635711
  0.27727368 -0.43289471 -0.43487002 -0.59510541 -1.61384905 -1.43530026
 -1.94543496  0.42889961 -0.86562944  2.01226673  0.98441569  0.50848892
 -0.11691626  1.41794054 -1.45541757 -2.0267377   0.18223197  0.58813359
 -1.20258993 -1.57937287 -0.41343513 -1.24794634 -1.31172714 -0.89826742
 -0.8876701   0.3974815   0.16738706  0.38529175 -0.79832576 -1.37493628
  0.75127374 -0.19815485 -0.41694914  0.07297376 -1.62350541  0.3347684
  0.07764042  2.7355323   1.76739931  0.51577402 -1.33059637 -2.06942237
 -1.21803375 -0.80720848 -0.11531321 -2.1383894   0.41116981  0.41250127
 -0.6830473  -0.45150891  1.78112687 -1.70066494  0.36702584  0.64781121
  0.70477664  2.18133062  1.16217676 -0.32638642  1.65629318 -0.08678048
 -1.32953833 -1.48715397  0.54229424 -1.42262635  0.53609583  1.1338144
 -0.49349254  0.35298437  0.17413675 -0.56634503 -0.40203896  0.01900088
  1.00043729  1.3735901   2.01309634 -1.94554835  0.24991938 -0.86161051
  0.0753578   0.09038729 -0.94541639 -1.89972808]

Si meto la anterior información en un DataFrame y lo muestro usando un print seguirá sin ser muy útil en el fichero xlsx:

df = pd.DataFrame({'random': arr})
print(df)

Mostrará:

      random
0  -1.815731
1  -1.275588
2  -0.062531
3   0.572796
4   1.306305
..       ...
95 -0.861611
96  0.075358
97  0.090387
98 -0.945416
99 -1.899728

[100 rows x 1 columns]

Para que se copie correctamente en celdas del fichero xlsx hemos de usar la representación más rica del notebook (que usa _repr_html internamente):

df

Lo anterior mostrará el DataFrame como una tabla HTML:

random
0-1.815731
1-1.275588
2-0.062531
30.572796
41.306305
95-0.861611
960.075358
970.090387
98-0.945416
99-1.899728

100 rows × 1 columns

Si represento lo anterior en un gráfico lo puedo hacer así:

df.plot()

Se verá la gráfica:

Si lo anterior que hemos escrito en este artículo formase parte de un notebook al haber instalado nb2xls tendríamos una nueva opción para convertirlo en fichero xlsx desde el propio notebook (mira la parte inferior del menú):

El resultado sería algo parecido a:

Si vemos con un poco más de detalle la parte final con el DataFrame y el gráfico de matplotlib se vería así:

Otra opción interesante es que podemos obtener el notebook transformado en fichero xlsx usando nbconvert ya que al instalar nb2xls nos añade un nuevo exportador para nbconvert. Si tenemos muchos notebooks a transformar esta sería la forma ideal de hacerlo.

Como véis, el resultado no es muy espectacular y está un pelín limitado pero os puede salvar en algún momento.

Espero que a alguien le pueda resultar útil.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

sixty one + = 66

Pybonacci