Objective of the Notebook

In this work the objective is to understand outbreak of COVID-19 in Nigeria, I carryout a Comparison of the cases in Nigeria with other African Countries, Futhermore I carryout a Comparison with worst affected countries in Europe and America and finally used Machine Learning and Time Series Forecasting models to give a short-term forecast.

Let's get started

Importing required Python Packages and Libraries

In [19]:
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import datetime as dt
from datetime import timedelta
from sklearn.preprocessing import PolynomialFeatures 
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVR
from statsmodels.tsa.api import Holt,SimpleExpSmoothing,ExponentialSmoothing
from sklearn.metrics import mean_squared_error,r2_score
import statsmodels.api as sm
from fbprophet import Prophet

The dataset is obtained from the World Health Organization Records

In [20]:
covid=pd.read_csv("../input/novel-corona-virus-2019-dataset/covid_19_data.csv")
covid.head()
Out[20]:
SNo ObservationDate Province/State Country/Region Last Update Confirmed Deaths Recovered
0 1 01/22/2020 Anhui Mainland China 1/22/2020 17:00 1.0 0.0 0.0
1 2 01/22/2020 Beijing Mainland China 1/22/2020 17:00 14.0 0.0 0.0
2 3 01/22/2020 Chongqing Mainland China 1/22/2020 17:00 6.0 0.0 0.0
3 4 01/22/2020 Fujian Mainland China 1/22/2020 17:00 1.0 0.0 0.0
4 5 01/22/2020 Gansu Mainland China 1/22/2020 17:00 0.0 0.0 0.0
In [21]:
#Extracting Nigeria's data 
covid_nigeria=covid[covid['Country/Region']=="Nigeria"]

#Extracting other countries for comparison of worst affected countries
covid_spain=covid[covid['Country/Region']=="Spain"]
covid_us=covid[covid['Country/Region']=="US"]
covid_italy=covid[covid['Country/Region']=="Italy"]
covid_iran=covid[covid['Country/Region']=="Iran"]
covid_france=covid[covid['Country/Region']=="France"]
covid_uk=covid[covid['Country/Region']=="UK"]

#Extracting data of other African countries
covid_ghana=covid[covid['Country/Region']=="Ghana"]
covid_south_africa=covid[covid['Country/Region']=="South Africa"]
covid_egypt=covid[covid['Country/Region']=="Egypt"]
covid_kenya=covid[covid['Country/Region']=="Kenya"]
covid_ethiopia=covid[covid["Country/Region"]=="Ethiopia"]
covid_senegal=covid[covid["Country/Region"]=="Senegal"]
In [22]:
#Converting the date into Datetime format
covid_nigeria["ObservationDate"]=pd.to_datetime(covid_nigeria["ObservationDate"])
covid_spain["ObservationDate"]=pd.to_datetime(covid_spain["ObservationDate"])
covid_us["ObservationDate"]=pd.to_datetime(covid_us["ObservationDate"])
covid_italy["ObservationDate"]=pd.to_datetime(covid_italy["ObservationDate"])
covid_iran["ObservationDate"]=pd.to_datetime(covid_iran["ObservationDate"])
covid_france["ObservationDate"]=pd.to_datetime(covid_france["ObservationDate"])
covid_uk["ObservationDate"]=pd.to_datetime(covid_uk["ObservationDate"])

covid_ghana["ObservationDate"]=pd.to_datetime(covid_ghana["ObservationDate"])
covid_south_africa["ObservationDate"]=pd.to_datetime(covid_south_africa["ObservationDate"])
covid_egypt["ObservationDate"]=pd.to_datetime(covid_egypt["ObservationDate"])
covid_kenya["ObservationDate"]=pd.to_datetime(covid_kenya["ObservationDate"])
covid_ethiopia["ObservationDate"]=pd.to_datetime(covid_ethiopia["ObservationDate"])
covid_senegal["ObservationDate"]=pd.to_datetime(covid_senegal["ObservationDate"])
In [23]:
#Grouping the data based on the Date 
nigeria_datewise=covid_nigeria.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
spain_datewise=covid_spain.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
us_datewise=covid_us.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
italy_datewise=covid_italy.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
iran_datewise=covid_iran.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
france_datewise=covid_france.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
uk_datewise=covid_uk.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})

