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.
Plottare l’andamento nel tempo dei contagiati della propria provincia.
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.
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,
# 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>
#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")
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()
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']
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)
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>
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 |
!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
[31m WARNING: This is a development server. Do not use it in a production deployment.[0m
[2m Use a production WSGI server instead.[0m
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)