Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9553fe8

Browse files
Add files via upload
1 parent a8ea1bb commit 9553fe8

File tree

5 files changed

+325
-0
lines changed

5 files changed

+325
-0
lines changed
40.8 KB
Loading[フレーム]
33.6 KB
Loading[フレーム]
42.9 KB
Loading[フレーム]

‎corona cases forecasting/main.py

Lines changed: 320 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,320 @@
1+
# importing libraries
2+
import numpy as np
3+
import pandas as pd
4+
import matplotlib.pyplot as plt
5+
import seaborn as sns
6+
import matplotlib.colors as mcolors
7+
import random
8+
import math
9+
import time
10+
from sklearn.metrics import mean_squared_error, mean_absolute_error
11+
from statsmodels.tsa.arima_model import ARIMA
12+
import datetime
13+
from datetime import date
14+
import operator
15+
import os
16+
import wget
17+
import warnings
18+
warnings.filterwarnings('ignore')
19+
plt.style.use('fivethirtyeight')
20+
from pmdarima import auto_arima
21+
##%matplotlib inline
22+
23+
24+
confirmed_cases = pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv')
25+
deaths_reported = pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv')
26+
recovered_cases = pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv')
27+
latest_data = pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/07-15-2020.csv')
28+
## attributes
29+
# Fetching all the columns from confirmed dataset
30+
cols = confirmed_cases.keys()
31+
# Extracting the date columns
32+
confirmed = confirmed_cases.loc[:, cols[4]:cols[-1]]
33+
deaths = deaths_reported.loc[:, cols[4]:cols[-1]]
34+
recoveries = recovered_cases.loc[:, cols[4]:cols[-1]]
35+
36+
# Range of date
37+
dates = confirmed.keys()
38+
39+
# Summary
40+
world_cases = []
41+
total_deaths = []
42+
mortality_rate = []
43+
recovery_rate = []
44+
total_recovered = []
45+
total_active = []
46+
47+
# Confirmed
48+
india_cases = []
49+
50+
# Death
51+
india_deaths = []
52+
53+
# Recovered
54+
india_recoveries = []
55+
56+
# Fill with the dataset
57+
for i in dates:
58+
india_cases.append(confirmed_cases[confirmed_cases['Country/Region'] == 'India'][i].sum())
59+
60+
india_deaths.append(deaths_reported[deaths_reported['Country/Region'] == 'India'][i].sum())
61+
62+
india_recoveries.append(recovered_cases[recovered_cases['Country/Region'] == 'India'][i].sum())
63+
64+
65+
def daily_increase(data):
66+
d = []
67+
for i in range(len(data)):
68+
if i == 0:
69+
d.append(data[0])
70+
else:
71+
d.append(data[i]-data[i-1])
72+
return d
73+
74+
75+
76+
77+
def fresh_cases():
78+
#confirmed cases
79+
india_daily_increase = daily_increase(india_cases)
80+
81+
# Dates pre processing
82+
days_since_1_22 = np.array([i for i in range(len(dates))]).reshape(-1, 1)
83+
84+
days_in_future = 0
85+
future_forecast = np.array([i for i in range(len(dates)+days_in_future)]).reshape(-1, 1)
86+
87+
start = '1/22/2020'
88+
start_date = datetime.datetime.strptime(start, '%m/%d/%Y')
89+
future_forecast_dates = []
90+
for i in range(len(future_forecast)):
91+
future_forecast_dates.append((start_date + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
92+
93+
dataCovid= pd.DataFrame({ 'Dates': future_forecast_dates , 'Daily Increase':india_daily_increase })
94+
95+
train = dataCovid[:int(0.7*(len(dataCovid)))]
96+
valid = dataCovid[int(0.7*(len(dataCovid))):]
97+
#preprocessing (since arima takes univariate series as input)
98+
train.drop('Dates',axis=1,inplace=True)
99+
valid.drop('Dates',axis=1,inplace=True)
100+
101+
model = auto_arima(train, trace=True, error_action='ignore', suppress_warnings=True)
102+
model.fit(train)
103+
104+
forecast = model.predict(n_periods=len(valid))
105+
forecast = pd.DataFrame(forecast,index = valid.index,columns=['Prediction'])
106+
107+
108+
def ARIMAmodel(series, order, days = 21):
109+
# Fitting and forecast the series
110+
train = [x for x in series]
111+
model = ARIMA(train, order = order)
112+
model_fit = model.fit(disp=0)
113+
forecast, err, ci = model_fit.forecast(steps = days, alpha = 0.05)
114+
start_day = date.today() + datetime.timedelta(days = 1)
115+
predictions_df = pd.DataFrame({'Forecast':forecast.round()}, index=pd.date_range(start = start_day, periods=days, freq='D'))
116+
return predictions_df, ci
117+
118+
119+
120+
new_positives = dataCovid['Daily Increase'].values
121+
order = {
122+
'new_positives': (2, 1, 5),
123+
124+
}
125+
new_positives_today=new_positives[-1]
126+
# Forecasting with ARIMA models
127+
new_positives_pred, new_positives_ci = ARIMAmodel(new_positives, order['new_positives'])
128+
casesY=[]
129+
datesX=[]
130+
list1 = new_positives_pred.iloc[: ,0]
131+
for i in range(0,21):
132+
casesY.append(list1[i])
133+
datesX.append((date.today()+ datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
134+
135+
# Plot Results for forecasted dates only (detailed)
136+
137+
plt.plot(datesX,casesY,color='red')
138+
plt.title('New active Cases Forecast')
139+
plt.xticks(rotation=90)
140+
# plt.figure(figsize=(22,22))
141+
plt.savefig("plot1.png",bbox_inches='tight')
142+
plt.autoscale()
143+
plt.show()
144+
145+
146+
147+
def death_cases():
148+
#confirmed cases
149+
india_daily_increase = daily_increase(india_deaths)
150+
151+
# Dates pre processing
152+
days_since_1_22 = np.array([i for i in range(len(dates))]).reshape(-1, 1)
153+
154+
days_in_future = 0
155+
future_forecast = np.array([i for i in range(len(dates)+days_in_future)]).reshape(-1, 1)
156+
157+
start = '1/22/2020'
158+
start_date = datetime.datetime.strptime(start, '%m/%d/%Y')
159+
future_forecast_dates = []
160+
for i in range(len(future_forecast)):
161+
future_forecast_dates.append((start_date + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
162+
163+
dataCovid= pd.DataFrame({ 'Dates': future_forecast_dates , 'Daily Increase':india_daily_increase })
164+
165+
train = dataCovid[:int(0.7*(len(dataCovid)))]
166+
valid = dataCovid[int(0.7*(len(dataCovid))):]
167+
#preprocessing (since arima takes univariate series as input)
168+
train.drop('Dates',axis=1,inplace=True)
169+
valid.drop('Dates',axis=1,inplace=True)
170+
171+
model = auto_arima(train, trace=True, error_action='ignore', suppress_warnings=True)
172+
model.fit(train)
173+
174+
forecast = model.predict(n_periods=len(valid))
175+
forecast = pd.DataFrame(forecast,index = valid.index,columns=['Prediction'])
176+
177+
178+
def ARIMAmodel(series, order, days = 21):
179+
# Fitting and forecast the series
180+
train = [x for x in series]
181+
model = ARIMA(train, order = order)
182+
model_fit = model.fit(disp=0)
183+
forecast, err, ci = model_fit.forecast(steps = days, alpha = 0.05)
184+
start_day = date.today() + datetime.timedelta(days = 1)
185+
predictions_df = pd.DataFrame({'Forecast':forecast.round()}, index=pd.date_range(start = start_day, periods=days, freq='D'))
186+
return predictions_df, ci
187+
188+
189+
190+
new_deaths = dataCovid['Daily Increase'].values
191+
order = {
192+
'new_deaths': (0, 1, 1),
193+
194+
}
195+
new_deaths_today=new_deaths[-1]
196+
# Forecasting with ARIMA models
197+
new_deaths_pred, new_deaths_ci = ARIMAmodel(new_deaths, order['new_deaths'])
198+
casesY=[]
199+
datesX=[]
200+
list1 = new_deaths_pred.iloc[: ,0]
201+
for i in range(0,21):
202+
casesY.append(list1[i])
203+
datesX.append((date.today()+ datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
204+
205+
# Plot Results for forecasted dates only (detailed)
206+
207+
plt.plot(datesX,casesY,color='red')
208+
plt.title('New death Cases Forecast')
209+
plt.xticks(rotation=90)
210+
# plt.figure(figsize=(22,22))
211+
plt.savefig("plot2.png",bbox_inches='tight')
212+
plt.autoscale()
213+
plt.show()
214+
215+
216+
217+
218+
def recovered_cases():
219+
#confirmed cases
220+
india_daily_increase = daily_increase(india_recoveries)
221+
222+
# Dates pre processing
223+
days_since_1_22 = np.array([i for i in range(len(dates))]).reshape(-1, 1)
224+
225+
days_in_future = 0
226+
future_forecast = np.array([i for i in range(len(dates)+days_in_future)]).reshape(-1, 1)
227+
228+
start = '1/22/2020'
229+
start_date = datetime.datetime.strptime(start, '%m/%d/%Y')
230+
future_forecast_dates = []
231+
for i in range(len(future_forecast)):
232+
future_forecast_dates.append((start_date + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
233+
234+
dataCovid= pd.DataFrame({ 'Dates': future_forecast_dates , 'Daily recoveries':india_daily_increase })
235+
236+
train = dataCovid[:int(0.7*(len(dataCovid)))]
237+
valid = dataCovid[int(0.7*(len(dataCovid))):]
238+
#preprocessing (since arima takes univariate series as input)
239+
train.drop('Dates',axis=1,inplace=True)
240+
valid.drop('Dates',axis=1,inplace=True)
241+
242+
model = auto_arima(train, trace=True, error_action='ignore', suppress_warnings=True)
243+
model.fit(train)
244+
245+
forecast = model.predict(n_periods=len(valid))
246+
forecast = pd.DataFrame(forecast,index = valid.index,columns=['Prediction'])
247+
248+
249+
def ARIMAmodel(series, order, days = 21):
250+
# Fitting and forecast the series
251+
train = [x for x in series]
252+
model = ARIMA(train, order = order)
253+
model_fit = model.fit(disp=0)
254+
forecast, err, ci = model_fit.forecast(steps = days, alpha = 0.05)
255+
start_day = date.today() + datetime.timedelta(days = 1)
256+
predictions_df = pd.DataFrame({'Forecast':forecast.round()}, index=pd.date_range(start = start_day, periods=days, freq='D'))
257+
return predictions_df, ci
258+
259+
260+
261+
new_recoveries = dataCovid['Daily recoveries'].values
262+
order = {
263+
'new_recoveries': (1, 1, 2),
264+
265+
}
266+
new_recoveries_today=new_recoveries[-1]
267+
# Forecasting with ARIMA models
268+
new_recoveries_pred, new_recoveries_ci = ARIMAmodel(new_recoveries, order['new_recoveries'])
269+
casesY=[]
270+
datesX=[]
271+
list1 = new_recoveries_pred.iloc[: ,0]
272+
for i in range(0,21):
273+
casesY.append(list1[i])
274+
datesX.append((date.today()+ datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
275+
276+
# Plot Results for forecasted dates only (detailed)
277+
278+
plt.plot(datesX,casesY,color='red')
279+
plt.title('New recovered Cases Forecast')
280+
plt.xticks(rotation=90)
281+
# plt.figure(figsize=(22,22))
282+
plt.savefig("plot3.png",bbox_inches='tight')
283+
plt.autoscale()
284+
plt.show()
285+
286+
287+
choice=input("F for fresh cases,D for death cases,R for recovered cases prediction")
288+
if choice=='F':
289+
fresh_cases()
290+
elif choice=='D':
291+
death_cases()
292+
elif choice=='R':
293+
recovered_cases()
294+
else:
295+
print("Enter a valid choice")
296+
297+
298+
299+
300+
301+
302+
303+
304+
305+
306+
307+
308+
309+
310+
311+
312+
313+
314+
315+
316+
317+
318+
319+
320+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
numpy==1.19.2
2+
pandas==1.1.3
3+
matplotlib==3.3.2
4+
statsmodels==0.12.2
5+
pmdarima==1.8.0

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /