Open In Colab

Analisi Covid19 dataset usando Pandas, Matplotlib, Plotly, Dash : (Spiegazione)

Riassunto libreria Pandas

# importare libreria pandas con nome pd
import pandas as pd
# Creare dataframe (usando struttura dizionario chiave-valore)
content ={
    "Nome": ["Manuel", "Giada", "Marco", "Manuel"],
    "Età" : ["26", "25", "28", "29"],
    "Sesso": ["M", "F", "M", "F"],
    "Stipendio": [2050,1900,2100,2300]
}
df = pd.DataFrame(content)
# Ê possibile specificare anche gli indici in modo che siano diversi da 0,1,2 --N
#df = pd.DataFrame(content, index=["n1","n2","n3","n4"])
df
# Elencare informazioni
df.info()
# Elencare informazioni statistiche utili
display(df.describe())
df["Età"]=pd.to_numeric(df["Età"])
display(df.describe())
# Elencare nome colonne
df.keys()
# Dimensione tabella (righe,colonne)
df.shape
row = df.shape[0]
col = df.shape[1]
print(df.shape,row,col)
# Ottenere prime  3 e ultime 3 righe della tabella
display(df.head(3)) # prime 3
display(df.tail(3)) # ultime 3
# Seleziona colonna Nome e Sesso
df[["Nome","Sesso"]]
# Seleziona colonna Nome e Sesso parole unique
display(df["Nome"].unique())
display(df["Sesso"].unique())
# Seleziona riga con indice 2 (qua si guarda agli indici)
display(df.loc[2])
# Seleziona tutte le righe di colonne specifiche
display(df.loc[:, ("Nome","Sesso")])
# Seleziona riga numero 2 (si parte a contare da 0)
display(df.iloc[2])
# Seleziona riga numero 2,3 (si parte a contare da 0)
display(df.iloc[[2,3]])
# Seleziona riga da 1 a 3 
display(df.iloc[1:4])
# Della colonna Nome e Sesso selezionare le righe  1 e 3
df[["Nome","Sesso"]].iloc[[1,3]]
# Della colonna Nome e Sesso selezionare le righe da 1 a 3
df[["Nome","Sesso"]].iloc[1:4] # se vogliamo anche il 3 compreso dobbiamo arrivare a 4
# Seleziona tutte righe dove la colonna Sesso è uguale a F
display(df[df["Sesso"]=="F"])
# Seleziona l'indice della prima riga dove la colonna Sesso è uguale a F
display(df[df["Sesso"]=="F"].index[1])
# Seleziona tutte le righe dove la colonna età è > 26
df[df["Età"]>26] # Attenzione "26" è una stringa
# Seleziona tutte le righe dove la colonna età è > 26
df[df["Età"]>26] # Attenzione 26 è un numero adesso
# Plot 
#df.plot(kind="bar",stacked=True,figsize=(18,8)) # Grafico uno sopra l'latro
#df.plot(kind="bar",stacked=False,figsize=(18,8)) # Grafico a bar uno di fianco all'altro
df.plot(kind="line",figsize=(18,8)) # Grafico a bar uno di fianco all'altro
#df.set_index("Sesso").plot(kind="line",y=["Età"])
# Salvare dataframe come csv
df.to_csv('nome.csv', index=False,sep=',') # specificare se si vuole o no salvare l'indice
# Consiglio alcune volte è meglio usare ; come separatore. Vecchi excel funzionano meglio.
# Leggere csv file e convertirlo in dataframe
data = pd.read_csv('nome.csv')
data
# Salvare dataframe su excel
df.to_excel('nome.xlsx', index=False)
# Leggere excel file e convertirlo in dataframe
data = pd.read_excel('nome.xlsx')
data
# Ordinare tabella specificando una colonna e l'ordine crescente/decrescente
df = df.sort_values(by="Età", ascending=True) # crescente
display(df)
df.sort_values(by="Età",ascending=False, inplace=True) # decrescente
df
# Resettare l'ordine degli indici
df.reset_index(inplace=True)
df
# Aggiungere una colonna alla fine
df["Nuova Colonna"] = ["a","b","c","d"] # numero di elementi = numero di righe
# Aggiungere una colonna in una precisa posizione
df.insert(3, "Nuova Colonna 2", ["aa","bb","cc","dd"]) 
display(df)
# Rimuovere una colonna usando i nomi delle colonne
df.drop(columns=["Nuova Colonna 2", "Nuova Colonna"], inplace=True)
df
# Rimuovere righe 0 e 2 in base agli indici
df.drop(index=[0,2],inplace=True)
df
# Operazioni con stringhe: replace (sostituire)
df["Nome"].str.replace("a",",")
#df["Nome"] = df["Nome"].str.replace("e",",") # assegnamento
#df
# Operazione con stringhe: contains (contine)
# Nella colonna Nome e Sesso trova tutti i valori con  le lettere F o M mauscole
#df[df["Nome"].str.contains("F|M") | df["Sesso"].str.contains("M")]
# Nella colonna Nome e Sesso trova tutti i valori con  le lettere G e F mauscole
df[df["Nome"].str.contains("G") & df["Sesso"].str.contains("F")]

