pycoro

Dai dati ufficiali, qualche previsione matematica

Senza volere fare previsioni od elaborazioni ufficiali od ufficiose ma solo un esercizio per ripassare alcuni concetti matematici, di seguito trovate il programma Python e i grafici che, partendo dai dati ufficiali sulla diffusione del COVID-19 (https://github.com/pcm-dpc/COVID-19), disegna i grafici per il Veneto e il Friuli sull’andamento e la previsione per i prossimi due giorni dei casi segnalati.

#!/usr/bin/env python3
import urllib.request
import json
from datetime import datetime
from scipy.interpolate import UnivariateSpline
from scipy.signal import savgol_filter


if __name__ == "__main__":
    from matplotlib import pyplot as plt

    firstDay = datetime(2020, 2, 24)

    url = "https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-regioni.json"
    req = urllib.request.Request(url)
    with urllib.request.urlopen(req) as response:
        datastore = json.loads(response.read())
    for regione in ['Veneto','Friuli Venezia Giulia']:
        xPoints = []
        yPoints = []
        xMax=-1
        for data in datastore:
            if data['denominazione_regione']==regione:
                date_time_obj = datetime.strptime(data['data'], '%Y-%m-%d %H:%M:%S')
                delta=date_time_obj-firstDay
                xMax = max(xMax, delta.days)
                xPoints.append(delta.days)
                yPoints.append(data['totale_casi'])
        plt.plot(xPoints, yPoints, 'o',label='data')
        yhat = savgol_filter(yPoints, 11, 3)
        plt.plot(xPoints, yhat,label='Savitzky–Golay')
        daysWanted=[xMax]
        for i in range(0, 4):
            daysWanted.append(xMax+i)

        for k in (1, 2,3):
            spl = UnivariateSpline(xPoints, yhat, k=k)
            spl.set_smoothing_factor(0.2)
            y = spl(daysWanted)
            label = "k=%d" % k
            print(label,y)
            plt.plot(daysWanted, y, '--', label=label)
        plt.grid()
        plt.title(regione)
        plt.legend( loc="best" )
        plt.show()

Veneto

Previsione su 2 giorni (il primo valore è il giorno attuale) con https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html:

(dato del 23 marzo 2020)

  • k=1 [5965.7057941 5965.7057941 6405.50670116 6845.30760822 7285.10851527]
  • k=2 [5965.63978126 5965.63978126 6370.41016268 6740.31096795 7075.34219707]
  • k=3 [5965.61047754 5965.61047754 6355.34720057 6678.63307654 6918.77284436]

Friuli

  • k=1 [ 995.34034413 995.34034413 1053.46755687 1111.5947696 1169.72198234]
  • k=2 [ 995.23966355 995.23966355 1033.61949453 1052.47618057 1051.80972167]
  • k=3 [ 995.22544223 995.22544223 1027.80489782 1028.63739093 991.24117572]

Dialogue & Discussion