Amazing-Python-Scripts

Форк
0
280 строк · 10.4 Кб
1
# importing libraries
2
from pmdarima import auto_arima
3
import numpy as np
4
import pandas as pd
5
import matplotlib.pyplot as plt
6
from statsmodels.tsa.arima_model import ARIMA
7
import datetime
8
from datetime import date
9
import warnings
10
warnings.filterwarnings('ignore')
11
plt.style.use('fivethirtyeight')
12

13
confirmed_cases = pd.read_csv(
14
    '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(
16
    'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv')
17
recovered_cases = pd.read_csv(
18
    'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv')
19
latest_data = pd.read_csv(
20
    'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/07-15-2020.csv')
21
# attributes
22
# Fetching all the columns from confirmed dataset
23
cols = confirmed_cases.keys()
24
# Extracting the date columns
25
confirmed = confirmed_cases.loc[:, cols[4]:cols[-1]]
26
deaths = deaths_reported.loc[:, cols[4]:cols[-1]]
27
recoveries = recovered_cases.loc[:, cols[4]:cols[-1]]
28
# Range of date
29
dates = confirmed.keys()
30
# Summary
31
world_cases = []
32
total_deaths = []
33
mortality_rate = []
34
recovery_rate = []
35
total_recovered = []
36
total_active = []
37
# Confirmed
38
india_cases = []
39
# Death
40
india_deaths = []
41
# Recovered
42
india_recoveries = []
43
# Fill with the dataset
44
for i in dates:
45
    india_cases.append(
46
        confirmed_cases[confirmed_cases['Country/Region'] == 'India'][i].sum())
47
    india_deaths.append(
48
        deaths_reported[deaths_reported['Country/Region'] == 'India'][i].sum())
49
    india_recoveries.append(
50
        recovered_cases[recovered_cases['Country/Region'] == 'India'][i].sum())
51

52

53
def daily_increase(data):
54
    d = []
55
    for i in range(len(data)):
56
        if i == 0:
57
            d.append(data[0])
58
        else:
59
            d.append(data[i]-data[i-1])
60
    return d
61

62

63
def fresh_cases_daily():
64
    # confirmed cases
65
    india_daily_increase = daily_increase(india_cases)
66

67
    # Dates pre processing
68
    days_since_1_22 = np.array([i for i in range(len(dates))]).reshape(-1, 1)
69

70
    days_in_future = 0
71
    future_forecast = np.array(
72
        [i for i in range(len(dates)+days_in_future)]).reshape(-1, 1)
73

74
    start = '1/22/2020'
75
    start_date = datetime.datetime.strptime(start, '%m/%d/%Y')
76
    future_forecast_dates = []
77
    for i in range(len(future_forecast)):