Esercizio

Descrizione

Datasets:

  • dati_province = “https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc-covid19-ita-province.csv”

  • dati_regioni = “https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-regioni/dpc-covid19-ita-regioni.csv”

  • dati_italia = “https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv”

Obbiettivo: Utilizzando i dati provinciali analizzare l’andamento dei contagiati nella propria provincia nel tempo.

  1. Plottare l’andamento nel tempo dei contagiati della propria provincia.

  2. Comparare l’andamento nel tempo dei contagiati delle prime 3 provincie della nostra regione (Emilia-Romagna) con quelli di una provincia appartenente sempre alla nostra regione.

  3. Creare un grafico a torta con le percentuali di contagiati per ogni provincia apparente alla nostra regione (Emilia-Romagna)

Parte 1. Plottare l’andamento nel tempo dei contagiati della propria provincia.

import pandas as pd
# Leggiamo i dati
df = pd.read_csv("https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc-covid19-ita-province.csv")
df
data stato codice_regione denominazione_regione codice_provincia denominazione_provincia sigla_provincia lat long totale_casi note_it note_en
0 2020-02-24T18:00:00 ITA 13 Abruzzo 69 Chieti CH 42.351032 14.167546 0 NaN NaN
1 2020-02-24T18:00:00 ITA 13 Abruzzo 66 L'Aquila AQ 42.351222 13.398438 0 NaN NaN
2 2020-02-24T18:00:00 ITA 13 Abruzzo 68 Pescara PE 42.464584 14.213648 0 NaN NaN
3 2020-02-24T18:00:00 ITA 13 Abruzzo 67 Teramo TE 42.658918 13.704400 0 NaN NaN
4 2020-02-24T18:00:00 ITA 13 Abruzzo 979 In fase di definizione/aggiornamento NaN 0.000000 0.000000 0 NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ...
13051 2020-06-04T17:00:00 ITA 5 Veneto 26 Treviso TV 45.667546 12.245074 2659 NaN NaN
13052 2020-06-04T17:00:00 ITA 5 Veneto 27 Venezia VE 45.434905 12.338452 2667 NaN NaN
13053 2020-06-04T17:00:00 ITA 5 Veneto 23 Verona VR 45.438390 10.993527 5101 NaN NaN
13054 2020-06-04T17:00:00 ITA 5 Veneto 24 Vicenza VI 45.547497 11.545971 2848 NaN NaN
13055 2020-06-04T17:00:00 ITA 5 Veneto 999 In fase di definizione/aggiornamento NaN 0.000000 0.000000 344 NaN NaN

13056 rows × 12 columns

