Hinzufügen von Schönheit und Interaktivität zu Jupyter Notebooks

Viele Menschen verwenden Jupyter-Notizbücher bei ihrer Arbeit. Mit der zunehmenden Komplexität des Projekts treten jedoch Probleme auf. Zellen erscheinen im Notizbuch mit roten Markierungen für sich selbst: "Geben Sie eine Zahl vor dem Start an ..." oder "Legen Sie die Anzahl der Iterationen basierend auf ...". Es wird eine Art Rollback zur Befehlszeile durchgeführt.

Und die Ausgabe von Daten auf den Bildschirm wird nicht immer ohne Erklärung von einem Außenstehenden wahrgenommen, der an schöne Tabellen, Bilder und andere moderne Oberflächenelemente gewöhnt ist.

Zum Beispiel haben wir Daten zum Gebiet der Städte und der Bevölkerung. Wir zeigen sie in der "traditionellen Form":

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

In einem Notizbuch sehen wir:

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

Ein moderner, verwöhnter Mensch mag dieses Anzeigeformat nicht immer. Es ist notwendig, die Daten in eine bekanntere tabellarische Form zu bringen.

Sie können die weit verbreitete Pandabibliothek verwenden

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



Wenn Ihnen die Verwendung von Pandas aus irgendeinem Grund nicht zusagt, können Sie eine andere Bibliothek verwenden oder Ihre eigene Funktion schreiben.

Betrachten Sie eine dieser Bibliotheken - tabellarisch (https://pypi.org/project/tabulate/)
Führen Sie zur Installation pip install tabulate über die Befehlszeile aus

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



Sie können die Daten in einer "pseudografischen" Form anzeigen.

 print(tabulate(tabledata)) 


Sie können Header hinzufügen

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


Und Indizes

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


Mit tabulate erhalten Sie visuell das gleiche Ergebnis wie mit Pandas.

Sie können Ihre eigene Funktion schreiben, die dann zusätzliche Funktionen erhält.

 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=[""," (. )", " ()"]) 



Bildausgabe


Wir sind an Piktogramme und Symbole gewöhnt. Selbst in der Wettervorhersage sehen wir Bilder mit Sonnen und Wolken. Um Bilder zu unseren Programmen hinzuzufügen, können Sie die IPython-Bibliothek verwenden. Mit der Bildfunktion können Sie mit Bildern (PNG / JPEG / GIF) arbeiten, die sich sowohl lokal als auch im Internet befinden. Stellen Sie ihre Größen ein.

Die Beschreibung der Bibliothek finden Sie hier: 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)) #   

Bewundern Sie die Python:

Bild

Dekoriere den Text


Natürlich können Sie HTML mit all seinen Funktionen direkt generieren:

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



Oder Sie können die Termcolor-Bibliothek verwenden. Ohne sich mit HTML zu befassen, können Sie die Farbe des Texts und des Hintergrunds sowie die Schriftattribute festlegen. Beschreibung der Bibliothek hier - 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"])) 



Wir zeigen den Fortschritt der Aufgabe


Niemand mag es, den Fortschritt einer langen Aufgabe zu verfolgen, ohne zu verstehen, welcher Teil der Arbeit bereits abgeschlossen ist.



Zu sehen, wie viel übrig ist, ist viel schöner (ja, ja, ich weiß, dass die Geschwindigkeit des „Wurms“ variieren kann).



Beschreibung der Bibliothek hier - ipywidgets.readthedocs.io

Verwenden Sie die Befehle zum Installieren

 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(' ') 



Interaktive Benutzerinteraktion


Dieselbe ipywidgets-Bibliothek ermöglicht nicht nur das Anzeigen, sondern auch das Eingeben von Informationen.

Das wahrscheinlich einfachste Beispiel für eine Benutzerinteraktion ist die Reaktion auf einen Tastenklick. In der ipywidgets-Bibliothek können Sie eine Schaltfläche mit den angegebenen Parametern (Text, Stil und Größe) erstellen und eine Handlerfunktion zuweisen, um darauf zu drücken.

 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) #   



Die Größe der Schaltfläche wird über die Eigenschaft layout festgelegt

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



Für die bequeme Eingabe von Zahlen und Datumsangaben stehen FloatSlider- und DatePicker-Komponenten zur Verfügung.

Verwenden Sie die Eigenschaft <component> .value, um den eingegebenen Wert abzurufen

Um den Moment der Wertänderung zu erfassen, muss die Ereignisüberwachung verwendet werden

 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) 



Überprüfen Sie den Zugriff auf den aktuellen Wert:

 fSlider.value 

Interaktiver Kalender:

 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) 



Um einen Wert aus mehreren Optionen auszuwählen, gibt es eine RadioButtons-Liste, eine Dropdown-Dropdown-Liste und eine Gruppe von ToggleButtons-Schaltflächen. wert und beobachtung werden für diese komponenten in gleicher weise verwendet.

Werte können entweder als Liste von Zeichenfolgenwerten oder als Liste von Tupeln angegeben werden.

Versuchen wir die einfachste Option mit Werten in Form einer Liste von Zeichenfolgen.

 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) 



Wir zeigen den Wert an:

 rButtons1.value 
In diesem Modus ist der Wert von rButtons1.value eine Zeichenfolge.

Wir versuchen die zweite Möglichkeit, die Werteliste einzustellen:

 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) 



In diesem Modus ist der Wert von rButtons2.value die Zahl, die dem ausgewählten Wert entspricht.

Dropdown-Liste funktioniert genauso

 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) 



Mit Checkbox und ToggleButton können Sie boolesche Werte eingeben. Sie haben Wert und beobachten uns bereits vertraut.

 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) 



Zur Eingabe von mehrzeiligem Text wird die Textarea-Komponente verwendet.

 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 (Interface-Freuden)


Wenn es zu viele Oberflächenelemente gibt, möchte ich den Weg der Desktop-Anwendungen beschreiten und einzelne Elemente zu separaten Gruppen zusammenfassen.

Hierfür sind Akkordeon und Tab nützlich.

 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) 



Die ipywidgets-Bibliothek ist nicht auf die von mir aufgelisteten Elemente beschränkt. Es gibt noch viele nützliche Dinge, die Programme in Jupyter Notebooks attraktiver machen können.

Schau mal hier

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


All Articles