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
depandas
. - 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 |
3 | 0.572796 |
4 | 1.306305 |
… | … |
95 | -0.861611 |
96 | 0.075358 |
97 | 0.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.