# Estrarre i nomi delle regioni
df["denominazione_regione"].unique()
#list(df["denominazione_regione"].unique())
array(['Abruzzo', 'Basilicata', 'P.A. Bolzano', 'Calabria', 'Campania',
       'Emilia-Romagna', 'Friuli Venezia Giulia', 'Lazio', 'Liguria',
       'Lombardia', 'Marche', 'Molise', 'Piemonte', 'Puglia', 'Sardegna',
       'Sicilia', 'Toscana', 'P.A. Trento', 'Umbria', "Valle d'Aosta",
       'Veneto'], dtype=object)
# Estrarre i nomi delle provincie -- manipolazione liste
mylist = list(df["denominazione_provincia"].unique())
print(mylist)
el = "In fase di definizione/aggiornamento"	
if el in mylist:
    print("Yes: e l'indice `e", mylist.index(el))
else:
    print("No")
#Estrarre le provincie in Emilia Romagna
df[df["denominazione_regione"]=="Emilia-Romagna"]["denominazione_provincia"].unique()
array(['Bologna', 'Ferrara', 'Forlì-Cesena', 'Modena', 'Parma',
       'Piacenza', 'Ravenna', "Reggio nell'Emilia", 'Rimini',
       'In fase di definizione/aggiornamento'], dtype=object)
# Creiamo un dataframe che contiene solo la regione Emilia Romagna e la pronvincia Bologna
prov_list = ["Bologna", "Rimini", "Parma"] 
df_choice = df[ (df["denominazione_regione"]=="Emilia-Romagna") & (df["denominazione_provincia"]==prov_list[0])]
df_choice.head()
data stato codice_regione denominazione_regione codice_provincia denominazione_provincia sigla_provincia lat long totale_casi note_it note_en
22 2020-02-24T18:00:00 ITA 8 Emilia-Romagna 37 Bologna BO 44.494367 11.341721 0 NaN NaN
150 2020-02-25T18:00:00 ITA 8 Emilia-Romagna 37 Bologna BO 44.494367 11.341721 0 NaN NaN
278 2020-02-26T18:00:00 ITA 8 Emilia-Romagna 37 Bologna BO 44.494367 11.341721 0 NaN NaN
406 2020-02-27T18:00:00 ITA 8 Emilia-Romagna 37 Bologna BO 44.494367 11.341721 0 NaN NaN
534 2020-02-28T18:00:00 ITA 8 Emilia-Romagna 37 Bologna BO 44.494367 11.341721 0 NaN NaN
# Guardiamo il tipo dei dati 
# Controlliamo se i numeri sono interi o float
df_choice.info()
# Convertiamo il tipo data in datetime e manipoliamola
temp = pd.to_datetime(df_choice["data"])
df_choice.loc[:,("data")] = temp.dt.date
print(temp.head(1))
print("-------------------")
print(temp.head(1).dt.date)
print("-------------------")
print(temp.head(1).dt.year)
print("-------------------")
print(temp.head(1).dt.strftime('%m-%d'))
22   2020-02-24
Name: data, dtype: datetime64[ns]
-------------------
22    2020-02-24
Name: data, dtype: object
-------------------
22    2020
Name: data, dtype: int64
-------------------
22    02-24
Name: data, dtype: object

Pandas Plot (Matplotlib based) Customization

import matplotlib.pyplot as plt
import matplotlib as mpl
from cycler import cycler
import os
%matplotlib inline
# Parametri customizzazzione visualizzazione usando pandas
ax = df_choice.set_index("data").plot(y="totale_casi",kind="line",    
                                    title="Emilia-Romagna (Bologna)",
                                    figsize=(18,8),
                                    grid=False,
                                    style="o--g") # '-', '--', '-.', ':'] fmt = '[marker][line][color]'
                                    #legend=True,fontsize=20, rot=30,
                                     
../../_images/analisi_covid19_spiegazione_44_0.png
# Parametri customizzazzione visualizzazione usando pandas
ax = df_choice.set_index("data").plot(y="totale_casi",kind="line",    
                                    title="My tile",
                                    figsize=(18,8),
                                    grid=True, 
                                    legend=True,fontsize=20, rot=30,
                                    style="o--g") # '-', '--', '-.', ':'] fmt = '[marker][line][color]'

