Agregando belleza e interactividad a los cuadernos Jupyter

Muchas personas usan los cuadernos Jupyter en su trabajo. Pero con la creciente complejidad del proyecto, aparecen problemas. Las celdas aparecen en el cuaderno con marcas rojas para sí mismo: "indicar un número antes de comenzar ..." o "establecer el número de iteraciones en función de ...". Se obtiene algún tipo de reversión a la línea de comando.

Y la salida de datos a la pantalla no siempre se percibe sin una explicación por parte de un extraño que está acostumbrado a bellas tablas, imágenes y otros elementos de interfaz modernos.

Por ejemplo, tenemos datos sobre el área de ciudades y población. Los mostramos en la "forma tradicional":

tabledata = [["", 2561, 12615882], ["-", 1439, 5383890], ["", 205, 609828], ["", 383, 1321473]] tabledata 

Vemos en un cuaderno:

 [['', 2561, 12615882], ['-', 1439, 5383890], ['', 205, 609828], ['', 383, 1321473]] 

A una persona moderna y malcriada no siempre le gusta este formato de visualización. Es necesario llevar los datos a una forma tabular más familiar.

Puedes usar la amplia biblioteca de pandas

 import pandas as pd pd.DataFrame(tabledata, columns=[""," (. )", " ()"]) 



Si por alguna razón el uso de pandas no le conviene, puede usar otra biblioteca o escribir su propia función.