ghana_datewise=covid_ghana.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
south_africa_datewise=covid_south_africa.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
egypt_datewise=covid_egypt.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
kenya_datewise=covid_kenya.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
ethiopia_datewise=covid_ethiopia.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
senegal_datewise=covid_senegal.groupby(["ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
In [24]:
#Adding week column to perfom weekly analysis further ahead
nigeria_datewise["WeekofYear"]=nigeria_datewise.index.weekofyear
spain_datewise["WeekofYear"]=spain_datewise.index.weekofyear
us_datewise["WeekofYear"]=us_datewise.index.weekofyear
italy_datewise["WeekofYear"]=italy_datewise.index.weekofyear
iran_datewise["WeekofYear"]=iran_datewise.index.weekofyear
france_datewise["WeekofYear"]=france_datewise.index.weekofyear
uk_datewise["WeekofYear"]=uk_datewise.index.weekofyear

ghana_datewise["WeekofYear"]=ghana_datewise.index.weekofyear
south_africa_datewise["WeekofYear"]=south_africa_datewise.index.weekofyear
egypt_datewise["WeekofYear"]=egypt_datewise.index.weekofyear
kenya_datewise["WeekofYear"]=kenya_datewise.index.weekofyear
ethiopia_datewise["WeekofYear"]=ethiopia_datewise.index.weekofyear
senegal_datewise["WeekofYear"]=senegal_datewise.index.weekofyear
In [25]:
nigeria_datewise["Days Since"]=(nigeria_datewise.index-nigeria_datewise.index[0])
nigeria_datewise["Days Since"]=nigeria_datewise["Days Since"].dt.days
In [26]:
grouped_country=covid.groupby(["Country/Region","ObservationDate"]).agg({"Confirmed":'sum',"Recovered":'sum',"Deaths":'sum'})
In [27]:
grouped_country["Active Cases"]=grouped_country["Confirmed"]-grouped_country["Recovered"]-grouped_country["Deaths"]
grouped_country["log_confirmed"]=np.log(grouped_country["Confirmed"])
grouped_country["log_active"]=np.log(grouped_country["Active Cases"])

Exploratory Data Analysis for Nigeria

In [28]:
print("Number of Confirmed Cases",nigeria_datewise["Confirmed"].iloc[-1])
print("Number of Recovered Cases",nigeria_datewise["Recovered"].iloc[-1])
print("Number of Death Cases",nigeria_datewise["Deaths"].iloc[-1])
print("Number of Active Cases",nigeria_datewise["Confirmed"].iloc[-1]-nigeria_datewise["Recovered"].iloc[-1]-nigeria_datewise["Deaths"].iloc[-1])
print("Number of Closed Cases",nigeria_datewise["Recovered"].iloc[-1]+nigeria_datewise["Deaths"].iloc[-1])
print("Approximate Number of Confirmed Cases per day",round(nigeria_datewise["Confirmed"].iloc[-1]/nigeria_datewise.shape[0]))
print("Approximate Number of Recovered Cases per day",round(nigeria_datewise["Recovered"].iloc[-1]/nigeria_datewise.shape[0]))
print("Approximate Number of Death Cases per day",round(nigeria_datewise["Deaths"].iloc[-1]/nigeria_datewise.shape[0]))
print("Number of New Cofirmed Cases in last 24 hours are",nigeria_datewise["Confirmed"].iloc[-1]-nigeria_datewise["Confirmed"].iloc[-2])
print("Number of New Recoverd Cases in last 24 hours are",nigeria_datewise["Recovered"].iloc[-1]-nigeria_datewise["Recovered"].iloc[-2])
print("Number of New Death Cases in last 24 hours are",nigeria_datewise["Deaths"].iloc[-1]-nigeria_datewise["Deaths"].iloc[-2])
Number of Confirmed Cases 11166.0
Number of Recovered Cases 3329.0
Number of Death Cases 315.0
Number of Active Cases 7522.0
Number of Closed Cases 3644.0
Approximate Number of Confirmed Cases per day 115.0
Approximate Number of Recovered Cases per day 34.0
Approximate Number of Death Cases per day 3.0
Number of New Cofirmed Cases in last 24 hours are 347.0
Number of New Recoverd Cases in last 24 hours are 89.0
Number of New Death Cases in last 24 hours are 1.0

Active Cases = Number of Confirmed Cases - Number of Recovered Cases - Number of Death Cases

Increase in number of Active Cases is probable an indication of Recovered case or Death case number is dropping in comparison to number of Confirmed Cases drastically. Will look for the conclusive evidence for the same in the notebook ahead.

In [29]:
plt.figure(figsize=(15,5))
sns.barplot(x=nigeria_datewise.index.date,y=nigeria_datewise["Confirmed"]-nigeria_datewise["Recovered"]-nigeria_datewise["Deaths"])
plt.xticks(rotation=90)
plt.ylabel("Number of Cases")
plt.xlabel("Date")
plt.title("Distribution of Number of Active Cases in Nigeria From Feb. 28th - May 5rd")
Out[29]:
Text(0.5, 1.0, 'Distribution of Number of Active Cases in Nigeria From Feb. 28th - May 5rd')

Closed Cases = Number of Recovered Cases + Number of Death Cases

Increase in number of Closed classes imply either more patients are getting recovered from the disease or more pepole are dying because of COVID-19. Will look for conclusive evidence ahead.

In [30]:
plt.figure(figsize=(15,5))
sns.barplot(x=nigeria_datewise.index.date,y=nigeria_datewise["Recovered"]+nigeria_datewise["Deaths"])
plt.xticks(rotation=90)
plt.ylabel("Number of Cases")
plt.xlabel("Date")
plt.title("Distribution of Number of Closed Cases in Nigeria From Feb. 28th - May 5rd")
Out[30]:
Text(0.5, 1.0, 'Distribution of Number of Closed Cases in Nigeria From Feb. 28th - May 5rd')

Growth Rate of Confirmed, Recoverd and Death Cases

In [31]:
plt.figure(figsize=(10,5))
plt.plot(nigeria_datewise["Confirmed"],label="Confirmed",marker='*')
plt.plot(nigeria_datewise["Recovered"],label="Recovered",marker='o')
plt.plot(nigeria_datewise["Deaths"],label="Deaths",marker="^")
plt.xticks(rotation=90)
plt.ylabel("Number of all Cases")
plt.xlabel("Date")
plt.title("Growth of different types of cases in Nigeria")
plt.legend()
Out[31]:
<matplotlib.legend.Legend at 0x7f1f5d16a518>

Almost Exponential growth of Confirmed Cases in comparison to Recovered and Death Cases is a conclusive evidence why there is increase in number of Active Cases.

Recovery and Mortality Rate

In [32]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
ax1.plot((nigeria_datewise["Recovered"]/nigeria_datewise["Confirmed"])*100,label="Recovery Rate",linewidth=3)
ax1.axhline(((nigeria_datewise["Recovered"]/nigeria_datewise["Confirmed"])*100).mean(),linestyle='--',color='black',label="Mean Recovery Rate")
ax1.set_xlabel("Date")
ax1.set_ylabel("Recovery Rate")
ax1.set_title("Recovery Rate of Nigeria over Date")
ax1.legend()
ax2.plot((nigeria_datewise["Deaths"]/nigeria_datewise["Confirmed"])*100,label="Mortality Rate",linewidth=3)
ax2.axhline(((nigeria_datewise["Deaths"]/nigeria_datewise["Confirmed"])*100).mean(),linestyle='--',color='black',label="Mean Mortality Rate")
ax2.set_xlabel("Date")
ax2.set_ylabel("Mortality Rate")
ax2.set_title("Mortality Rate of Nigeria over Date")
ax2.legend()
Out[32]:
<matplotlib.legend.Legend at 0x7f1f5d0f1f28>

Mortality rate = (Number of Death Cases / Number of Confirmed Cases) x 100

Recovery Rate= (Number of Recoverd Cases / Number of Confirmed Cases) x 100

Recovery Rate was initially very high when the number of positive (Confirmed) cases were low and showed a drastic drop with increasing number of cases. Increasing Mortality rate and dropped Recovery Rate is worrying sign for India.

Increasing Mortality Rate and very slowly increasing Recovery Rate is conclusive evidence for increase in number of Closed Cases

Slightly dipping Mortality Rate and increasing recovery rate is a positive sign

Growth Factor

Growth factor is the factor by which a quantity multiplies itself over time. The formula used is:

Formula: Every day's new (Confirmed,Recovered,Deaths) / new (Confirmed,Recovered,Deaths) on the previous day.

A growth factor above 1 indicates an increase correspoding cases.

A growth factor above 1 but trending downward is a positive sign, whereas a growth factor constantly above 1 is the sign of exponential growth.

A growth factor constant at 1 indicates there is no change in any kind of cases.

In [33]:
plt.figure(figsize=(14,6))
plt.plot(nigeria_datewise["Confirmed"]/nigeria_datewise["Confirmed"].shift(),linewidth=3,label="Growth Factor of Confirmed Cases")
plt.plot(nigeria_datewise["Recovered"]/nigeria_datewise["Recovered"].shift(),linewidth=3,label="Growth Factor of Recovered Cases")
plt.plot(nigeria_datewise["Deaths"]/nigeria_datewise["Deaths"].shift(),linewidth=3,label="Growth Factor of Death Cases")
plt.axhline(1,linestyle='--',color='black',label="Baseline")
plt.legend()
plt.title("Datewise Growth Factor of different types of Cases in Nigeria")
plt.xticks(rotation=90)
Out[33]:
(array([737485., 737499., 737516., 737530., 737546., 737560., 737577.]),
 <a list of 7 Text major ticklabel objects>)

Growth Factor of Recoverd Cases is constantly very close to 1 indicating the Recovery Rate very low which was high intially as discussed earlier, with Growth Factor of Confirmed and Death Cases well above 1 is an indication of considerable growth in both types of Cases.

In [34]:
plt.figure(figsize=(12,6))
plt.plot(nigeria_datewise["Confirmed"].diff().fillna(0),linewidth=3,label="Confirmed Cases")
plt.plot(nigeria_datewise["Recovered"].diff().fillna(0),linewidth=3,label="Recovered Cases")
plt.plot(nigeria_datewise["Deaths"].diff().fillna(0),linewidth=3,label="Death Cases")
plt.ylabel("Increase in Number of Cases")
plt.xlabel("Date")
plt.title("Daily increase in different types of cases in Nigeria")
plt.xticks(rotation=90)
plt.legend()
Out[34]:
<matplotlib.legend.Legend at 0x7f1f5cf97ba8>
In [35]:
week_num_nigeria=[]
nigeria_weekwise_confirmed=[]
nigeria_weekwise_recovered=[]
nigeria_weekwise_deaths=[]
w=1
for i in list(nigeria_datewise["WeekofYear"].unique()):
    nigeria_weekwise_confirmed.append(nigeria_datewise[nigeria_datewise["WeekofYear"]==i]["Confirmed"].iloc[-1])
    nigeria_weekwise_recovered.append(nigeria_datewise[nigeria_datewise["WeekofYear"]==i]["Recovered"].iloc[-1])
    nigeria_weekwise_deaths.append(nigeria_datewise[nigeria_datewise["WeekofYear"]==i]["Deaths"].iloc[-1])
    week_num_nigeria.append(w)
    w=w+1
In [36]:
plt.figure(figsize=(10,5))
plt.plot(week_num_nigeria,nigeria_weekwise_confirmed,linewidth=3,label="Weekly Growth of Confirmed Cases")
plt.plot(week_num_nigeria,nigeria_weekwise_recovered,linewidth=3,label="Weekly Growth of Recovered Cases")
plt.plot(week_num_nigeria,nigeria_weekwise_deaths,linewidth=3,label="Weekly Growth of Death Cases")
plt.xlabel('Week Number')
plt.ylabel("Number of Cases")
plt.title("Weekly Growth of different types of Cases in igeria")
plt.legend()
Out[36]:
<matplotlib.legend.Legend at 0x7f1f5cf05be0>
In [37]:
print("Average weekly increase in number of Confirmed Cases",round(pd.Series(nigeria_weekwise_confirmed).diff().fillna(0).mean()))
print("Average weekly increase in number of Recovered Cases",round(pd.Series(nigeria_weekwise_recovered).diff().fillna(0).mean()))
print("Average weekly increase in number of Death Cases",round(pd.Series(nigeria_weekwise_deaths).diff().fillna(0).mean()))

fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num_nigeria,y=pd.Series(nigeria_weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num_nigeria,y=pd.Series(nigeria_weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Week Number")
ax2.set_xlabel("Week Number")
ax1.set_ylabel("Number of Confirmed Cases")
ax2.set_ylabel("Number of Death Cases")
ax1.set_title("Nigeria's Weekwise increase in Number of Confirmed Cases")
ax2.set_title("Nigeria's Weekwise increase in Number of Death Cases")
Average weekly increase in number of Confirmed Cases 744
Average weekly increase in number of Recovered Cases 222
Average weekly increase in number of Death Cases 21
Out[37]:
Text(0.5, 1.0, "Nigeria's Weekwise increase in Number of Death Cases")

Week 14th has just started

Comparison of Nigeria with Some African Countries

In [38]:
n_countries=["Ghana","South Africa","Egypt","Kenya","Ethiopia","Senegal","Nigeria"]
comp_data=pd.concat([ghana_datewise.iloc[[-1]],south_africa_datewise.iloc[[-1]],egypt_datewise.iloc[[-1]],kenya_datewise.iloc[[-1]],
          ethiopia_datewise.iloc[[-1]],senegal_datewise.iloc[[-1]],nigeria_datewise.iloc[[-1]]])
comp_data.drop(["Days Since","WeekofYear"],1,inplace=True)
comp_data.index=n_countries
comp_data["Mortality"]=(comp_data["Deaths"]/comp_data["Confirmed"])*100
comp_data["Recovery"]=(comp_data["Recovered"]/comp_data["Confirmed"])*100
comp_data["Survival Probability"]=(1-(comp_data["Deaths"]/comp_data["Confirmed"]))*100
comp_data.sort_values(["Confirmed"],ascending=False)
Out[38]:
Confirmed Deaths Recovered Mortality Recovery Survival Probability
South Africa 37525.0 792.0 19682.0 2.110593 52.450366 97.889407
Egypt 28615.0 1088.0 7350.0 3.802202 25.685829 96.197798
Nigeria 11166.0 315.0 3329.0 2.821064 29.813720 97.178936
Ghana 8548.0 38.0 3132.0 0.444548 36.640150 99.555452
Senegal 3932.0 45.0 2063.0 1.144456 52.466938 98.855544
Kenya 2216.0 74.0 553.0 3.339350 24.954874 96.660650
Ethiopia 1486.0 17.0 246.0 1.144011 16.554509 98.855989
In [39]:
print("South Africa reported it's first confirm case on: ",south_africa_datewise.index[0].date())
print("Egypt reported it's first confirm case on: ",egypt_datewise.index[0].date())
print("Nigeria reported it's first confirm case on: ",nigeria_datewise.index[0].date())
print("Ghana reported it's first confirm case on: ",ghana_datewise.index[0].date())
print("Senegal reported it's first confirm case on: ",senegal_datewise.index[0].date())
print("Kenya reported it's first confirm case on: ",kenya_datewise.index[0].date())
print("Ethiopia reported it's first confirm case on: ",ethiopia_datewise.index[0].date())
South Africa reported it's first confirm case on:  2020-03-05
Egypt reported it's first confirm case on:  2020-02-14
Nigeria reported it's first confirm case on:  2020-02-28
Ghana reported it's first confirm case on:  2020-03-14
Senegal reported it's first confirm case on:  2020-03-02
Kenya reported it's first confirm case on:  2020-03-13
Ethiopia reported it's first confirm case on:  2020-03-13

First Deaths

In [40]:
print("South Africa reported it's first death case on: ",south_africa_datewise[south_africa_datewise["Deaths"]>0].index[0].date())
print("Egypt reported it's first death case on: ",egypt_datewise[egypt_datewise["Deaths"]>0].index[0].date())
print("Nigeria reported it's first death case on: ",nigeria_datewise[nigeria_datewise["Deaths"]>0].index[0].date())
print("Ghana reported it's first death case on: ",ghana_datewise[ghana_datewise["Deaths"]>0].index[0].date())
print("Senegal reported it's first death case on: ",senegal_datewise[senegal_datewise["Deaths"]>0].index[0].date())
print("Kenya reported it's first death case on: ",kenya_datewise[kenya_datewise["Deaths"]>0].index[0].date())
print("Ethiopia reported it's first death case on: ",ethiopia_datewise[ethiopia_datewise["Deaths"]>0].index[0].date())
South Africa reported it's first death case on:  2020-03-27
Egypt reported it's first death case on:  2020-03-08
Nigeria reported it's first death case on:  2020-03-23
Ghana reported it's first death case on:  2020-03-21
Senegal reported it's first death case on:  2020-04-01
Kenya reported it's first death case on:  2020-03-26
Ethiopia reported it's first death case on:  2020-04-05
In [41]:
plt.figure(figsize=(12,6))
plt.plot(np.log(south_africa_datewise["Confirmed"]),linewidth=3,label="Confirmed Cases South Africa")
plt.plot(np.log(egypt_datewise["Confirmed"]),linewidth=3,label="Confirmed Cases Egypt")
plt.plot(np.log(ghana_datewise["Confirmed"]),linewidth=3,label="Confirmed Cases Ghana")
plt.plot(np.log(senegal_datewise["Confirmed"]),linewidth=3,label="Confirmed Cases Senegal")
plt.plot(np.log(kenya_datewise["Confirmed"]),linewidth=3,label="Confirmed Cases Kenya")
plt.plot(np.log(ethiopia_datewise["Confirmed"]),linewidth=3,label="Confirmed Cases Ethiopia")
plt.plot(np.log(nigeria_datewise["Confirmed"]),linewidth=3,label="Confirmed Cases Nigeria")
plt.legend(loc=2)
plt.title("Confirmed Cases plot for Selected African Countries  (Logarithmic Scale)")
Out[41]:
Text(0.5, 1.0, 'Confirmed Cases plot for Selected African Countries  (Logarithmic Scale)')
In [42]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(18,5))
mean_mortality=[((ghana_datewise["Deaths"]/ghana_datewise["Confirmed"])*100).mean(),((south_africa_datewise["Deaths"]/south_africa_datewise["Confirmed"])*100).mean(),
               ((egypt_datewise["Deaths"]/egypt_datewise["Confirmed"])*100).mean(),((kenya_datewise["Deaths"]/kenya_datewise["Confirmed"])*100).mean(),
               ((ethiopia_datewise["Deaths"]/ethiopia_datewise["Confirmed"])*100).mean(),((senegal_datewise["Deaths"]/senegal_datewise["Confirmed"])*100).mean(),
               ((nigeria_datewise["Deaths"]/nigeria_datewise["Confirmed"])*100).mean()]
mean_recovery=[((ghana_datewise["Recovered"]/ghana_datewise["Confirmed"])*100).mean(),((south_africa_datewise["Recovered"]/south_africa_datewise["Confirmed"])*100).mean(),
               ((egypt_datewise["Recovered"]/egypt_datewise["Confirmed"])*100).mean(),((kenya_datewise["Recovered"]/kenya_datewise["Confirmed"])*100).mean(),
               ((ethiopia_datewise["Recovered"]/ethiopia_datewise["Confirmed"])*100).mean(),((senegal_datewise["Recovered"]/senegal_datewise["Confirmed"])*100).mean(),
               ((nigeria_datewise["Recovered"]/nigeria_datewise["Confirmed"])*100).mean()]

comp_data["Mean Mortality Rate"]=mean_mortality
comp_data["Mean Recovery Rate"]=mean_recovery


sns.barplot(x=comp_data["Mean Mortality Rate"],y=comp_data.index,ax=ax1)
ax1.set_title("Mean Mortatlity Rate of Other African Countries")
ax1.set_ylabel("Country Name")
ax1.set_xlabel("Mortality Rate")
sns.barplot(x=comp_data["Mean Recovery Rate"],y=comp_data.index,ax=ax2)
ax2.set_title("Mean Recovery Rate of Other African Countries")
ax2.set_ylabel("Country Name")
ax2.set_xlabel("Recovery Rate")
Out[42]:
Text(0.5, 0, 'Recovery Rate')
In [43]:
country_names=["Spain","US","Italy","Iran","France","UK","Nigeria"]
country_data=pd.concat([spain_datewise.iloc[[-1]],us_datewise.iloc[[-1]],italy_datewise.iloc[[-1]],iran_datewise.iloc[[-1]],
          france_datewise.iloc[[-1]],uk_datewise.iloc[[-1]],nigeria_datewise.iloc[[-1]]])
country_data=country_data.drop(["Days Since","WeekofYear"],1)
country_data["Mortality"]=(country_data["Deaths"]/country_data["Confirmed"])*100
country_data["Recovery"]=(country_data["Recovered"]/country_data["Confirmed"])*100
country_data.index=country_names
country_data
Out[43]:
Confirmed Deaths Recovered Mortality Recovery
Spain 240326.0 27128.0 150376.0 11.288000 62.571673
US 1851520.0 107175.0 479258.0 5.788487 25.884571
Italy 233836.0 33601.0 160938.0 14.369473 68.825160
Iran 160696.0 8012.0 125206.0 4.985812 77.914821
France 192330.0 29024.0 69573.0 15.090729 36.173764
UK 281270.0 39811.0 1212.0 14.154016 0.430903
Nigeria 11166.0 315.0 3329.0 2.821064 29.813720
In [44]:
max_confirm_nigeria=nigeria_datewise["Confirmed"].iloc[-1]
print("It took",spain_datewise[(spain_datewise["Confirmed"]>0)&(spain_datewise["Confirmed"]<=max_confirm_nigeria)].shape[0],"days in Spain to reach number of Confirmed Cases equivalent to Nigeria")
print("It took",us_datewise[(us_datewise["Confirmed"]>0)&(us_datewise["Confirmed"]<=max_confirm_nigeria)].shape[0],"days in USA to reach number of Confirmed Cases equivalent to Nigeria")
print("It took",italy_datewise[(italy_datewise["Confirmed"]>0)&(italy_datewise["Confirmed"]<=max_confirm_nigeria)].shape[0],"days in Italy to reach number of Confirmed Cases equivalent to Nigeria")
print("It took",iran_datewise[(iran_datewise["Confirmed"]>0)&(iran_datewise["Confirmed"]<=max_confirm_nigeria)].shape[0],"days in Iran to reach number of Confirmed Cases equivalent to Nigeria")
print("It took",france_datewise[(france_datewise["Confirmed"]>0)&(france_datewise["Confirmed"]<=max_confirm_nigeria)].shape[0],"days in France to reach number of Confirmed Cases equivalent to Nigeria")
print("It took",uk_datewise[(uk_datewise["Confirmed"]>0)&(uk_datewise["Confirmed"]<=max_confirm_nigeria)].shape[0],"days in United Kingdom to reach number of Confirmed Cases equivalent to Nigeria")
print("It took",nigeria_datewise[nigeria_datewise["Confirmed"]>0].shape[0],"days in India to reach",max_confirm_nigeria,"Confirmed Cases")

plt.figure(figsize=(12,6))
max_confirm_nigeria=nigeria_datewise["Confirmed"].iloc[-1]
plt.plot(spain_datewise[spain_datewise["Confirmed"]<=max_confirm_nigeria]["Confirmed"],label="Confirmed Cases Spain",linewidth=3)
plt.plot(us_datewise[us_datewise["Confirmed"]<=max_confirm_nigeria]["Confirmed"],label="Confirmed Cases USA",linewidth=3)
plt.plot(italy_datewise[italy_datewise["Confirmed"]<=max_confirm_nigeria]["Confirmed"],label="Confirmed Cases Italy",linewidth=3)
plt.plot(iran_datewise[iran_datewise["Confirmed"]<=max_confirm_nigeria]["Confirmed"],label="Confirmed Cases Iran",linewidth=3)
plt.plot(france_datewise[france_datewise["Confirmed"]<=max_confirm_nigeria]["Confirmed"],label="Confirmed Cases France",linewidth=3)
plt.plot(uk_datewise[uk_datewise["Confirmed"]<=max_confirm_nigeria]["Confirmed"],label="Confirmed Cases UK",linewidth=3)
plt.plot(nigeria_datewise["Confirmed"],label="Confirmed Cases Nigeria",linewidth=3)
plt.ylabel("Number of Confirmed Cases")
plt.xlabel("Date")
plt.legend()
It took 45 days in Spain to reach number of Confirmed Cases equivalent to Nigeria
It took 57 days in USA to reach number of Confirmed Cases equivalent to Nigeria
It took 40 days in Italy to reach number of Confirmed Cases equivalent to Nigeria
It took 23 days in Iran to reach number of Confirmed Cases equivalent to Nigeria
It took 56 days in France to reach number of Confirmed Cases equivalent to Nigeria
It took 55 days in United Kingdom to reach number of Confirmed Cases equivalent to Nigeria
It took 97 days in India to reach 11166.0 Confirmed Cases
Out[44]:
<matplotlib.legend.Legend at 0x7f1f75f15198>

Weekly Comparisons

In [45]:
week_num_spain=[]
spain_weekwise_confirmed=[]
spain_weekwise_recovered=[]
spain_weekwise_deaths=[]
w=1
for i in list(spain_datewise["WeekofYear"].unique()):
    spain_weekwise_confirmed.append(spain_datewise[spain_datewise["WeekofYear"]==i]["Confirmed"].iloc[-1])
    spain_weekwise_recovered.append(spain_datewise[spain_datewise["WeekofYear"]==i]["Recovered"].iloc[-1])
    spain_weekwise_deaths.append(spain_datewise[spain_datewise["WeekofYear"]==i]["Deaths"].iloc[-1])
    week_num_spain.append(w)
    w=w+1

week_num_us=[]
us_weekwise_confirmed=[]
us_weekwise_recovered=[]
us_weekwise_deaths=[]
w=1
for i in list(us_datewise["WeekofYear"].unique()):
    us_weekwise_confirmed.append(us_datewise[us_datewise["WeekofYear"]==i]["Confirmed"].iloc[-1])
    us_weekwise_recovered.append(us_datewise[us_datewise["WeekofYear"]==i]["Recovered"].iloc[-1])
    us_weekwise_deaths.append(us_datewise[us_datewise["WeekofYear"]==i]["Deaths"].iloc[-1])
    week_num_us.append(w)
    w=w+1

week_num_italy=[]
italy_weekwise_confirmed=[]
italy_weekwise_recovered=[]
italy_weekwise_deaths=[]
w=1
for i in list(italy_datewise["WeekofYear"].unique()):
    italy_weekwise_confirmed.append(italy_datewise[italy_datewise["WeekofYear"]==i]["Confirmed"].iloc[-1])
    italy_weekwise_recovered.append(italy_datewise[italy_datewise["WeekofYear"]==i]["Recovered"].iloc[-1])
    italy_weekwise_deaths.append(italy_datewise[italy_datewise["WeekofYear"]==i]["Deaths"].iloc[-1])
    week_num_italy.append(w)
    w=w+1
    
week_num_iran=[]
iran_weekwise_confirmed=[]
iran_weekwise_recovered=[]
iran_weekwise_deaths=[]
w=1
for i in list(iran_datewise["WeekofYear"].unique()):
    iran_weekwise_confirmed.append(iran_datewise[iran_datewise["WeekofYear"]==i]["Confirmed"].iloc[-1])
    iran_weekwise_recovered.append(iran_datewise[iran_datewise["WeekofYear"]==i]["Recovered"].iloc[-1])
    iran_weekwise_deaths.append(iran_datewise[iran_datewise["WeekofYear"]==i]["Deaths"].iloc[-1])
    week_num_iran.append(w)
    w=w+1
    
week_num_france=[]
france_weekwise_confirmed=[]
france_weekwise_recovered=[]
france_weekwise_deaths=[]
w=1
for i in list(france_datewise["WeekofYear"].unique()):
    france_weekwise_confirmed.append(france_datewise[france_datewise["WeekofYear"]==i]["Confirmed"].iloc[-1])
    france_weekwise_recovered.append(france_datewise[france_datewise["WeekofYear"]==i]["Recovered"].iloc[-1])
    france_weekwise_deaths.append(france_datewise[france_datewise["WeekofYear"]==i]["Deaths"].iloc[-1])
    week_num_france.append(w)
    w=w+1
    
week_num_uk=[]
uk_weekwise_confirmed=[]
uk_weekwise_recovered=[]
uk_weekwise_deaths=[]
w=1
for i in list(uk_datewise["WeekofYear"].unique()):
    uk_weekwise_confirmed.append(uk_datewise[uk_datewise["WeekofYear"]==i]["Confirmed"].iloc[-1])
    uk_weekwise_recovered.append(uk_datewise[uk_datewise["WeekofYear"]==i]["Recovered"].iloc[-1])
    uk_weekwise_deaths.append(uk_datewise[uk_datewise["WeekofYear"]==i]["Deaths"].iloc[-1])
    week_num_uk.append(w)
    w=w+1

week_num_nigeria=[]
nigeria_weekwise_confirmed=[]
nigeria_weekwise_recovered=[]
nigeria_weekwise_deaths=[]
w=1
for i in list(nigeria_datewise["WeekofYear"].unique()):
    nigeria_weekwise_confirmed.append(nigeria_datewise[nigeria_datewise["WeekofYear"]==i]["Confirmed"].iloc[-1])
    nigeria_weekwise_recovered.append(nigeria_datewise[nigeria_datewise["WeekofYear"]==i]["Recovered"].iloc[-1])
    nigeria_weekwise_deaths.append(nigeria_datewise[uk_datewise["WeekofYear"]==i]["Deaths"].iloc[-1])
    week_num_nigeria.append(w)
    w=w+1

plt.figure(figsize=(12,6))
plt.plot(week_num_spain,spain_weekwise_confirmed,linewidth=3,label="Confirmed Cases Spain")
plt.plot(week_num_us,us_weekwise_confirmed,linewidth=3,label="Confirmed Cases USA")
plt.plot(week_num_italy,italy_weekwise_confirmed,linewidth=3,label="Confirmed Cases Italy")
plt.plot(week_num_iran,iran_weekwise_confirmed,linewidth=3,label="Confirmed Cases Iran")
plt.plot(week_num_france,france_weekwise_confirmed,linewidth=3,label="Confirmed Cases France")
plt.plot(week_num_uk,uk_weekwise_confirmed,linewidth=3,label="Confirmed Cases UK")
plt.plot(week_num_nigeria,nigeria_weekwise_confirmed,linewidth=3,label="Confirmed Cases Nigeria")
plt.title("Weekly Growth of Confirmed Cases")
plt.xlabel("Week Number")
plt.ylabel("Number of Confirmed Cases")
plt.legend()
Out[45]:
<matplotlib.legend.Legend at 0x7f1f9334e940>
In [46]:
fig, ((ax1,ax2,ax3),(ax4,ax5,ax6)) = plt.subplots(2, 3,figsize=(20,10))
sns.barplot(week_num_spain,pd.Series(spain_weekwise_confirmed).diff().fillna(0),ax=ax1)
ax1.set_title("Weekly increase in confirmed Cases in Spain")
ax1.set_ylabel("Number of Confirmed Cases")
ax1.set_xlabel("Week Number")
sns.barplot(week_num_us,pd.Series(us_weekwise_confirmed).diff().fillna(0),ax=ax2)
ax2.set_title("Weekly increase in confirmed Cases in USA")
sns.barplot(week_num_italy,pd.Series(italy_weekwise_confirmed).diff().fillna(0),ax=ax3)
ax3.set_title("Weekly increase in confirmed Cases in Italy")
sns.barplot(week_num_iran,pd.Series(iran_weekwise_confirmed).diff().fillna(0),ax=ax4)
ax4.set_title("Weekly increase in confirmed Cases in Iran")
ax4.set_ylabel("Number of Confirmed Cases")
ax4.set_xlabel("Week Number")
sns.barplot(week_num_france,pd.Series(france_weekwise_confirmed).diff().fillna(0),ax=ax5)
ax5.set_title("Weekly increase in confirmed Cases in France")
sns.barplot(week_num_uk,pd.Series(uk_weekwise_confirmed).diff().fillna(0),ax=ax6)
ax6.set_title("Weekly increase in confirmed Cases in UK")
Out[46]:
Text(0.5, 1.0, 'Weekly increase in confirmed Cases in UK')

Machine Learning Predictions

In [47]:
train_ml=nigeria_datewise.iloc[:int(nigeria_datewise.shape[0]*0.95)]
valid_ml=nigeria_datewise.iloc[int(nigeria_datewise.shape[0]*0.95):]
model_scores=[]
In [48]:
poly = PolynomialFeatures(degree = 9) 
In [49]:
train_poly=poly.fit_transform(np.array(train_ml["Days Since"]).reshape(-1,1))
valid_poly=poly.fit_transform(np.array(valid_ml["Days Since"]).reshape(-1,1))
y=train_ml["Confirmed"]
In [50]:
linreg=LinearRegression(normalize=True)
linreg.fit(train_poly,y)
Out[50]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=True)
In [51]:
prediction_poly=linreg.predict(valid_poly)
rmse_poly=np.sqrt(mean_squared_error(valid_ml["Confirmed"],prediction_poly))
model_scores.append(rmse_poly)
print("Root Mean Squared Error for Polynomial Regression: ",rmse_poly)
Root Mean Squared Error for Polynomial Regression:  154.79122346293605
In [52]:
comp_data=poly.fit_transform(np.array(nigeria_datewise["Days Since"]).reshape(-1,1))
plt.figure(figsize=(11,6))
predictions_poly=linreg.predict(comp_data)
plt.plot(nigeria_datewise["Confirmed"],label="Train Confirmed Cases",linewidth=3)
plt.plot(nigeria_datewise.index,predictions_poly, linestyle='--',label="Best Fit for Polynomial Regression",color='black')
plt.xlabel('Time')
plt.ylabel('Confirmed Cases')
plt.title("Confirmed Cases Polynomial Regression Prediction")
plt.xticks(rotation=90)
plt.legend()
Out[52]:
<matplotlib.legend.Legend at 0x7f1f5c242048>
In [53]:
new_date=[]
new_prediction_poly=[]
for i in range(1,18):
    new_date.append(nigeria_datewise.index[-1]+timedelta(days=i))
    new_date_poly=poly.fit_transform(np.array(nigeria_datewise["Days Since"].max()+i).reshape(-1,1))
    new_prediction_poly.append(linreg.predict(new_date_poly)[0])
In [54]:
model_predictions=pd.DataFrame(zip(new_date,new_prediction_poly),columns=["Date","Polynomial Regression Prediction"])
model_predictions.head(20)
Out[54]:
Date Polynomial Regression Prediction
0 2020-06-04 11406.423481
1 2020-06-05 11699.589635
2 2020-06-06 11938.812156
3 2020-06-07 12100.642951
4 2020-06-08 12156.170057
5 2020-06-09 12070.186614
6 2020-06-10 11800.274780
7 2020-06-11 11295.798881
8 2020-06-12 10496.801803
9 2020-06-13 9332.798440
10 2020-06-14 7721.459727
11 2020-06-15 5567.180583
12 2020-06-16 2759.524806
13 2020-06-17 -828.460279
14 2020-06-18 -5342.066880
15 2020-06-19 -10946.895220
16 2020-06-20 -17830.975460

Support Vector Machine

In [55]:
train_ml=nigeria_datewise.iloc[:int(nigeria_datewise.shape[0]*0.95)]
valid_ml=nigeria_datewise.iloc[int(nigeria_datewise.shape[0]*0.95):]
In [56]:
svm=SVR(C=1,degree=6,kernel='poly')
In [57]:
svm.fit(np.array(train_ml["Days Since"]).reshape(-1,1),train_ml["Confirmed"])
Out[57]:
SVR(C=1, cache_size=200, coef0=0.0, degree=6, epsilon=0.1, gamma='scale',
    kernel='poly', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
In [58]:
prediction_svm=svm.predict(np.array(valid_ml["Days Since"]).reshape(-1,1))
rmse_svm=np.sqrt(mean_squared_error(prediction_svm,valid_ml["Confirmed"]))
model_scores.append(rmse_svm)
print("Root Mean Square Error for SVR Model: ",rmse_svm)
Root Mean Square Error for SVR Model:  4232.85100071331
In [59]:
plt.figure(figsize=(11,6))
predictions=svm.predict(np.array(nigeria_datewise["Days Since"]).reshape(-1,1))
plt.plot(nigeria_datewise["Confirmed"],label="Train Confirmed Cases",linewidth=3)
plt.plot(nigeria_datewise.index,predictions, linestyle='--',label="Best Fit for SVR",color='black')
plt.xlabel('Time')
plt.ylabel('Confirmed Cases')
plt.title("Confirmed Cases Support Vector Machine Regressor Prediction")
plt.xticks(rotation=90)
plt.legend()
Out[59]:
<matplotlib.legend.Legend at 0x7f1f5c229c50>
In [60]:
new_date=[]
new_prediction_svm=[]
for i in range(1,18):
    new_date.append(nigeria_datewise.index[-1]+timedelta(days=i))
    new_prediction_svm.append(svm.predict(np.array(nigeria_datewise["Days Since"].max()+i).reshape(-1,1))[0])
In [61]:
model_predictions["SVM Prediction"]=new_prediction_svm
model_predictions.head(20)
Out[61]:
Date Polynomial Regression Prediction SVM Prediction
0 2020-06-04 11406.423481 17610.941709
1 2020-06-05 11699.589635 18717.890762
2 2020-06-06 11938.812156 19882.780819
3 2020-06-07 12100.642951 21108.013136
4 2020-06-08 12156.170057 22396.062848
5 2020-06-09 12070.186614 23749.480463
6 2020-06-10 11800.274780 25170.893382
7 2020-06-11 11295.798881 26663.007425
8 2020-06-12 10496.801803 28228.608381
9 2020-06-13 9332.798440 29870.563562
10 2020-06-14 7721.459727 31591.823384
11 2020-06-15 5567.180583 33395.422953
12 2020-06-16 2759.524806 35284.483674
13 2020-06-17 -828.460279 37262.214871
14 2020-06-18 -5342.066880 39331.915418
15 2020-06-19 -10946.895220 41496.975396
16 2020-06-20 -17830.975460 43760.877756

Time Series Forecasting Models

Holt's Linear Model

In [62]:
model_train=nigeria_datewise.iloc[:int(nigeria_datewise.shape[0]*0.95)]
valid=nigeria_datewise.iloc[int(nigeria_datewise.shape[0]*0.95):]
y_pred=valid.copy()
In [63]:
holt=Holt(np.asarray(model_train["Confirmed"])).fit(smoothing_level=0.2, smoothing_slope=1.1)
In [64]:
y_pred["Holt"]=holt.forecast(len(valid))
print("Root Mean Square Error Holt's Linear Model: ",np.sqrt(mean_squared_error(y_pred["Confirmed"],y_pred["Holt"])))
Root Mean Square Error Holt's Linear Model:  443.37270727385703
In [65]:
plt.figure(figsize=(10,5))
plt.plot(model_train.Confirmed,label="Train Set",marker='o')
valid.Confirmed.plot(label="Validation Set",marker='*')
y_pred.Holt.plot(label="Holt's Linear Model Predicted Set",marker='^')
plt.ylabel("Confirmed Cases")
plt.xlabel("Date Time")
plt.title("Confirmed Cases Holt's Linear Model Prediction Covid-19 Nigeria")
plt.xticks(rotation=90)
plt.legend()
Out[65]:
<matplotlib.legend.Legend at 0x7f1f5c1b1080>
In [66]:
holt_new_prediction=[]
for i in range(1,18):
    holt_new_prediction.append(holt.forecast((len(valid)+i))[-1])

model_predictions["Holt's Linear Model Prediction"]=holt_new_prediction
model_predictions.head(20)
Out[66]:
Date Polynomial Regression Prediction SVM Prediction Holt's Linear Model Prediction
0 2020-06-04 11406.423481 17610.941709 10911.717761
1 2020-06-05 11699.589635 18717.890762 11189.085042
2 2020-06-06 11938.812156 19882.780819 11466.452323
3 2020-06-07 12100.642951 21108.013136 11743.819604
4 2020-06-08 12156.170057 22396.062848 12021.186884
5 2020-06-09 12070.186614 23749.480463 12298.554165
6 2020-06-10 11800.274780 25170.893382 12575.921446
7 2020-06-11 11295.798881 26663.007425 12853.288727
8 2020-06-12 10496.801803 28228.608381 13130.656007
9 2020-06-13 9332.798440 29870.563562 13408.023288
10 2020-06-14 7721.459727 31591.823384 13685.390569
11 2020-06-15 5567.180583 33395.422953 13962.757850
12 2020-06-16 2759.524806 35284.483674 14240.125131
13 2020-06-17 -828.460279 37262.214871 14517.492411
14 2020-06-18 -5342.066880 39331.915418 14794.859692
15 2020-06-19 -10946.895220 41496.975396 15072.226973
16 2020-06-20 -17830.975460 43760.877756 15349.594254

Holt's Winter Model

In [67]:
model_train=nigeria_datewise.iloc[:int(nigeria_datewise.shape[0]*0.95)]
valid=nigeria_datewise.iloc[int(nigeria_datewise.shape[0]*0.95):]
y_pred=valid.copy()
In [68]:
es=ExponentialSmoothing(np.asarray(model_train['Confirmed']),seasonal_periods=3,trend='mul', seasonal='add').fit()
In [69]:
y_pred["Holt's Winter Model"]=es.forecast(len(valid))
In [70]:
print("Root Mean Square Error for Holt's Winter Model: ",np.sqrt(mean_squared_error(y_pred["Confirmed"],y_pred["Holt's Winter Model"])))
Root Mean Square Error for Holt's Winter Model:  193.58580316241452
In [71]:
plt.figure(figsize=(10,5))
plt.plot(model_train.Confirmed,label="Train Set",marker='o')
valid.Confirmed.plot(label="Validation Set",marker='*')
y_pred["Holt\'s Winter Model"].plot(label="Holt's Winter Model Predicted Set",marker='^')
plt.ylabel("Confirmed Cases")
plt.xlabel("Date Time")
plt.title("Confirmed Cases Holt's Winter Model Prediction Covid-19 in Nigeria")
plt.xticks(rotation=90)
plt.legend()
Out[71]:
<matplotlib.legend.Legend at 0x7f1f5c13cbe0>
In [72]:
holt_winter_new_prediction=[]
for i in range(1,18):
    holt_winter_new_prediction.append(es.forecast((len(valid)+i))[-1])
model_predictions["Holt's Winter Model Prediction"]=holt_winter_new_prediction
model_predictions.head(20)
Out[72]:
Date Polynomial Regression Prediction SVM Prediction Holt's Linear Model Prediction Holt's Winter Model Prediction
0 2020-06-04 11406.423481 17610.941709 10911.717761 11440.149349
1 2020-06-05 11699.589635 18717.890762 11189.085042 11829.654256
2 2020-06-06 11938.812156 19882.780819 11466.452323 12235.932460
3 2020-06-07 12100.642951 21108.013136 11743.819604 12658.675052
4 2020-06-08 12156.170057 22396.062848 12021.186884 13084.096790
5 2020-06-09 12070.186614 23749.480463 12298.554165 13527.350497
6 2020-06-10 11800.274780 25170.893382 12575.921446 13988.158468
7 2020-06-11 11295.798881 26663.007425 12853.288727 14452.767587
8 2020-06-12 10496.801803 28228.608381 13130.656007 14936.363747
9 2020-06-13 9332.798440 29870.563562 13408.023288 15438.703292
10 2020-06-14 7721.459727 31591.823384 13685.390569 15946.068155
11 2020-06-15 5567.180583 33395.422953 13962.757850 16473.680312
12 2020-06-16 2759.524806 35284.483674 14240.125131 17021.333254
13 2020-06-17 -828.460279 37262.214871 14517.492411 17575.347156
14 2020-06-18 -5342.066880 39331.915418 14794.859692 18150.983362
15 2020-06-19 -10946.895220 41496.975396 15072.226973 18748.075893
16 2020-06-20 -17830.975460 43760.877756 15349.594254 19352.986647

Facebook's Prophet Model

In [73]:
prophet_c=Prophet(interval_width=0.95,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(nigeria_datewise.index),list(nigeria_datewise["Confirmed"])),columns=['ds','y'])
In [74]:
prophet_c.fit(prophet_confirmed)
Out[74]:
<fbprophet.forecaster.Prophet at 0x7f1f5c08a710>
In [75]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [76]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [77]:
print("Root Mean Squared Error for Prophet Model: ",np.sqrt(mean_squared_error(nigeria_datewise["Confirmed"],confirmed_forecast['yhat'].head(nigeria_datewise.shape[0]))))
Root Mean Squared Error for Prophet Model:  92.04113805304142
In [78]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [79]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)
In [80]:
model_predictions["Prophet's Prediction"]=list(confirmed_forecast["yhat"].tail(17))
model_predictions["Prophet's Upper Bound"]=list(confirmed_forecast["yhat_upper"].tail(17))
model_predictions.head(20)
Out[80]:
Date Polynomial Regression Prediction SVM Prediction Holt's Linear Model Prediction Holt's Winter Model Prediction Prophet's Prediction Prophet's Upper Bound
0 2020-06-04 11406.423481 17610.941709 10911.717761 11440.149349 11148.831553 11334.729634
1 2020-06-05 11699.589635 18717.890762 11189.085042 11829.654256 11456.121762 11643.184117
2 2020-06-06 11938.812156 19882.780819 11466.452323 12235.932460 11751.132530 11935.756245
3 2020-06-07 12100.642951 21108.013136 11743.819604 12658.675052 12044.487517 12242.025539
4 2020-06-08 12156.170057 22396.062848 12021.186884 13084.096790 12330.660152 12534.004855
5 2020-06-09 12070.186614 23749.480463 12298.554165 13527.350497 12596.339628 12808.297254
6 2020-06-10 11800.274780 25170.893382 12575.921446 13988.158468 12903.862120 13146.240675
7 2020-06-11 11295.798881 26663.007425 12853.288727 14452.767587 13172.624447 13451.403218
8 2020-06-12 10496.801803 28228.608381 13130.656007 14936.363747 13479.914656 13817.004883
9 2020-06-13 9332.798440 29870.563562 13408.023288 15438.703292 13774.925424 14145.956434
10 2020-06-14 7721.459727 31591.823384 13685.390569 15946.068155 14068.280412 14458.039344
11 2020-06-15 5567.180583 33395.422953 13962.757850 16473.680312 14354.453047 14799.959848
12 2020-06-16 2759.524806 35284.483674 14240.125131 17021.333254 14620.132522 15106.532963
13 2020-06-17 -828.460279 37262.214871 14517.492411 17575.347156 14927.655015 15459.778219
14 2020-06-18 -5342.066880 39331.915418 14794.859692 18150.983362 15196.417341 15813.976428
15 2020-06-19 -10946.895220 41496.975396 15072.226973 18748.075893 15503.707550 16162.247443
16 2020-06-20 -17830.975460 43760.877756 15349.594254 19352.986647 15798.718318 16538.788735

Summarizing Results of all Models

In [81]:
model_predictions["Average of Predictions Models"]=model_predictions.mean(axis=1)
model_predictions.head(20)
Out[81]:
Date Polynomial Regression Prediction SVM Prediction Holt's Linear Model Prediction Holt's Winter Model Prediction Prophet's Prediction Prophet's Upper Bound Average of Predictions Models
0 2020-06-04 11406.423481 17610.941709 10911.717761 11440.149349 11148.831553 11334.729634 12308.798915
1 2020-06-05 11699.589635 18717.890762 11189.085042 11829.654256 11456.121762 11643.184117 12755.920929
2 2020-06-06 11938.812156 19882.780819 11466.452323 12235.932460 11751.132530 11935.756245 13201.811089
3 2020-06-07 12100.642951 21108.013136 11743.819604 12658.675052 12044.487517 12242.025539 13649.610633
4 2020-06-08 12156.170057 22396.062848 12021.186884 13084.096790 12330.660152 12534.004855 14087.030265
5 2020-06-09 12070.186614 23749.480463 12298.554165 13527.350497 12596.339628 12808.297254 14508.368103
6 2020-06-10 11800.274780 25170.893382 12575.921446 13988.158468 12903.862120 13146.240675 14930.891812
7 2020-06-11 11295.798881 26663.007425 12853.288727 14452.767587 13172.624447 13451.403218 15314.815047
8 2020-06-12 10496.801803 28228.608381 13130.656007 14936.363747 13479.914656 13817.004883 15681.558246
9 2020-06-13 9332.798440 29870.563562 13408.023288 15438.703292 13774.925424 14145.956434 15995.161740
10 2020-06-14 7721.459727 31591.823384 13685.390569 15946.068155 14068.280412 14458.039344 16245.176932
11 2020-06-15 5567.180583 33395.422953 13962.757850 16473.680312 14354.453047 14799.959848 16425.575765
12 2020-06-16 2759.524806 35284.483674 14240.125131 17021.333254 14620.132522 15106.532963 16505.355392
13 2020-06-17 -828.460279 37262.214871 14517.492411 17575.347156 14927.655015 15459.778219 16485.671232
14 2020-06-18 -5342.066880 39331.915418 14794.859692 18150.983362 15196.417341 15813.976428 16324.347560
15 2020-06-19 -10946.895220 41496.975396 15072.226973 18748.075893 15503.707550 16162.247443 16006.056339
16 2020-06-20 -17830.975460 43760.877756 15349.594254 19352.986647 15798.718318 16538.788735 15494.998375

Conclusion

The average of the prediction from the five models are evaluated for the period from the 4th to 20th of June, 2020 is a cumulative count of 15494 infection cases on the 20th of June, 2020 if no measures of curtailing it are put in place. These short-term forecasts models presented in this work can be useful for real-time preparedness by government and relevant authorities in Nigeria.

In [ ]: