Pandas e Bokeh: creare grafici interattivi

L'analisi dei dati richiede anche la graficazione di questi o dei risultati derivanti dalle analisi effettuate. Molte librerie in Python forniscono strumenti utili per la visualizzazione, ma i grafici prodotti sono statici. La libreria Pandas Bokeh è un'ottima alternativa per creare plot interattivi e includerli nei progetti web. Scopriamo come usarla e i risultati che possiamo ottenere mediante alcuni esempi.

Share

Condividi su facebook
Condividi su linkedin
Condividi su twitter
Condividi su email
Reading time: 8 minutes

La visualizzazione dei dati è uno degli aspetti fondamentali dell’analisi dei dati. Esplorare la natura dei dati e la loro distribuzione permette al data analyst di capire come analizzarli. Inoltre, la visualizzazione dei risultati di analisi permette di comunicare in modo immediato il risultato di analisi complesse. 

La scelta della libreria per visualizzare i dati e/o i risultati è a volte complicata. Infatti, esistono diverse librerie facili da usare ma che limitano l’interazione con i dati stessi. Altre, invece, permettono un interazione con i grafici ma la curva di apprendimento è alquanto ripida. Esistono però delle librerie open-source che risolvono in parte questo problema.

Abbiamo visto nell’articolo PandasGUI: Interfaccia grafica per analizzare i dati con Pandas come possiamo usare un tool per interagire con i dati tramite un interfaccia grafica. Se però vogliamo includere all’interno del nostro codice la generazione di grafici, bisogna utilizzare altre librerie.

In questo articolo, confronteremo la libreria pandas e pandas_boken. Analizzeremo la sintassi e i risultati ottenuti confrontando alcune tipologie di grafici disponibili. In particolare ci limiteremo a sei grafici base, ossia grafici a linee, grafici a barre, grafici a barre impilate, istogrammi, scatter e grafici a torta. L’obiettivo è rendere i grafici interattivi in modo tale che si possa sfruttare a pieno l’informazione che ci presentano.

Dataset

Esistono molti datasets pubblici con cui si possono testare questi tool. Ad esempio, su Kaggle si possono scaricare gratuitamente dataset che coprono diversi ambiti, dai dati finanziari a quelli relativi al meteo. Esistono poi diversi repository che forniscono i cosiddetti open data, ossia dati gratuiti pubblicati online.  

In questo tutorial useremo gli open data relativi ai casi del COVID-19 in Italia disponibili qui. Non faremo un’analisi di quei dati, ma li useremo solo per mostrare le funzionalità delle librerie. In particolare, useremo i dati sull’andamento nazionale e ci concentreremo solo sui dati delle ospedalizzazioni. Potete scaricare il dataset qui.

Prima di installare la libreria consigliamo di crearvi il vostro ambiente di sviluppo. Per farlo potete semplicemente usare pipenv. In questo modo installerete solo le librerie necessarie per il vostro progetto in un workspace dedicato e non a livello di sistema operativo. Pertanto dopo aver creato il vostro workspace con pipenv shell, potete procedere con l’installazione di Pandas e Pandas_bokeh. I comandi sono i seguenti.

# from PyPi
pip install pandas-bokeh

# with Conda
conda install -c patrikhlobil pandas-bokeh 

A questo punto possiamo importare le librerie e il dataset necessari.

# Importing required modules
import pandas as pd
import pandas_bokeh
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# Reading in the data
data = pd.read_csv('covid.csv',parse_dates=["data"],index_col='data')
data.head() 

Con l’ultimo comando possiamo vedere il DataFrame letto dal file csv. Come si può notare ci sono 23 colonne (attributi) per ogni data. Per semplificare selezioniamo solo i dati relativi alle ospedalizzazioni, ossia le colonne ricoverati_con_sintomi e terapia_intensiva. Inoltre, per avere meno punti da visualizzare possiamo ricampionare i dati della serie temporale mediante il comando resample() di pandas. Di seguito riportiamo i comandi e gli output ottenuti.