Considere una de estas bibliotecas: tabular (https://pypi.org/project/tabulate/)
Para instalar, ejecute pip install tabulate desde la línea de comando

 from IPython.display import HTML, display from tabulate import tabulate display(HTML(tabulate(tabledata, tablefmt='html'))) 



Puede mostrar los datos en forma "pseudográfica".

 print(tabulate(tabledata)) 


Puedes agregar encabezados

 print(tabulate(tabledata, headers=[""," (. )", " ()"])) 


E índices

 display(HTML(tabulate(tabledata, headers=[""," (. )", " ()"], tablefmt='html', showindex="always"))) 


tabulate le permite obtener visualmente el mismo resultado que los pandas.

Puede escribir su propia función, que luego obtendrá funciones adicionales.

 from IPython.display import HTML, display def dataToTable(data, columns = None): if len(data) == 0 : display(HTML('<b> </b>')) return hdr = '' if columns != None: for col in columns: #    hdr = hdr + '<th>' + col + '</th>' hdr = '<tr>' + hdr + '</tr>' dt = '' for row in data: #      dt = dt + '<tr>' for cell in row: #     dt = dt + '<td>' + str(cell) + '</td>' dt = dt + '</tr>' display(HTML('<table>' + hdr + dt + '</table>')) #     dataToTable(tabledata, columns=[""," (. )", " ()"]) 



Salida de imagen


Estamos acostumbrados a pictogramas e íconos. Incluso en el pronóstico del tiempo, vemos imágenes con soles y nubes. Para agregar imágenes a nuestros programas, puede usar la biblioteca IPython. Su función de imagen le permite trabajar con imágenes (PNG / JPEG / GIF) ubicadas tanto localmente como en recursos de Internet. Establece sus tamaños.

La descripción de la biblioteca está aquí ipython.readthedocs.io/en/stable/api/generated/IPython.display.html?highlight=display#IPython.display.Image

 from IPython.display import Image #     display(Image(url='https://habrastorage.org/webt/9m/2c/zd/9m2czdt-uv7oe6v-nws3frtw7-a.jpeg', width = 200) #    ) # display(Image(filename='Python_royal_35.JPG', width = 200)) #   

Admira la pitón:

imagen

Decora el texto


Por supuesto, puede generar HTML directamente utilizando todas sus funciones:

 from IPython.core.display import display, HTML display(HTML("<font color='green'>  </font>")) 



O puede usar la biblioteca termcolor. Permite, sin profundizar en HTML, establecer el color del texto y el fondo, establecer los atributos de fuente. Descripción de la biblioteca aquí: pypi.org/project/termcolor

 from termcolor import colored #       pip install termcolor print(colored("  ( )", "red")) print(colored("  ()", "red", attrs=["underline"])) print(colored("     ( )", "green", "on_red" )) print(colored("     (bold)", "green", "on_red", attrs=["bold"])) 



Mostramos el progreso de la tarea.


A nadie le gusta seguir el progreso de una tarea larga sin comprender qué parte del trabajo ya se ha completado.



Ver cuánto queda es mucho mejor (sí, sí, sé que la velocidad del "gusano" puede variar).



Descripción de la biblioteca aquí: ipywidgets.readthedocs.io

Usa los comandos para instalar

 pip install ipywidgets jupyter nbextension enable --py widgetsnbextension 

 from ipywidgets import IntProgress from IPython.display import display import time prgBar = IntProgress(min = 0, max = 100) #   display(prgBar) #     while prgBar.value < prgBar.max: #       -   prgBar.value = prgBar.value + 1 #  "" time.sleep(0.1) print(' ') 



Interacción interactiva del usuario


La misma biblioteca de ipywidgets permite no solo mostrar, sino también ingresar información.

El ejemplo más simple de interacción con el usuario es la reacción a un clic de botón. La biblioteca ipywidgets le permite crear un botón con los parámetros dados (texto, estilo y tamaño) y asignar una función de controlador para presionarlo.

 from IPython.display import display from ipywidgets import Button #      button1 = Button(description=" !", button_style='success' # 'success', 'info', 'warning', 'danger', '' ) def on_button_clicked(b): #    print("") button1.on_click(on_button_clicked) #      "on_click" display(button1) #   



El tamaño del botón se establece utilizando la propiedad de diseño

 from IPython.display import display from ipywidgets import Button, Layout button2 = Button(description='   ', button_style='success', layout=Layout(width='50%', height='80px')) display(button2) 



Para la entrada conveniente de números y fechas por parte del usuario, hay componentes FloatSlider y DatePicker.

Para obtener el valor ingresado, use la propiedad <componente> .value

Para captar el momento de cambio de valores, es necesario usar Event Observe

 from IPython.display import display from ipywidgets import FloatSlider fSlider = FloatSlider( value=7.5, #   min=0, #  max=10.0, #  step=0.1, #   description=':', continuous_update=False, # True -  observe        orientation='horizontal' #     ) def on_value_change(b): print(b['old'], '->', b['new']) fSlider.observe(on_value_change, names='value') display(fSlider) 



Verifique el acceso al valor actual:

 fSlider.value 

Calendario interactivo:

 from IPython.display import display from ipywidgets import DatePicker dPicker = DatePicker( description=':' ) def on_button_clicked(b): print(b['old'], '->', b['new']) dPicker.observe(on_button_clicked, names='value') display(dPicker) 



Para seleccionar un valor de varias opciones, hay una lista de RadioButtons, una lista desplegable desplegable y un grupo de botones ToggleButtons. valor y observar se usan de la misma manera para estos componentes.

Los valores se pueden especificar como una lista de valores de cadena o como una lista de tuplas.

Probemos con la opción más simple, con valores en forma de una lista de cadenas.

 from IPython.display import display from ipywidgets import RadioButtons rButtons1 = RadioButtons( options=['', '', ''], value='', #    description=':' ) def on_button_clicked(b): print(b['old'], '->', b['new']) rButtons1.observe(on_button_clicked, names='value') display(rButtons1) 



Mostramos el valor:

 rButtons1.value 
En este modo, el valor de rButtons1.value es una cadena.

Intentamos la segunda opción de establecer la lista de valores:

 from IPython.display import display from ipywidgets import RadioButtons rButtons2 = RadioButtons( options=[('', 1), ('', 2), ('', 3)], value=2, #    description=':' ) def on_button_clicked(b): print(b['old'], '->', b['new']) rButtons2.observe(on_button_clicked, names='value') display(rButtons2) 



En este modo, el valor de rButtons2.value es el número correspondiente al valor seleccionado.

La lista desplegable funciona de la misma manera

 from IPython.display import display from ipywidgets import Dropdown dropdown1 = Dropdown( options=[('', 1), ('', 2), ('', 3)], value=2, #    description=':' ) def on_button_clicked(b): print(b['old'], '->', b['new']) dropdown1.observe(on_button_clicked, names='value') display(dropdown1) 



Puede usar Checkbox y ToggleButton para ingresar valores booleanos. Tienen valor y observan ya familiares para nosotros.

 from IPython.display import display from ipywidgets import Checkbox cb1 = Checkbox( value=False, description='' ) def on_button_clicked(b): print(cb1.value) cb1.observe(on_button_clicked, names='value') display(cb1) 



 from IPython.display import display from ipywidgets import ToggleButton tb1 = ToggleButton( value=False, description=' ', disabled=False, button_style='success', # 'success', 'info', 'warning', 'danger' or '' tooltip=' ', icon='check' ) tb2 = ToggleButton( value=True, description='  ', disabled=False, button_style='success', # 'success', 'info', 'warning', 'danger' or '' tooltip=' ', icon='check' ) display(tb1, tb2) 



Para ingresar texto multilínea, se utiliza el componente Textarea.

 from IPython.display import display from ipywidgets import Textarea, Layout Textarea1 = Textarea( value=', Habr!', placeholder=' ', description=':', layout=Layout(width='600px', height='100px') ) display(Textarea1) 



AI (deleites de interfaz)


Cuando hay demasiados elementos de interfaz, quiero seguir el camino de las aplicaciones de escritorio y combinar elementos individuales en grupos separados.

Para esto, Acordeón y Tab son útiles.

 from IPython.display import display from ipywidgets import Accordion, IntSlider, Text accordion = Accordion(children=[IntSlider(value=42), Text(value=' ')]) accordion.set_title(0, ' 1') accordion.set_title(1, ' 2') display(accordion) 



 from IPython.display import display from ipywidgets import Tab, IntSlider, Text tab = Tab() tab.children = [IntSlider(value=42), Text(value=' ')] tab.set_title(0, ' 1') tab.set_title(1, ' 2') display(tab) 



La biblioteca ipywidgets no se limita a los elementos que he enumerado. Todavía tiene muchas cosas útiles que pueden hacer que los programas en Jupyter Notebooks sean más atractivos.

Mira aqui

Source: https://habr.com/ru/post/485318/


All Articles