10
10
plt .style .use ('fivethirtyeight' )
11
11
from pmdarima import auto_arima
12
12
13
-
14
13
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' )
15
14
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' )
16
15
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' )
22
21
confirmed = confirmed_cases .loc [:, cols [4 ]:cols [- 1 ]]
23
22
deaths = deaths_reported .loc [:, cols [4 ]:cols [- 1 ]]
24
23
recoveries = recovered_cases .loc [:, cols [4 ]:cols [- 1 ]]
25
-
26
24
# Range of date
27
25
dates = confirmed .keys ()
28
-
29
26
# Summary
30
27
world_cases = []
31
28
total_deaths = []
32
29
mortality_rate = []
33
30
recovery_rate = []
34
31
total_recovered = []
35
32
total_active = []
36
-
37
33
# Confirmed
38
34
india_cases = []
39
-
40
35
# Death
41
36
india_deaths = []
42
-
43
37
# Recovered
44
38
india_recoveries = []
45
-
46
39
# Fill with the dataset
47
40
for i in dates :
48
41
india_cases .append (confirmed_cases [confirmed_cases ['Country/Region' ] == 'India' ][i ].sum ())
49
-
50
42
india_deaths .append (deaths_reported [deaths_reported ['Country/Region' ] == 'India' ][i ].sum ())
51
-
52
43
india_recoveries .append (recovered_cases [recovered_cases ['Country/Region' ] == 'India' ][i ].sum ())
53
44
54
-
55
45
def daily_increase (data ):
56
46
d = []
57
47
for i in range (len (data )):
@@ -61,9 +51,6 @@ def daily_increase(data):
61
51
d .append (data [i ]- data [i - 1 ])
62
52
return d
63
53
64
-
65
-
66
-
67
54
def fresh_cases_daily ():
68
55
#confirmed cases
69
56
india_daily_increase = daily_increase (india_cases )
@@ -81,20 +68,16 @@ def fresh_cases_daily():
81
68
future_forecast_dates .append ((start_date + datetime .timedelta (days = i )).strftime ('%m/%d/%Y' ))
82
69
83
70
dataCovid = pd .DataFrame ({ 'Dates' : future_forecast_dates , 'Daily Increase' :india_daily_increase })
84
-
85
71
train = dataCovid [:int (0.7 * (len (dataCovid )))]
86
72
valid = dataCovid [int (0.7 * (len (dataCovid ))):]
87
73
#preprocessing (since arima takes univariate series as input)
88
74
train .drop ('Dates' ,axis = 1 ,inplace = True )
89
75
valid .drop ('Dates' ,axis = 1 ,inplace = True )
90
-
91
76
model = auto_arima (train , trace = True , error_action = 'ignore' , suppress_warnings = True )
92
77
model .fit (train )
93
-
94
78
forecast = model .predict (n_periods = len (valid ))
95
79
forecast = pd .DataFrame (forecast ,index = valid .index ,columns = ['Prediction' ])
96
80
97
-
98
81
def ARIMAmodel (series , order , days = 21 ):
99
82
# Fitting and forecast the series
100
83
train = [x for x in series ]
@@ -104,13 +87,10 @@ def ARIMAmodel(series, order, days = 21):
104
87
start_day = date .today () + datetime .timedelta (days = 1 )
105
88
predictions_df = pd .DataFrame ({'Forecast' :forecast .round ()}, index = pd .date_range (start = start_day , periods = days , freq = 'D' ))
106
89
return predictions_df , ci
107
-
108
-
109
-
90
+
110
91
new_positives = dataCovid ['Daily Increase' ].values
111
92
order = {
112
93
'new_positives' : (2 , 1 , 5 ),
113
-
114
94
}
115
95
new_positives_today = new_positives [- 1 ]
116
96
# Forecasting with ARIMA models
@@ -123,17 +103,14 @@ def ARIMAmodel(series, order, days = 21):
123
103
datesX .append ((date .today ()+ datetime .timedelta (days = i )).strftime ('%m/%d/%Y' ))
124
104
125
105
# Plot Results for forecasted dates only (detailed)
126
-
127
106
plt .plot (datesX ,casesY ,color = 'red' )
128
107
plt .title ('New active Cases Forecast' )
129
108
plt .xticks (rotation = 90 )
130
109
# plt.figure(figsize=(22,22))
131
- plt .savefig ("plot1.png" ,bbox_inches = 'tight' )
110
+ plt .savefig ("./corona cases forecasting/Results/ plot1.png" ,bbox_inches = 'tight' )
132
111
plt .autoscale ()
133
112
plt .show ()
134
113
135
-
136
-
137
114
def death_cases_daily ():
138
115
#confirmed cases
139
116
india_daily_increase = daily_increase (india_deaths )
@@ -151,20 +128,16 @@ def death_cases_daily():
151
128
future_forecast_dates .append ((start_date + datetime .timedelta (days = i )).strftime ('%m/%d/%Y' ))
152
129
153
130
dataCovid = pd .DataFrame ({ 'Dates' : future_forecast_dates , 'Daily Increase' :india_daily_increase })
154
-
155
131
train = dataCovid [:int (0.7 * (len (dataCovid )))]
156
132
valid = dataCovid [int (0.7 * (len (dataCovid ))):]
157
133
#preprocessing (since arima takes univariate series as input)
158
134
train .drop ('Dates' ,axis = 1 ,inplace = True )
159
135
valid .drop ('Dates' ,axis = 1 ,inplace = True )
160
-
161
136
model = auto_arima (train , trace = True , error_action = 'ignore' , suppress_warnings = True )
162
137
model .fit (train )
163
-
164
138
forecast = model .predict (n_periods = len (valid ))
165
139
forecast = pd .DataFrame (forecast ,index = valid .index ,columns = ['Prediction' ])
166
140
167
-
168
141
def ARIMAmodel (series , order , days = 21 ):
169
142
# Fitting and forecast the series
170
143
train = [x for x in series ]
@@ -175,12 +148,9 @@ def ARIMAmodel(series, order, days = 21):
175
148
predictions_df = pd .DataFrame ({'Forecast' :forecast .round ()}, index = pd .date_range (start = start_day , periods = days , freq = 'D' ))
176
149
return predictions_df , ci
177
150
178
-
179
-
180
151
new_deaths = dataCovid ['Daily Increase' ].values
181
152
order = {
182
153
'new_deaths' : (0 , 1 , 1 ),
183
-
184
154
}
185
155
new_deaths_today = new_deaths [- 1 ]
186
156
# Forecasting with ARIMA models
@@ -193,49 +163,38 @@ def ARIMAmodel(series, order, days = 21):
193
163
datesX .append ((date .today ()+ datetime .timedelta (days = i )).strftime ('%m/%d/%Y' ))
194
164
195
165
# Plot Results for forecasted dates only (detailed)
196
-
197
166
plt .plot (datesX ,casesY ,color = 'red' )
198
167
plt .title ('New death Cases Forecast' )
199
168
plt .xticks (rotation = 90 )
200
169
# plt.figure(figsize=(22,22))
201
- plt .savefig ("plot2.png" ,bbox_inches = 'tight' )
170
+ plt .savefig ("./corona cases forecasting/Results/ plot2.png" ,bbox_inches = 'tight' )
202
171
plt .autoscale ()
203
172
plt .show ()
204
173
205
-
206
-
207
-
208
174
def recovered_cases_daily ():
209
175
#confirmed cases
210
176
india_daily_increase = daily_increase (india_recoveries )
211
-
212
177
# Dates pre processing
213
178
days_since_1_22 = np .array ([i for i in range (len (dates ))]).reshape (- 1 , 1 )
214
-
215
179
days_in_future = 0
216
180
future_forecast = np .array ([i for i in range (len (dates )+ days_in_future )]).reshape (- 1 , 1 )
217
-
218
181
start = '1/22/2020'
219
182
start_date = datetime .datetime .strptime (start , '%m/%d/%Y' )
220
183
future_forecast_dates = []
221
184
for i in range (len (future_forecast )):
222
185
future_forecast_dates .append ((start_date + datetime .timedelta (days = i )).strftime ('%m/%d/%Y' ))
223
186
224
187
dataCovid = pd .DataFrame ({ 'Dates' : future_forecast_dates , 'Daily recoveries' :india_daily_increase })
225
-
226
188
train = dataCovid [:int (0.7 * (len (dataCovid )))]
227
189
valid = dataCovid [int (0.7 * (len (dataCovid ))):]
228
190
#preprocessing (since arima takes univariate series as input)
229
191
train .drop ('Dates' ,axis = 1 ,inplace = True )
230
192
valid .drop ('Dates' ,axis = 1 ,inplace = True )
231
-
232
193
model = auto_arima (train , trace = True , error_action = 'ignore' , suppress_warnings = True )
233
194
model .fit (train )
234
-
235
195
forecast = model .predict (n_periods = len (valid ))
236
196
forecast = pd .DataFrame (forecast ,index = valid .index ,columns = ['Prediction' ])
237
197
238
-
239
198
def ARIMAmodel (series , order , days = 21 ):
240
199
# Fitting and forecast the series
241
200
train = [x for x in series ]
@@ -246,12 +205,9 @@ def ARIMAmodel(series, order, days = 21):
246
205
predictions_df = pd .DataFrame ({'Forecast' :forecast .round ()}, index = pd .date_range (start = start_day , periods = days , freq = 'D' ))
247
206
return predictions_df , ci
248
207
249
-
250
-
251
208
new_recoveries = dataCovid ['Daily recoveries' ].values
252
209
order = {
253
210
'new_recoveries' : (1 , 1 , 2 ),
254
-
255
211
}
256
212
new_recoveries_today = new_recoveries [- 1 ]
257
213
# Forecasting with ARIMA models
@@ -264,17 +220,16 @@ def ARIMAmodel(series, order, days = 21):
264
220
datesX .append ((date .today ()+ datetime .timedelta (days = i )).strftime ('%m/%d/%Y' ))
265
221
266
222
# Plot Results for forecasted dates only (detailed)
267
-
268
223
plt .plot (datesX ,casesY ,color = 'red' )
269
224
plt .title ('New recovered Cases Forecast' )
270
225
plt .xticks (rotation = 90 )
271
226
# plt.figure(figsize=(22,22))
272
- plt .savefig ("plot3.png" ,bbox_inches = 'tight' )
227
+ plt .savefig ("./corona cases forecasting/Results/ plot3.png" ,bbox_inches = 'tight' )
273
228
plt .autoscale ()
274
229
plt .show ()
275
-
276
-
277
- choice = input ("F for fresh cases,D for death cases,R for recovered cases prediction" )
230
+
231
+ # Taking user input choice for type of prediction method to be intitiated
232
+ choice = input ("F for fresh cases,D for death cases,R for recovered cases prediction : " )
278
233
if choice == 'F' :
279
234
fresh_cases_daily ()
280
235
elif choice == 'D' :
@@ -283,28 +238,3 @@ def ARIMAmodel(series, order, days = 21):
283
238
recovered_cases_daily ()
284
239
else :
285
240
print ("Enter a valid choice" )
286
-
287
-
288
-
289
-
290
-
291
-
292
-
293
-
294
-
295
-
296
-
297
-
298
-
299
-
300
-
301
-
302
-
303
-
304
-
305
-
306
-
307
-
308
-
309
-
310
-
0 commit comments