Предсказать количество людей, инфицированных COVID, с течением времени с помощью statsmodels OLS - окончательный результат нереалистичен - PullRequest
0 голосов
/ 26 марта 2020

Я попытался спрогнозировать количество зараженных людей следующим образом:

  • Создать df с данными

  • Фильтрация данных и вычислить поле 'new_postives'

  • Кривая графика

  • Создание полиномиальной функции с высоким R-Sqaure

  • Полиномиальная кривая графика

  • Попытка предсказать данные

Здесь под кодом, с помощью которого я пытался предсказать количество инфицированных людей на 45 день (day_pred = 45), что очень близко к последнему дню в базе данных (день 43, заражено 3039). Мой вопрос: поскольку у меня есть хорошая предварительная кривая (красным), которая на самом деле показывает предвидение, почему мое мое предвидение не соответствует кривой? Где я был не прав? Я не ищу совет о типе кривой, используемой для описания эпидемии c, но я ищу совет о том, как делать прогнозы в соответствии с моделью, которую я создал (с найденной мною полиномиальной кривой). Кто-нибудь может мне помочь?

'exec(%matplotlib inline)'
import pandas as pd
import seaborn as sns
import numpy as np
import io
import requests
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
import statsmodels.api as sm



url='https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-regioni/dpc-covid19-ita-regioni.csv'
s=requests.get(url).content
df=pd.read_csv(io.StringIO(s.decode('utf-8')))
db=df
df1=df[df['denominazione_regione']=='Toscana']
df_new_pos=df[['dates','new_postives']]
df_new_pos=df_new_pos.groupby('dates')['new_postives'].sum().reset_index()
df_new_pos['dates']=df_new_pos['dates'].apply(lambda x: x[:x.find(' 1')])
df_new_pos['dates']=df_new_pos['dates'].apply(lambda x: x[:x.find('T')])
df_new_pos=df_new_pos.reset_index()
plt.figure(figsize=(9,5))
plt.plot('index', 'new_postives', dates=df_new_pos, marker='o', markerfacecolor='red', markersize=4, color='black', linewidth=3)
plt.xticks(rotation=45)
plt.legend('Nuovi infetti COVID-19', loc='upper left')
plt.gcf().subplots_adjust(bottom=0.15)
plt.title('New_inf_Day_By_Day')

x=np.arange(df_new_pos['dates'].size)
y=np.array(df_new_pos['new_postives'].astype(int))
p4=np.poly1d(np.polyfit(x,y,4))
size=x.size
xp=np.linspace(0,size,size)
plt.plot(x, p4(xp),c='r')


from sklearn.metrics import r2_score
r2=r2_score(y,p4(x))
print(r2)
plt.title("R2 = "+str(r2)[:str(r2).find('.')+3])

scale = StandardScaler()
X=df_new_pos[['new_postives']]
y=x

X[['new_postives']]=scale.fit_transform(X[['new_postives']].values)
X=np.array(X)
X.reshape(-1,1)

est = sm.OLS(y, X).fit()

print(est.summary())
day_pred=45
scaled = scale.transform([[day_pred]])
predicted = est.predict(scaled[0])
predicted=int(round(predicted.max()))

plt.text(0,3500,'Prevision for day '+str(day_pred)+' is '+str(predicted)[1:str(predicted).find('.')+3]+' infected')


plt.savefig("COVID_new_infected_previsional.png")

...