ax.set_title('Totale Casi Bologna', color="black", fontsize='40',pad=25)
ax.set_xlabel('data', color='black',fontsize='20')
ax.set_ylabel('totale dei casi', color='black',fontsize='20')
ax.legend(loc='best',fontsize=20, title="Legenda", title_fontsize=20)
<matplotlib.legend.Legend at 0x7fda31b70940>
../../_images/analisi_covid19_spiegazione_45_1.png
#plt.style.use('ggplot')
print(plt.style.available)
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
# Parametri customizzazione visualizzazione usando pandas
for el in plt.style.available:
    with plt.style.context(el):
        df_choice.set_index("data").plot(y="totale_casi",kind="line",title="My title: " + el)
df_final = df_choice[["data","totale_casi"]]
with plt.style.context('dark_background'):
    #df_final.plot(x="data", y="totale_casi",kind="line")
    plt.rcParams['lines.linewidth'] = 2
    plt.rcParams['lines.linestyle'] = '-.'
    plt.rc('lines', marker='o', markerfacecolor='r', markersize=8, markeredgecolor="r")
    #plt.rc('lines', linewidth=2, color='red',linestyle='-.')
    plt.rcParams['axes.prop_cycle'] = cycler(color=['c', 'g', 'b', 'y']) # color line
    plt.rcParams['figure.figsize'] = (20,9)
    plt.rc("axes",titlesize=30, titlecolor="cyan",titlepad=10)
    plt.rcParams.update({"axes.grid" : True, "grid.color": "red", "grid.alpha" : 0.5})
    plt.rc("font", family="DejaVu Serif", fantasy="Comic Neue", size=20)
    plt.rcParams["date.autoformatter.day"]= "%m-%d" #"%Y-%m"
    # Sample half element of a series
    xlist = []
    data_list = list(df_final['data'])
    for i in range(0, len(data_list),4):
        xlist.append(data_list[i])
    ax = df_final.set_index("data").plot(y="totale_casi",kind="line", title="Titolo", xticks=xlist)
    ax.tick_params(axis='x',labelrotation=45) #,labelcolor='orange',
    #ax.yaxis.grid(False)

    directory = "assets/images/"
    if not os.path.exists(directory):
        os.makedirs(directory)
    plt.savefig(directory+ "ex1.png")
../../_images/analisi_covid19_spiegazione_49_0.png

Matplotlib plot

import matplotlib.pyplot as plt
# https://matplotlib.org/3.2.1/gallery/style_sheets/style_sheets_reference.html
# https://matplotlib.org/3.1.0/gallery/color/named_colors.html
# https://www.tutorialspoint.com/matplotlib/index.htm
# plt.style("fiverthirtyeight")

x = df_final["data"].values.tolist()
y = df_final["totale_casi"].values.tolist()

fig, ax = plt.subplots(figsize=(18,8),facecolor=(0, 0, 0))

ax.set_facecolor((0.05,0.05,0.05)) #or use hex values
ax.set_title('Totale Casi Bologna', color=(1,1,1), fontsize='40',pad=25)
ax.set_xlabel('data', color='w',fontsize='20')
ax.set_ylabel('totale dei casi', color='peachpuff',fontsize='20')
ax.tick_params(axis='x' ,direction='out', length=10, width=2, colors='r' ,labelcolor='tab:orange',labelsize=20,labelrotation=45)
ax.tick_params(axis='y' ,direction='out', length=10, width=2, colors='r',labelcolor='tab:orange',labelsize=20)
ax.yaxis.grid(False)
ax.xaxis.grid(True, color='b', linestyle='--')
plt.plot(x,y, marker='o', markerfacecolor='r', markersize=10, linestyle='-.', linewidth=2,color='green', label="totale_casi")
ax.legend(loc='best',fontsize=20, title="Legenda", title_fontsize=20)
plt.show()
../../_images/analisi_covid19_spiegazione_51_0.png

Plotly

# Plotly doc
# Plotly offline figure show
# https://plotly.com/python/reference/

import plotly.graph_objects as go

