Con la Data Science possiamo ottenere informazioni e conoscenza estremamente rilevanti per il business, ma spesso il problema consiste nel riuscire a condividere queste informazioni in modo efficace, in particolare se il destinatario non è uno specialista dei dati, permettendo la visualizzazione e la manipolazione dei dati con ordinamenti, drill-down e differenti correlazioni.

Il data scientist usa spesso strumenti che ruotano attorno al linguaggio Python, come Numpy, Pandas, scikit-learn e tante altre librerie che sono ormai uno standard nell’analisi ed esplorazione dei dati e dell’intelligenza artificiale. Se volessimo condividere tali risultati via web, Python potrebbe essere l’ideale per la logica di backend, ma non per la visualizzazione lato client.

Post_FB_Maggi_320x320_LSWRCome è possibile quindi creare applicazioni web per un progetto di data science costruito con Python e le sue librerie? Come creare visualizzazioni comprensibili dai colleghi meno tecnici, sfruttando il più possibile le proprie competenze di Python?

Ecco che entra in gioco Streamlit, un framework che si sta facendo sempre più spazio nel settore, proponendosi come strumento di visualizzazione ed esplorazione utilissimo per ogni data scientist pythonista.

Streamlit permette di creare con pochissimo dispendio di codice applicazioni web leggere, autonome e complete che permettono di:

  • impiegare Python anche nella gestione dell’interfaccia;
  • integrare ogni libreria Python che si conosca costituendo in tutto e per tutto un completo runtime per questo linguaggio;
  • stabilire possibilità di interazione dinamica con gli utenti grazie ad una libreria di controlli visuali. Inoltre, se uno di tali widget dovesse portare alla modifica di qualche parametro che ha condizionato il rendering dell’interfaccia quest’ultima verrebbe aggiornata in tempo praticamente reale.

Le creazioni che produrremo con Streamlit sono essenzialmente data app ovvero applicazioni, snelle e particolarmente fruibili, che ruotano attorno ai dati. Tuttavia, la ricchezza di componenti di questo framework non renderebbe affatto impossibile il suo impiego nella realizzazione di applicazioni web in Python non necessariamente datacentriche

Altro fattore da considerare – prima di passare alla conoscenza pratica di Streamlit – è la possibilità che offre di impiegare anche in campo web conoscenze Python senza dover ricorrere a tecnologie lato client come HTML, CSS e Javascript: vantaggio non da poco sia per i programmatori sia per le aziende che dovrebbero reperire le necessarie risorse umane.

Tutorial: iniziare a usare Streamlit

Se ci si volesse fare un’idea molto rapida di ciò che può essere realizzato con questa libreria se ne potrebbe consultare la gallery di esempi di cui uno scorcio è visibile nella figura che segue.

202201-Streamlit_img02

Come si può vedere, ogni esempio è focalizzato su uno scopo specifico e mostra link che conducono ad una demo dell’applicazione e al codice con cui è stata realizzata.

Per iniziare ad utilizzare Streamlit è sufficiente installare la libreria – si può procedere con pip, il tipico ma non unico gestore di pacchetti del mondo Python – il che richiede un solo comando:

pip install streamlit

meglio ancora se incluso in un virtual environment che permette di approntare ambienti operativi coerenti e ben organizzati senza intasare la propria macchina.

Per scrivere uno script che dia vita ad una data app con Streamlit è sufficiente:

  • importare la libreria con:
import streamlit as st
  • utilizzare i comandi di streamlit per emettere in output controlli web, grafici, tabelle ed altro. Tutto il resto del codice servirà come una sorta di backend per impostare il necessario affinché la data app abbia il materiale su cui lavorare.

Hello world con Streamlit

Se volessimo realizzare il classico Hello world per Streamlit ci basterebbe impostare:

import streamlit as st

st.write('Hello world!')

dove write è il metodo che stampa del testo in ouput. L’avvio dello script passerebbe per un comando da impartire via terminale (prompt, shell o qualunque nome abbia nel proprio sistema operativo):

streamlit run hello.py

(dove hello.py è il nome del nostro file).

Il risultato sarebbe un output di questo tipo:

You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501

  Network URL: http://192.168.1.152:8501

che ci avviserebbe degli indirizzi web su cui la nostra data app è immediatamente raggiungibile: in questo caso sulla porta 8501/TCP. In genere non sarà necessario aprire il browser in quanto questo verrà immediatamente richiamato in automatico.

Formattazione degli output Streamlit con markdown

È interessante notare come nella stringa fornita al metodo write sia possibile passare della formattazione markdown (codifica molto sintetica, alternativa ad HTML, per la pubblicazione di contenuti su pagine web).