Out[1]:
stato  ricoverati_con_sintomi  terapia_intensiva  ...  totale_positivi_test_antigenico_rapido  tamponi_test_molecolare  tamponi_test_antigenico_rapido
data                                                                  ...                                                                                                 
2020-02-24 18:00:00   ITA                     101                 26  ...                                     NaN                      NaN                             NaN
2020-02-25 18:00:00   ITA                     114                 35  ...                                     NaN                      NaN                             NaN
2020-02-26 18:00:00   ITA                     128                 36  ...                                     NaN                      NaN                             NaN
2020-02-27 18:00:00   ITA                     248                 56  ...                                     NaN                      NaN                             NaN
2020-02-28 18:00:00   ITA                     345                 64  ...                                     NaN                      NaN                             NaN

[5 rows x 23 columns]


data = data[['ricoverati_con_sintomi', 'terapia_intensiva']]

In [2]: data.head()
Out[2]: 
                     ricoverati_con_sintomi  terapia_intensiva
data                                                          
2020-02-24 18:00:00                     101                 26
2020-02-25 18:00:00                     114                 35
2020-02-26 18:00:00                     128                 36
2020-02-27 18:00:00                     248                 56
2020-02-28 18:00:00                     345                 64

In [3]: data_resample = data.resample(rule='M').mean()

In [4]: data_resample
Out[4]: 
            ricoverati_con_sintomi  terapia_intensiva
data                                                 
2020-02-29              222.833333          53.666667
2020-03-31            12762.612903        1985.645161
2020-04-30            25565.800000        2975.466667
2020-05-31            11501.645161         882.516129
2020-06-30             3353.800000         207.433333
2020-07-31              808.741935          57.870968
2020-08-31              890.451613          58.129032
2020-09-30             2204.833333         194.566667
2020-10-31             7843.870968         785.290323
2020-11-30            29880.800000        3231.666667
2020-12-31            27113.612903        3005.516129
2021-01-31            22392.354839        2483.451613
2021-02-28            18799.535714        2128.571429
2021-03-31            25040.580645        3127.032258
2021-04-30            24889.600000        3306.833333
2021-05-31            12422.516129        1783.645161
2021-06-30             3408.100000         531.966667
2021-07-31             1248.000000         179.400000 

Ora che abbiamo i nostri dataframes pronti, è il momento di visualizzarli tramite diversi grafici.

Sintassi per i plot

Le due librerie che useremo per generare i plot sono quella fornita da pandas e la libreria pandas_brokeh. Vediamo di seguito la sintassi fornita da entrambe.

Pandas

Per generare un grafico usando pandas, si usa il metodo .plot() del dataframe. Questo metodo è un semplice wrapper intorno al plt.plot() di matplotlib. E’ possibile anche specificare alcuni parametri aggiuntivi come quelli riportati di seguito.

Some of the important Parameters
--------------------------------

x : label or position, default None
    Only used if data is a DataFrame.
y : label, position or list of label, positions, default None
title: title to be used for the plot
X and y label: Name to use for the label on the x-axis and y-axis.
figsize : specifies the size of the figure object.    
kind : str
    The kind of plot to produce:

    - 'line' : line plot (default)
    - 'bar' : vertical bar plot
    - 'barh' : horizontal bar plot
    - 'hist' : histogram
    - 'box' : boxplot
    - 'kde' : Kernel Density Estimation plot
    - 'density' : same as 'kde'
    - 'area' : area plot
    - 'pie' : pie plot
    - 'scatter' : scatter plot
    - 'hexbin' : hexbin plot. 

Per una lista completa dei parametri e del loro uso, rimandiamo alla documentazione ufficiale.

Pandas bokeh

La libreria Pandas bokeh fornisce un backend di plottaggio bokeh per i DataFrames di Pandas, GeoPandas e Pyspark, aggiungendo il metodo plot_bokeh(). Richiede di definire all’inizio un metodo di plottaggio tra i due possibili: Jupyter notebook o file HTML. La sintassi è la seguente.

# for embedding plots in Jupyter Notebooks.
pandas_bokeh.output_notebook()
# for exporting plots as HTML.
pandas_bokeh.output_file(filename) 

Comparazione dei diversi plot

In questa sezione mostriamo sia i comandi che i risultati per diverse tipologie di grafico. In particolare analizzeremo le tipologie:

  • Grafici a linee
  • Scatter
  • Istogrammi
  • Grafici a barre
  • Grafici a barre impilate
  • Grafici a torta

Grafici a linee

#pandas
data.plot(title='Covid', xlabel='Values').figure.show()

# pandas_bokeh
data_new.plot_bokeh(kind='line') 

Pandas

Bokeh

Scatter plot

#pandas
data.plot(kind='scatter', 
    x='ricoverati_con_sintomi', 
    y='terapia_intensiva', 
    title='Scatter Covid').figure.show()

# pandas_bokeh
data_new.plot_bokeh.scatter(x='ricoverati_con_sintomi', 
    y='terapia_intensiva', 
    title='Scatter Covid') 

Pandas

Bokeh

Istogrammi

#pandas
data.plot(kind='hist', bins=30).figure.show()

# pandas_bokeh
data.plot_bokeh(kind='hist', bins=30) 

Pandas

Bokeh

Grafici a barre

#pandas
data_resample.plot(kind='bar').figure.show()

# pandas_bokeh
data_resample.plot_bokeh(kind='bar') 

Pandas

Bokeh

Grafici a barre impilate

#pandas
data_resample.plot(kind='barh', stacked=True).figure.show()

# pandas_bokeh
data_resample.plot_bokeh(kind='barh', stacked=True) 

Pandas

Bokeh

Grafici a torta

#pandas
data_resample['terapia_intensiva'].plot.pie(legend=False, autopct='%.1f').figure.show()

# pandas_bokeh
data_resample.plot_bokeh.pie(y='terapia_intensiva') 

Pandas

Bokeh

Per questa tipologia di grafico, Bokeh fornisce anche un altro tipo di output che ingloba più grafici a torta. La sintassi e il risulto sono riportati di seguito.

data_resample.plot_bokeh.pie() 

Conclusioni

Pandas fornisce un ottima libreria per generare grafici dei dati contenuti nei DataFrame. Tuttavia, questi grafici mancano di interattività e capacità come lo zoom e il pan. La libreria Pandas Bokeh supera questo limite fornendo anche un output in HTML che può essere facilmente incluso nei siti web. Ovviamente l’uso di una libreria rispetto ad un’altra dipende dal contesto applicativo e dalle preferenze dello sviluppatore o data analyst.

Letture consigliate

More To Explore

Google Cloud

BigQuery: clausola WITH

L’estrazione dei dati e la loro analisi è un processo che richiede conoscenza delle sorgenti dati e capacità di scrittura di interrogazioni complesse. BigQuery, il database di Google, permette in modo semplice di accedere a terabyte di dati. La scrittura delle query però richiede metodo. Scopriamo la clausola WITH per aumentare la leggibilità delle nostre query.

Python

Jupyter Notebook: guida al suo utilizzo

Lo sviluppo di pipeline di analisi dei dati da parte dei Data Scientists richiede diverse competenze. Avere a disposizione un’ambiente di sviluppo facile, intuitivo e interattivo è fondamentale. Jupyter Notebook è un’applicazione Web open source che permette di creare e condividere documenti testuali interattivi, contenenti oggetti quali equazioni, grafici e codice sorgente eseguibile in diversi linguaggi. Scopriamo le sue caratteristiche principali.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Design with MongoDB

Design with MongoDB!!!

Buy the new book that will help you to use MongoDB correctly for your applications. Available now on Amazon!