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