Ad esempio, potremmo avere la parola “world” in grassetto con:

st.write('Hello **world**!')

oppure un titolo molto grande (equivalente ad un tag HTML <h1>) con:

st.write('# Hello world!')

sebbene quest’ultimo caso possa essere reso con il metodo title di Streamlit.

Streamlit: aggiornamento dell’app web

Alla prima esecuzione di Streamlit è già possibile notare in alto a destra un hamburger menu (tre linee orizzontali) che, una volta aperto, mostra una serie di comandi tra cui il Rerun che può essere usato per riavviare la data app dopo aver apportato modifiche al codice.

202201-Streamlit_img03

Tra l’altro, passando per la seconda voce, Settings, è possibile richiedere un continuo aggiornamento dell’app ad ogni salvataggio di codice. Tale menu è un aiuto importante per il programmatore ma si consideri che può essere eliminato in occasione della messa in produzione.

Passiamo ora ad un esempio più corposo che coinvolga una regina della Data Science: Pandas.

Streamlit e Pandas insieme

Pandas è una libreria Python che permette la manipolazione e l’analisi dei dati permettendo di creare direttamente tabelle e serie temporali (qui le diverse opzioni per l’installazione di Pandas)

Supponiamo di voler mostrare un elenco di atleti con un’età distribuita tra i 14 ed i 21 anni. Diciamo inoltre di voler il tutto visibile su un’applicazione web con dei radio button in grado di farci scegliere se mostrare solo i maggiorenni, solo i minorenni o entrambi i gruppi.

Con Streamlit si potrebbe fare così:

# importiamo le librerie necessarie
import streamlit as st
import pandas as pd

# preparazione del DataFrame
data = {'Cognome': ['Rossi','Verdi','Gialli','Bianchi','Azzurri','Arancioni','Celesti','Marroni'],'Nome': ['Giulio','Andrea','Silvia','Alessio','Sandra','Michela','Lorenzo','Roberto'], 'Citta': ['Roma','Napoli','Torino','Milano','Roma','Napoli','Torino','Milano'],'Eta': [14,15,18,19,20,21,16,18]}
df = pd.DataFrame(data)
# Fine preparazione del DataFrame

selezione = st.radio(
    "Visualizzazione atleti:",
    ('Tutti', 'Solo maggiorenni', 'Solo minorenni'))

# interfaccia web
if selezione == 'Solo maggiorenni':
    st.dataframe(df[df.Eta>=18])
elif selezione == 'Solo minorenni':
    st.dataframe(df[df.Eta<18])
else:
    st.dataframe(df)

Abbiamo preparato un DataFrame con dati fittizi ma si noti che la sua pubblicazione con Streamlit è costata solo le ultime poche righe di codice. Infatti, la libreria comprende il metodo dataframe, finalizzato a mostrare dati in forma tabellare.

202201-Streamlit_img04

I radio button sono stati pubblicati con:

selezione = st.radio(
    "Visualizzazione atleti:",
    ('Tutti', 'Solo maggiorenni', 'Solo minorenni'))

Notiamo subito l’essenzialità della struttura: il valore selezionato andrà a popolare la variabile selezione e consisterà nell’etichetta stessa che dà nome al pulsante.

Ogni volta che interagiamo con un controllo, l’intera interfaccia utente viene ripercorsa e aggiornata infatti segue un blocco if che specifica come filtrare i dati del DataFrame in base alla selezione fatta. Questo determinerà il contenuto della tabella:

if selezione == 'Solo maggiorenni':
    st.dataframe(df[df.Eta>=18])
elif selezione == 'Solo minorenni':
    st.dataframe(df[df.Eta<18])
else:
    st.dataframe(df)

Controlli di questo tipo posti così in vista però potrebbero non essere graditi pertanto potremmo sfruttare un’utilissima barra laterale che Streamlit mette sempre a disposizione.

Non utilizzando st.radio bensì st.sidebar.radio – in maniera quasi magica potremmo dire – i controlli si sposteranno nella barra laterale a scomparsa:

202201-Streamlit_img05

Streamlit si è quindi rivelato uno strumento estremamente utile se si cerca un modo rapido, gradevole e totalmente pythonico per realizzare applicazioni web attorno ai nostri dati.

Certamente, non sarà lo strumento ideale di web designer e programmatori che vorranno sfruttare e regolare ogni aspetto dell’interfaccia grafica ma, nell’ambito dell’analisi dati e dell’Intelligenza Artificiale attraverso applicazioni web, magari pubblicate sulla intranet, Streamlit ha un grandissimo valore come “braccio web” del data scientist.