File:Koronaviruksen R0 Suomessa 6.svg
Original file (SVG file, nominally 928 × 468 pixels, file size: 51 KB)
Captions
Summary
[edit]DescriptionKoronaviruksen R0 Suomessa 6.svg |
Suomi: Koronaviruksen arvioitu perusuusiutumisluku (tarttuvuusluku) R0 Suomessa keväällä 2020. Arvio tehty silitetyllä datalla ja yksinkertaisella eksponenttikaavalla.
English: Basic reproduction number R0 of Covid-19 in Finland, spring 2020. Simple expponnetial estimation formula, smoothed data. |
Date | |
Source | Own work |
Author | Merikanto |
Python 3 code to produce image
- calculaters COVID-19 R0 using simple exponential estimation formula
- and smoothed data
- COVID-19 statistics from aggregated data from net site
- with Python
- Input from internet site: cases, recovered, deats.
- 11.01.2021
- 0001.0001
paiva1="2020-02-28"
paiva2="2021-02-22"
- ymax1=1000
- ymax2=30
import math as math
import numpy as np
import scipy as sp
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from matplotlib.ticker import (MultipleLocator, FormatStrFormatter,
AutoMinorLocator)
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from scipy.signal import savgol_filter
from bs4 import BeautifulSoup
import requests
- very basic exponential r0 calculation
def calculate_r0(time1, time2, val1, val2):
k=0
##td=time2-time1
##
#optim
td=1
#print("td")
#print (td)
#print(val1, val2)
gr0=math.log(val2/val1)
gr=gr0/td
#print (val2, val1)
#print(gr)
if(gr!=0):
td= math.log(2.0)/gr
else:
return(1)
tau=5.0
k=math.log(2.0)/td
r0=math.exp(k*tau)
if(r0==32):
r0=1
if(r0>32):
r0=4
return(r0)
def calculate_multiple_r0(daata1):
lenu1=len(daata1)
print (lenu1)
#daata2=list(range(1,lenu1,1))
daata2 = [0] * lenu1
for n in range(1,lenu1-2,1):
valju1=daata1[n-1]
valju2=daata1[n]
if(math.isnan(valju1)):
valju1=1
if(math.isnan(valju2)):
valju2=1
if(valju1==0):
valju1=1
if(valju2==0):
valju2=1
timex1=0
timex2=1
r0=calculate_r0(0, 1, valju1, valju2)
daata2[n]=r0
print (n, r0)
return(daata2)
def format_func(value, tick_number):
N = int(np.round(value/10))
if N == 0:
return "0"
else:
return r"${0}\pv$".format(N)
def smooth(x,window_len=14,window='hanning'):
if x.ndim != 1:
return(-1)
if x.size < window_len:
return(-1)
if window_len<3:
return (x)
if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']:
return(-1)
s=np.r_[x[window_len-1:0:-1],x,x[-2:-window_len-1:-1]]
if window == 'flat':
w=np.ones(window_len,'d')
else:
w=eval('np.'+window+'(window_len)')
y=np.convolve(w/w.sum(),s,mode='valid')
return y
def cut_by_dates(dfx, start_date, end_date):
mask = (dfx['Date'] >= start_date) & (dfx['Date'] <= end_date)
dfx2 = dfx.loc[mask]
#print(dfx2)
return(dfx2)
def load_country_cases(maa):
dfin = pd.read_csv('https://datahub.io/core/covid-19/r/countries-aggregated.csv', parse_dates=['Date'])
countries = [maa]
dfin = dfin[dfin['Country'].isin(countries)]
#print (head(dfin))
#quit(-1)
selected_columns = dfin"Date", "Confirmed", "Recovered", "Deaths"
df2 = selected_columns.copy()
df=df2
len1=len(df["Date"])
aktiv2= [None] * len1
for n in range(0,len1-1):
aktiv2[n]=0
dates=df['Date']
rekov1=df['Recovered']
konf1=df['Confirmed']
death1=df['Deaths']
#print(dates)
spanni=6
#print(rekov1)
#quit(-1)
rulla = rekov1.rolling(window=spanni).mean()
rulla2 = rulla.rolling(window=spanni).mean()
tulosrulla=rulla2
tulosrulla= tulosrulla.replace(np.nan, 0)
tulosrulla=np.array(tulosrulla).astype(int)
rulla2=tulosrulla
x=np.linspace(0,len1,len1);
#print("kupla")
#print(tulosrulla)
#print(konf1)
#print(death1)
#print(aktiv2)
konf1=np.array(konf1).astype(int)
death1=np.array(death1).astype(int)
#print(konf1)
#quit(-1)
for n in range(0,(len1-1)):
#print("luzmu")
rulla2[n]=tulosrulla[n]
#print ("luzmu2")
#aktiv2[n]=konf1[n]-death1[n]-rulla2[n]
aktiv2[n]=konf1[n]
#print(rulla2[n])
#quit(-1)
#aktiv3=np.array(aktiv2).astype(int)
dailycases1= [0] * len1
dailydeaths1= [0] * len1
for n in range(1,(len1-1)):
dailycases1[n]=konf1[n]-konf1[n-1]
if (dailycases1[n]<0): dailycases1[n]=0
for n in range(1,(len1-1)):
dailydeaths1[n]=death1[n]-death1[n-1]
if (dailydeaths1[n]<0): dailydeaths1[n]=0
#quit(-1)
df.insert (2, "Daily_Cases", dailycases1)
df.insert (3, "Daily_Deaths", dailydeaths1)
df['ActiveEst']=aktiv2
#print (df)
dfout = df'Date', 'Confirmed','Deaths','Recovered', 'ActiveEst','Daily_Cases','Daily_Deaths'
#print(df)
#print(dfout)
print(".")
return(dfout)
def load_fin_wiki_data():
url="https://fi.wikipedia.org/wiki/Suomen_koronaviruspandemian_aikajana"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
table = soup.find_all('table')[0] # Grab the first table
df = pd.read_html(str(table))[0]
#print(df)
#Päivä Tapauksia Uusia tapauksia Sairaalassa Teholla Kuolleita Uusia kuolleita Toipuneita
df2 = df'Tapauksia','Uusia tapauksia','Sairaalassa','Teholla','Kuolleita','Uusia kuolleita','Toipuneita'
kaikkiatapauksia=df['Tapauksia']
toipuneita=df['Toipuneita']
uusiatapauksia=df['Uusia tapauksia']
sairaalassa=df['Sairaalassa']
teholla=df['Teholla']
kuolleita=df['Kuolleita']
uusiakuolleita=df['Uusia kuolleita']
len1=len(kaikkiatapauksia)
kaikkiatapauksia2=[]
toipuneita2=[]
uusiatapauksia2=[]
sairaalassa2=[]
teholla2=[]
kuolleita2=[]
uusiakuolleita2=[]
for n in range(0,len1):
elem0=kaikkiatapauksia[n]
elem1 = .join(c for c in elem0 if c.isdigit())
elem2=int(elem1)
kaikkiatapauksia2.append(elem2)
elem0=toipuneita[n]
elem1 = .join(c for c in elem0 if c.isdigit())
toipuneita2.append(int(elem1))
elem0=uusiatapauksia[n]
elem1 = .join(c for c in elem0 if c.isdigit())
uusiatapauksia2.append(int(elem1))
elem0=sairaalassa[n]
#elem1 = .join(c for c in elem0 if c.isdigit())
sairaalassa2.append(int(elem0))
elem0=teholla[n]
#elem1 = .join(c for c in elem0 if c.isdigit())
teholla2.append(int(elem0))
elem0=kuolleita[n]
#elem1 = .join(c for c in elem0 if c.isdigit())
kuolleita2.append(int(elem0))
elem0=uusiakuolleita[n]
#elem1 = .join(c for c in elem0 if c.isdigit())
uusiakuolleita2.append(int(elem0))
#kaikkiatapauksia3=np.array(kaikkiatapauksia2).astype(int)
#print("---")
#print(kaikkiatapauksia2)
#print(toipuneita2)
kaikkiatapauksia3=np.array(kaikkiatapauksia2).astype(int)
toipuneita3=np.array(toipuneita2).astype(int)
uusiatapauksia3=np.array(uusiatapauksia2).astype(int)
sairaalassa3=np.array(sairaalassa2).astype(int)
teholla3=np.array(teholla2).astype(int)
kuolleita3=np.array(kuolleita2) .astype(int)
uusiakuolleita3=np.array(uusiakuolleita2).astype(int)
napapaiva1 = np.datetime64("2020-04-01")
timedelta1= np.timedelta64(len(kaikkiatapauksia3),'D')
napapaiva2 = napapaiva1+timedelta1
#dada1 = np.linspace(napapaiva1.astype('f8'), napapaiva2.astype('f8'), dtype='<M8[D]')
dada1 = pd.date_range(napapaiva1, napapaiva2, periods=len(kaikkiatapauksia3)).to_pydatetime()
#print(dada1)
data = {'Date':dada1,
'Kaikkia tapauksia':kaikkiatapauksia3,
"Uusia tapauksia":uusiatapauksia3,
"Sairaalassa":sairaalassa3,
"Teholla":teholla3,
"Kuolleita":kuolleita3,
"Uusiakuolleita":uusiakuolleita3,
"Toipuneita":toipuneita3
}
df2 = pd.DataFrame(data)
#print(kaikkiatapauksia3)
#print ("Fin wiki data.")
return(df2)
- main proge
- df=load_fin_wiki_data()
df=load_country_cases("Finland")
- print(df)
- quit(-1)
df2=cut_by_dates(df, paiva1,paiva2)
- print(df2)
- quit(-1)
dates0=df2['Date']
dailycases1=df2['Daily_Cases']
dailydeaths1=df2['Daily_Deaths']
- cases0=df2['Daily_Cases']
- dailycases1=df2['Uusia tapauksia']
- dailydeaths1=df2['Uusiakuolleita']
daily1=dailycases1
x=dates0
moving7a=smooth(np.array(daily1), window="hamming")
- print (moving7a)
- moving7=as.np.array(moving7a)
moving71=moving7a.astype(int)
- print(moving71)
- exit(-1)
- calculate_r0(0, 1, 1, 100)
- r0s1=calculate_multiple_r0(daily1)
r0s1=calculate_multiple_r0(moving71)
r0s2=np.convolve(r0s1, np.ones((14,))/14, mode='valid')
r0s2a=np.round(r0s2,3)
r0s4=np.convolve(r0s2a, np.ones((7,))/7, mode='valid')
len1=len(dates0)
hooline=[1]*len1
print(r0s1)
fig, ax = plt.subplots(constrained_layout=True)
ax.legend(fontsize=14)
- secax = ax.secondary_xaxis('top')
- secax.set_xlabel('paivia')
plt.title("Koronaviruksen R0 Suomessa",fontsize=22)
plt.xlabel('Pvm (2020 - 2021)',fontsize=18)
plt.ylabel('Tarttuvuus R0',fontsize=18)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d.%m'))
- plt.gca().xaxis.set_major_locator(mdates.DayLocator())
- plt.gca().xaxis.set_major_locator(mdates.WeekdayLocator(interval=1))
plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=1))
- plt.hlines(1,0,200)
plt.plot(x,r0s2a, linewidth=3, color="Blue")
plt.plot(x,hooline, "--", linewidth=3, color="green" )
plt.gcf().autofmt_xdate()
- plt.plot(dates4, daily1)
- plt.ylim(0.0,3.0)
- plt.xticks(x, dates3, fontsize=14, rotation=70)
- plt.xticks(np.arange(0, len1, 10))
print (len(daily1))
print(len(r0s2))
print ("Test EXIT_")
- plt.xticks(np.arange(0, len1, 10))
plt.show()
Licensing
[edit]- You are free:
- to share – to copy, distribute and transmit the work
- to remix – to adapt the work
- Under the following conditions:
- attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
- share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.
File history
Click on a date/time to view the file as it appeared at that time.
Date/Time | Thumbnail | Dimensions | User | Comment | |
---|---|---|---|---|---|
current | 08:25, 9 August 2021 | 928 × 468 (51 KB) | Merikanto (talk | contribs) | Update | |
12:51, 30 May 2021 | 886 × 464 (48 KB) | Merikanto (talk | contribs) | Update | ||
11:52, 22 April 2021 | 840 × 401 (46 KB) | Merikanto (talk | contribs) | update | ||
12:40, 23 March 2021 | 1,008 × 386 (45 KB) | Merikanto (talk | contribs) | Update | ||
19:06, 26 February 2021 | 800 × 432 (45 KB) | Merikanto (talk | contribs) | Upload | ||
10:27, 12 January 2021 | 819 × 460 (42 KB) | Merikanto (talk | contribs) | Upload | ||
13:49, 11 January 2021 | 909 × 434 (38 KB) | Merikanto (talk | contribs) | Update of layout | ||
10:14, 18 December 2020 | 850 × 394 (42 KB) | Merikanto (talk | contribs) | Update | ||
11:48, 4 November 2020 | 576 × 432 (40 KB) | Merikanto (talk | contribs) | Update | ||
12:14, 18 September 2020 | 975 × 551 (38 KB) | Merikanto (talk | contribs) | Update 18.9.2020 |
You cannot overwrite this file.
File usage on Commons
There are no pages that use this file.
Metadata
This file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.
Width | 742.32pt |
---|---|
Height | 374.4pt |