78
        future_forecast_dates.append(
79
            (start_date + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
80

81
    dataCovid = pd.DataFrame(
82
        {'Dates': future_forecast_dates, 'Daily Increase': india_daily_increase})
83
    train = dataCovid[:int(0.7*(len(dataCovid)))]
84
    valid = dataCovid[int(0.7*(len(dataCovid))):]
85
    # preprocessing (since arima takes univariate series as input)
86
    train.drop('Dates', axis=1, inplace=True)
87
    valid.drop('Dates', axis=1, inplace=True)
88
    model = auto_arima(train, trace=True,
89
                       error_action='ignore', suppress_warnings=True)
90
    model.fit(train)
91
    forecast = model.predict(n_periods=len(valid))
92
    forecast = pd.DataFrame(forecast, index=valid.index,
93
                            columns=['Prediction'])
94

95
    def ARIMAmodel(series, order, days=21):
96
        # Fitting and forecast the series
97
        train = [x for x in series]
98
        model = ARIMA(train, order=order)
99
        model_fit = model.fit(disp=0)
100
        forecast, err, ci = model_fit.forecast(steps=days, alpha=0.05)
101
        start_day = date.today() + datetime.timedelta(days=1)
102
        predictions_df = pd.DataFrame({'Forecast': forecast.round(
103
        )}, index=pd.date_range(start=start_day, periods=days, freq='D'))
104
        return predictions_df, ci
105

106
    new_positives = dataCovid['Daily Increase'].values
107
    order = {
108
        'new_positives': (2, 1, 5),
109
    }
110
    new_positives_today = new_positives[-1]
111
    # Forecasting with ARIMA models
112
    new_positives_pred, new_positives_ci = ARIMAmodel(
113
        new_positives, order['new_positives'])
114
    casesY = []
115
    datesX = []
116
    list1 = new_positives_pred.iloc[:, 0]
117
    for i in range(0, 21):
118
        casesY.append(list1[i])
119
        datesX.append(
120
            (date.today() + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
121

122
    # Plot Results for forecasted dates only (detailed)
123
    plt.plot(datesX, casesY, color='red')
124
    plt.title('New active Cases Forecast')
125
    plt.xticks(rotation=90)
126
    # plt.figure(figsize=(22,22))
127
    plt.savefig("./corona cases forecasting/Results/plot1.png",
128
                bbox_inches='tight')
129
    plt.autoscale()
130
    plt.show()
131

132

133
def death_cases_daily():
134
    # confirmed cases
135
    india_daily_increase = daily_increase(india_deaths)
136

137
    # Dates pre processing
138
    days_since_1_22 = np.array([i for i in range(len(dates))]).reshape(-1, 1)
139

140
    days_in_future = 0
141
    future_forecast = np.array(
142
        [i for i in range(len(dates)+days_in_future)]).reshape(-1, 1)
143

144
    start = '1/22/2020'
145
    start_date = datetime.datetime.strptime(start, '%m/%d/%Y')
146
    future_forecast_dates = []
147
    for i in range(len(future_forecast)):
148
        future_forecast_dates.append(
149
            (start_date + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
150

151
    dataCovid = pd.DataFrame(
152
        {'Dates': future_forecast_dates, 'Daily Increase': india_daily_increase})
153
    train = dataCovid[:int(0.7*(len(dataCovid)))]
154
    valid = dataCovid[int(0.7*(len(dataCovid))):]
155
    # preprocessing (since arima takes univariate series as input)
156
    train.drop('Dates', axis=1, inplace=True)
157
    valid.drop('Dates', axis=1, inplace=True)
158
    model = auto_arima(train, trace=True,
159
                       error_action='ignore', suppress_warnings=True)
160
    model.fit(train)
161
    forecast = model.predict(n_periods=len(valid))
162
    forecast = pd.DataFrame(forecast, index=valid.index,
163
                            columns=['Prediction'])
164

165
    def ARIMAmodel(series, order, days=21):
166
        # Fitting and forecast the series
167
        train = [x for x in series]
168
        model = ARIMA(train, order=order)
169
        model_fit = model.fit(disp=0)
170
        forecast, err, ci = model_fit.forecast(steps=days, alpha=0.05)
171
        start_day = date.today() + datetime.timedelta(days=1)
172
        predictions_df = pd.DataFrame({'Forecast': forecast.round(
173
        )}, index=pd.date_range(start=start_day, periods=days, freq='D'))
174
        return predictions_df, ci
175

176
    new_deaths = dataCovid['Daily Increase'].values
177
    order = {
178
        'new_deaths': (0, 1, 1),
179
    }
180
    new_deaths_today = new_deaths[-1]
181
    # Forecasting with ARIMA models
182
    new_deaths_pred, new_deaths_ci = ARIMAmodel(
183
        new_deaths, order['new_deaths'])
184
    casesY = []
185
    datesX = []
186
    list1 = new_deaths_pred.iloc[:, 0]
187
    for i in range(0, 21):
188
        casesY.append(list1[i])
189
        datesX.append(
190
            (date.today() + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
191

192
    # Plot Results for forecasted dates only (detailed)
193
    plt.plot(datesX, casesY, color='red')
194
    plt.title('New death Cases Forecast')
195
    plt.xticks(rotation=90)
196
    # plt.figure(figsize=(22,22))
197
    plt.savefig("./corona cases forecasting/Results/plot2.png",
198
                bbox_inches='tight')
199
    plt.autoscale()
200
    plt.show()
201

202

203
def recovered_cases_daily():
204
    # confirmed cases
205
    india_daily_increase = daily_increase(india_recoveries)
206
    # Dates pre processing
207
    days_since_1_22 = np.array([i for i in range(len(dates))]).reshape(-1, 1)
208
    days_in_future = 0
209
    future_forecast = np.array(
210
        [i for i in range(len(dates)+days_in_future)]).reshape(-1, 1)
211
    start = '1/22/2020'
212
    start_date = datetime.datetime.strptime(start, '%m/%d/%Y')
213
    future_forecast_dates = []
214
    for i in range(len(future_forecast)):
215
        future_forecast_dates.append(
216
            (start_date + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
217

218
    dataCovid = pd.DataFrame(
219
        {'Dates': future_forecast_dates, 'Daily recoveries': india_daily_increase})
220
    train = dataCovid[:int(0.7*(len(dataCovid)))]
221
    valid = dataCovid[int(0.7*(len(dataCovid))):]
222
    # preprocessing (since arima takes univariate series as input)
223
    train.drop('Dates', axis=1, inplace=True)
224
    valid.drop('Dates', axis=1, inplace=True)
225
    model = auto_arima(train, trace=True,
226
                       error_action='ignore', suppress_warnings=True)
227
    model.fit(train)
228
    forecast = model.predict(n_periods=len(valid))
229
    forecast = pd.DataFrame(forecast, index=valid.index,
230
                            columns=['Prediction'])
231

232
    def ARIMAmodel(series, order, days=21):
233
        # Fitting and forecast the series
234
        train = [x for x in series]
235
        model = ARIMA(train, order=order)
236
        model_fit = model.fit(disp=0)
237
        forecast, err, ci = model_fit.forecast(steps=days, alpha=0.05)
238
        start_day = date.today() + datetime.timedelta(days=1)
239
        predictions_df = pd.DataFrame({'Forecast': forecast.round(
240
        )}, index=pd.date_range(start=start_day, periods=days, freq='D'))
241
        return predictions_df, ci
242

243
    new_recoveries = dataCovid['Daily recoveries'].values
244
    order = {
245
        'new_recoveries': (1, 1, 2),
246
    }
247
    new_recoveries_today = new_recoveries[-1]
248
    # Forecasting with ARIMA models
249
    new_recoveries_pred, new_recoveries_ci = ARIMAmodel(
250
        new_recoveries, order['new_recoveries'])
251
    casesY = []
252
    datesX = []
253
    list1 = new_recoveries_pred.iloc[:, 0]
254
    for i in range(0, 21):
255
        casesY.append(list1[i])
256
        datesX.append(
257
            (date.today() + datetime.timedelta(days=i)).strftime('%m/%d/%Y'))
258

259
    # Plot Results for forecasted dates only (detailed)
260
    plt.plot(datesX, casesY, color='red')
261
    plt.title('New recovered Cases Forecast')
262
    plt.xticks(rotation=90)
263
    # plt.figure(figsize=(22,22))
264
    plt.savefig("./corona cases forecasting/Results/plot3.png",
265
                bbox_inches='tight')
266
    plt.autoscale()
267
    plt.show()
268

269

270
# Taking user input choice for type of prediction method to be intitiated
271
choice = input(
272
    "F for fresh cases,D for death cases,R for recovered cases prediction : ")
273
if choice == 'F':
274
    fresh_cases_daily()
275
elif choice == 'D':
276
    death_cases_daily()
277
elif choice == 'R':
278
    recovered_cases_daily()
279
else:
280
    print("Enter a valid choice")
281

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.