xx = df_final["data"].values.tolist()
yy = df_final["totale_casi"].values.tolist()

fig = go.Figure()

fig.add_trace(go.Scatter(
        x = xx,
        y = yy,
        name="Totale Casi",
        mode="lines+markers",
        showlegend=True,
        marker=dict(
            symbol="circle-dot",
            size=6,
        ),
        line=dict(
            width=1,
            color="rgb(0,255,0)",
            dash="longdashdot"
        )
    )
)
fig.update_layout(
    title=dict(
        text ="Totale Casi Bologna",
        y = 0.9,
        x = 0.5,
        xanchor = "center",
        yanchor = "top",
    ),
    legend=dict(
        y = 0.9,
        x = 0.03,
    ),
    xaxis_title="data",
    yaxis_title="totale casi",
    font=dict(
        family="Courier New, monospace",
        size=20,
        color="orange", #"#7f7f7f", 
    ),
    hovermode='x',  #['x', 'y', 'closest', False]
    plot_bgcolor = "rgb(10,10,10)",
    paper_bgcolor="rgb(0,0,0)"
)
fig.show()

Risoluzione con fuzioni

import pandas as pd
from matplotlib.pyplot import *
import matplotlib.pyplot as plt
import os 

def get_nomi_regioni(df):
    return list(df["denominazione_regione"].unique())

def get_nomi_province(df,regione):
    a = df[df["denominazione_regione"]==regione]
    #ultima_data = list(a.tail(1)["data"])[0]
    ultima_data = a.tail(1)["data"].values[0]
    res = list(a[a["data"]==ultima_data]["denominazione_provincia"])
    res.remove('In fase di definizione/aggiornamento')
    return res

def plot_andamento_provincia_style(df, provincia):
    new =  df[df["denominazione_provincia"]==provincia][["data","totale_casi"]]
    with plt.style.context('dark_background'):
        #df_final.plot(x="data", y="totale_casi",kind="line")
        plt.rcParams['lines.linewidth'] = 2
        plt.rcParams['lines.linestyle'] = '-.'
        plt.rc('lines', marker='o', markerfacecolor='r', markersize=8, markeredgecolor="r")
        #plt.rc('lines', linewidth=2, color='red',linestyle='-.')
        plt.rcParams['axes.prop_cycle'] = cycler(color=['c', 'g', 'b', 'y']) # color line
        plt.rcParams['figure.figsize'] = (20,9)
        plt.rc("axes",titlesize=30, titlecolor="cyan",titlepad=10)
        plt.rcParams.update({"axes.grid" : True, "grid.color": "red", "grid.alpha" : 0.5})
        plt.rc("font", family="fantasy", fantasy="Comic Neue", size=20)
        plt.rcParams["date.autoformatter.day"]= "%m-%d" #"%Y-%m"
        # Sample half element of a series
        xlist = []
        data_list = list(new['data'])
        for i in range(0, len(data_list),4):
            xlist.append(data_list[i])
        
        ax = new.set_index("data").plot(y="totale_casi",kind="line", title="Titolo", xticks=xlist)
        ax.tick_params(axis='x',labelrotation=45) #,labelcolor='orange',
        #ax.yaxis.grid(False)
        #write_image(ax.figure)
        return ax.figure

def write_image(fig):
    directory = "assets/images/"
    if not os.path.exists(directory):
        os.makedirs(directory)
    fig.savefig(directory+ "ex1.png")
    
def plot_andamento_provincia(df,provincia):
    new = df[df["denominazione_provincia"]==provincia][["data","totale_casi"]]
    ax = new.set_index("data").plot(kind="line", y="totale_casi", figsize=(18,8))
    return ax.figure

# Leggiamo i dati
df = pd.read_csv("https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc-covid19-ita-province.csv")
df["data"] = pd.to_datetime(df["data"])
df.head(2)

nomi_regioni = get_nomi_regioni(df)
print(nomi_regioni)

regione = "Friuli Venezia Giulia"
res = get_nomi_province(df,regione)
print(res)

provincia="Trieste"
fig = plot_andamento_provincia(df,provincia)
fig = plot_andamento_provincia_style(df,provincia)
['Abruzzo', 'Basilicata', 'P.A. Bolzano', 'Calabria', 'Campania', 'Emilia-Romagna', 'Friuli Venezia Giulia', 'Lazio', 'Liguria', 'Lombardia', 'Marche', 'Molise', 'Piemonte', 'Puglia', 'Sardegna', 'Sicilia', 'Toscana', 'P.A. Trento', 'Umbria', "Valle d'Aosta", 'Veneto']
['Gorizia', 'Pordenone', 'Trieste', 'Udine']
../../_images/analisi_covid19_spiegazione_55_1.png ../../_images/analisi_covid19_spiegazione_55_2.png

Parte 2. Comparare l’andamento nel tempo dei contagiati delle prime 3 provincie della nostra regione (Emilia-Romagna) con quelli di una provincia appartenente sempre alla nostra regione.

import pandas as pd
from matplotlib.pyplot import *
import matplotlib.pyplot as plt

def plot_data_es2(df):
    # Update data for plot
    #fig, ax = subplots(1, 1, figsize=(18,8))
    df.plot(x="data",kind="line", figsize=(18,8))#,ax=ax)

def get_nomi_regioni(df):
    nomi_regioni = list(df["denominazione_regione"].unique())
    nomi_regioni.sort()
    return nomi_regioni

def get_nomi_provincie(df, num, regione="Emilia-Romagna"):
    # Nomi delle prime num provincie per numero di casi 
    ultima_data_aggiornamento = list(df.tail(1)["data"])[0]


    # Dataframe regione scelta e ultima data aggiornamento
    temp = df[(df["denominazione_regione"]==regione) & (df["data"]==ultima_data_aggiornamento)]

    # Ordina dal più grande al più piccolo
    temp.sort_values(by="totale_casi",ascending=False) #, inplace=True)
    nomi_province = list(temp["denominazione_provincia"][0:num])

    # Nomi pronvicie 
    #nomi_province = list(df["denominazione_provincia"].unique())
    return nomi_province

def es2(df,provincia,regione):
    # Comparare l'andamento nel tempo dei contagiati di ogni provincia della nostra regione (Emilia-Romagna).
    nomi_province = get_nomi_provincie(df, 3, regione)  # Nomi delle prime N provincie per numero di casi 

    # Se la provincia che desidero compare non è tra le prime 3 l'aggiungo
    if provincia not in nomi_province:
        nomi_province.append(provincia)

    #print(nomi_province)
    df_fin_vec = []
    
    data_vec = df
    mydict = {}
    for nome_provincia in nomi_province:
        if nome_provincia!='In fase di definizione/aggiornamento':
            df_fin = df[ (df["denominazione_regione"]==regione) & (df["denominazione_provincia"]==nome_provincia)]
            mydict["data"] = list(df_fin["data"])
            mydict[nome_provincia] = list(df_fin["totale_casi"])

    df_fin = pd.DataFrame(mydict)
    df_fin.loc[:, ('data')] = pd.to_datetime(df_fin["data"])
    #display(df_fin)
    plot_data_es2(df_fin)

df = pd.read_csv("https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc-covid19-ita-province.csv")
regione="Emilia-Romagna"
provincia="Bologna"
es2(df,provincia,regione)
../../_images/analisi_covid19_spiegazione_57_0.png

Parte 3. Creare un grafico a torta con le percentuali di contagiati per ogni provincia apparente alla nostra regione (Emilia-Romagna)

import pandas as pd
from matplotlib.pyplot import *
import matplotlib.pyplot as plt

regione="Emilia-Romagna"
provincia="Bologna"
df = pd.read_csv("https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc-covid19-ita-province.csv")
ultima_data_aggiornamento = list(df.tail(1)["data"])[0]
df_choice = df[(df["denominazione_regione"]==regione) & (df["denominazione_provincia"]!='In fase di definizione/aggiornamento') & (df["data"]==ultima_data_aggiornamento) ]
#display(df_choice)
cont = {
    'totale_casi': list(df_choice["totale_casi"])
    }
df_plot = pd.DataFrame(cont, index=list(df_choice["denominazione_provincia"]) )

fig, ax = plt.subplots(1, 1, figsize=(18,8))
df_plot.plot(kind="pie", y="totale_casi",ax=ax,autopct='%1.0f%%', pctdistance=1.1, labeldistance=1.2)
#fig.savefig("covid19.png")    
<matplotlib.axes._subplots.AxesSubplot at 0x7fda2ad14ba8>
../../_images/analisi_covid19_spiegazione_59_1.png

Visualizza i risultati in una pagina web usando (Dash Plotly)

import pandas as pd
from matplotlib.pyplot import *
import matplotlib.pyplot as plt
import os 

def get_nomi_regioni(df):
    return list(df["denominazione_regione"].unique())

def get_nomi_province(df,regione):
    a = df[df["denominazione_regione"]==regione]
    #ultima_data = list(a.tail(1)["data"])[0]
    ultima_data = a.tail(1)["data"].values[0]
    res = list(a[a["data"]==ultima_data]["denominazione_provincia"])
    res.remove('In fase di definizione/aggiornamento')
    return res

def plot_andamento_pie(df, regione):
    ultima_data_aggiornamento = list(df.tail(1)["data"])[0]
    df_choice = df[(df["denominazione_regione"]==regione) & (df["denominazione_provincia"]!='In fase di definizione/aggiornamento') & (df["data"]==ultima_data_aggiornamento) ]
    display(df_choice)
    cont = {
        'totale_casi': list(df_choice["totale_casi"])
        }
    df_plot = pd.DataFrame(cont, index=list(df_choice["denominazione_provincia"]) )

    with plt.style.context('dark_background'):
        ax = df_plot.plot(kind="pie", y="totale_casi",autopct='%1.0f%%', pctdistance=1.1, labeldistance=1.2, figsize=(20,9))
        return ax.figure

def plot_andamento_provincia_style(df, provincia):
    new =  df[df["denominazione_provincia"]==provincia][["data","totale_casi"]]
    with plt.style.context('dark_background'):
        #df_final.plot(x="data", y="totale_casi",kind="line")
        plt.rcParams['lines.linewidth'] = 2
        plt.rcParams['lines.linestyle'] = '-.'
        plt.rc('lines', marker='o', markerfacecolor='r', markersize=8, markeredgecolor="r")
        #plt.rc('lines', linewidth=2, color='red',linestyle='-.')
        plt.rcParams['axes.prop_cycle'] = cycler(color=['c', 'g', 'b', 'y']) # color line
        plt.rcParams['figure.figsize'] = (20,9)
        plt.rc("axes",titlesize=30, titlecolor="cyan",titlepad=10)
        plt.rcParams.update({"axes.grid" : True, "grid.color": "red", "grid.alpha" : 0.5})
        plt.rc("font", family="fantasy", fantasy="Comic Neue", size=20)
        plt.rcParams["date.autoformatter.day"]= "%m-%d" #"%Y-%m"
        # Sample half element of a series
        xlist = []
        data_list = list(new['data'])
        for i in range(0, len(data_list),4):
            xlist.append(data_list[i])
        
        ax = new.set_index("data").plot(y="totale_casi",kind="line", title="Titolo", xticks=xlist)
        ax.tick_params(axis='x',labelrotation=45) #,labelcolor='orange',
        #ax.yaxis.grid(False)
        #write_image(ax.figure)
        return ax.figure

def plot_andamento_province(df, regione):
    # Comparare l'andamento nel tempo dei contagiati di ogni provincia della nostra regione (Emilia-Romagna).
    nomi_province = get_nomi_province(df,regione)  # Nomi delle prime N provincie per numero di casi 

    #print(nomi_province)
    mydict = {}
    for nome_provincia in nomi_province:
        df_fin = df[df["denominazione_provincia"]==nome_provincia][["data","totale_casi"]]
        mydict["data"] = list(df_fin["data"])
        mydict[nome_provincia] = list(df_fin["totale_casi"])

    df_fin = pd.DataFrame(mydict)
    #display(df_fin)
    with plt.style.context('dark_background'):
        ax =df_fin.set_index("data").plot(kind="line", figsize=(20,9))
        return ax.figure

def write_image(fig, name):
    directory = "assets/images/"
    if not os.path.exists(directory):
        os.makedirs(directory)
    fig.savefig(directory+ name,transparent=True)
    
def plot_andamento_provincia(df,provincia):
    new = df[df["denominazione_provincia"]==provincia][["data","totale_casi"]]
    ax = new.set_index("data").plot(kind="line", y="totale_casi", figsize=(20,9))
    return ax.figure

# Leggiamo i dati
df = pd.read_csv("https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc-covid19-ita-province.csv")
df["data"] = pd.to_datetime(df["data"])
df.head(2)

nomi_regioni = get_nomi_regioni(df)
print(nomi_regioni)

regione = "Friuli Venezia Giulia"
res = get_nomi_province(df,regione)
print(res)

provincia="Trieste"
#fig = plot_andamento_provincia(df,provincia)        ## Parte 1
fig1 = plot_andamento_provincia_style(df,provincia)  ## Parte 1
fig2= plot_andamento_province(df, regione)          ## Parte 2
fig3 = plot_andamento_pie(df, regione)          ## Parte 3
write_image(fig1, "fig1.png")
write_image(fig2, "fig2.png")
write_image(fig3, "fig3.png")
['Abruzzo', 'Basilicata', 'P.A. Bolzano', 'Calabria', 'Campania', 'Emilia-Romagna', 'Friuli Venezia Giulia', 'Lazio', 'Liguria', 'Lombardia', 'Marche', 'Molise', 'Piemonte', 'Puglia', 'Sardegna', 'Sicilia', 'Toscana', 'P.A. Trento', 'Umbria', "Valle d'Aosta", 'Veneto']
['Gorizia', 'Pordenone', 'Trieste', 'Udine']
data stato codice_regione denominazione_regione codice_provincia denominazione_provincia sigla_provincia lat long totale_casi note_it note_en
12960 2020-06-04 17:00:00 ITA 6 Friuli Venezia Giulia 31 Gorizia GO 45.941498 13.622125 214 NaN NaN
12961 2020-06-04 17:00:00 ITA 6 Friuli Venezia Giulia 93 Pordenone PN 45.954435 12.660029 689 NaN NaN
12962 2020-06-04 17:00:00 ITA 6 Friuli Venezia Giulia 32 Trieste TS 45.649435 13.768136 1389 NaN NaN
12963 2020-06-04 17:00:00 ITA 6 Friuli Venezia Giulia 30 Udine UD 46.062555 13.234838 987 NaN NaN
../../_images/analisi_covid19_spiegazione_61_2.png ../../_images/analisi_covid19_spiegazione_61_3.png ../../_images/analisi_covid19_spiegazione_61_4.png
!pip install dash flask_ngrok
%%writefile assets/typography.css
body {
    padding: 20px 300px 0px 300px;
    margin : 0px 0px 0px  0px;
    /*padding : 0px 0px 0px 0px;*/
    background-color: black;
}
Overwriting assets/typography.css
import dash
import dash_html_components as html
from flask_ngrok import run_with_ngrok

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
server = app.server
run_with_ngrok(server) 

app.layout = html.Div([
        html.Div(
        [   
            html.Img(src='/assets/images/fig1.png'),
        ]),
        html.Div(
        [   
            html.Img(src='/assets/images/fig2.png'),
        ]),
        html.Div(
        [   
            html.Img(src='/assets/images/fig3.png'),
        ])
    ],style={'backgroundColor': "rgb(0,0,0)",  "margin": "0", "padding": "0"})

if __name__ == '__main__':
    server.run()
    #app.run_server() #debug=True, host="0.0.0.0", port=8900)
 * Serving Flask app "__main__" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)