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 0bc7f6e

Browse files
Add files via upload
1 parent 71bf35a commit 0bc7f6e

File tree

1 file changed

+310
-0
lines changed

1 file changed

+310
-0
lines changed

‎corona cases forecasting/main.py‎

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

Comments
(0)

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