<jupyter_start><jupyter_text>Quante persone saranno contagiate? Si vedono tante proiezioni sui contagiati, tutte fanno vedere una curva esponenziale (che shizza verso l'alto).Questo effetto piuttosto drammatico è dato più dalla scelta del modello statistico che dai dati in sè.In questo notebook confrontiamo il modello esponenziale con un modello più sobrio, che tiene conto del più comune andamento dei fenomeni biologici: cioè una rapida crescita seguita da un assestamento. Faremo anche una predizione su quando avverrà questo assestamento.Per cominciare importiamo le librerie, carichiamo i dati e facciamo una pulizia.<jupyter_code>import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from lmfit import Model

df = pd.read_csv('./../publication/provinceArchivioISTAT.csv')
df = df.dropna()
df.sample(5)<jupyter_output><empty_output><jupyter_text>Prendiamo in esame i malati cumulativi in base ai giorni.<jupyter_code># semplifichiamo le date usando il giorno dell'anno ( da 0 a 365 )
df['tempo'] = df['datetime'].map( lambda d: pd.to_datetime(d).timetuple().tm_yday )

# raggruppa in base al giorno
df_by_datetime = df[ ['datetime', 'tempo', 'numero'] ].groupby('tempo')
df_by_datetime = df_by_datetime.sum().sort_values(by='tempo')
df_by_datetime = df_by_datetime.reset_index()

# contagi cumulativi
g = sns.scatterplot(data=df_by_datetime, x='tempo', y='numero')
g.set_title('Andamento numero contagiati (cumulativo)')
plt.show()<jupyter_output><empty_output><jupyter_text>Definiamo tre modelli diversi- linea- esponente- sigmoide<jupyter_code>def line(x, a, b, c):
    return x*a + b
line_init_params = { a: 2, b: 1, c:0 }

def exponential(x, a, b, c):
    return (x**a) * b + c
exp_init_params = { a: 2, b: 1, c:0 }

def sigmoid(x, a, b, c):
    expo = a * (b - x)
    sig = 1 / ( 1 + np.exp( expo ) ) * c
    return sig
sig_init_params = { a: 0.001, b: 500, c:4000 }
df_x = df_by_datetime['tempo'].values
df_y = df_by_datetime['numero'].values

for mod in [line, exponential, sigmoid]:
    
    model  = Model(mod)
    result = model.fit( df_y, x=df_x, a=0.1, b=100, c=5000)
    
    all_year = np.linspace(np.min(df_x), np.max(df_x)*1.5)
    all_year = np.linspace(40, 100)
    predictions = result.eval(x=all_year)
    plt.plot(all_year, predictions, 'r-', label='modello')
    plt.plot(df_x, df_y, 'o', label='osservazioni')
    plt.legend(loc='best')
    plt.show()
    
    print(result.fit_report())<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12188254223652453, 'fraction_numerical': 0.016090104585679808, 'mean_word_length': 4.7972027972027975, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '539310', 'license': 'CC-BY-4.0', 'n_tokens_mistral': 992, 'n_tokens_neox': 960, 'n_words': 255, 'path': 'visualizzazione/.ipynb_checkpoints/analisi_predittiva-checkpoint.ipynb', 'repo_name': 'toobaz/covid19italia', 'size': '2486'}