segunda-feira, 12 de agosto de 2019

Tendencia/Sazonalidade/Aleatoriedade e Previsão em Series Temporais (Python)





import pandas as pd
import numpy as np
import matplotlib.pylab as plt
from statsmodels.tsa.seasonal import seasonal_decompose

#base = pd.read_csv('adultos.csv', sep = ';')
#base.head()
base = pd.read_csv('adultos.csv', sep = ';')
dateparse = lambda dates:pd.datetime.strptime(dates,'%Y-%m')
base = pd.read_csv('adultos.csv', sep = ';', parse_dates = ['data'], index_col = 'data', date_parser = dateparse)
#para trabalhar com serie temporal é recomendados transformar o type Data-frame em Type Series - ts, não precisa obrigatoriamente usar este nome

ts = base['SVL']
plt.plot(ts)

#decomposicao = seasonal_decompose(ts, model='additive')
decomposicao = seasonal_decompose(ts)
tendencia = decomposicao.trend
sazonal = decomposicao.seasonal
aleatorio = decomposicao.resid

plt.plot(sazonal)
plt.plot (tendencia)
plt.plot(aleatorio)

plt.subplot(4,1,1)
plt.plot(ts, label= 'original')
plt.legend(loc = 'best')

plt.subplot(4,1,2) #o ultimo é o local do bloco, se não alterar vai sobreescrever/ o do meio é o tamanho do grafico (maior fica menor)
plt.plot(tendencia, label= 'tendencia')
plt.legend(loc = 'best')

plt.subplot(4,1,3)
plt.plot(sazonal, label= 'sazonal')
plt.legend(loc = 'best')

plt.subplot(4,1,4)
plt.plot(aleatorio, label= 'Aleatório')
plt.legend(loc = 'best')
#layout
plt.tight_layout()



#Previsão



import pandas as pd
import matplotlib.pylab as plt
from statsmodels.tsa.arima_model import ARIMA
from pyramid.arima import auto_arima

base = pd.read_csv('adultos.csv', sep = ';')
dateparse = lambda dates:pd.datetime.strptime(dates,'%Y-%m')
base = pd.read_csv('adultos.csv', sep = ';', parse_dates = ['data'], index_col = 'data', date_parser = dateparse)
ts = base['SVL']
plt.plot(ts)
ts.mean() #visualizar a média
ts['1960-01-01':'1960-12-01'].mean() #média do ultimo an
media_movel = ts.rolling(window = 12).mean() #pode dar nulo porque ele precisa dos "12" dados anteriores para dar resultado
ts[0:12].mean() #posicao 0 a posicao 12
ts[1:13].mean()

plt.plot(ts)
plt.plot(media_movel, color = 'red')

#não tem biblioteca, então vamos criar
previsoes = []
for i in range(1,13):
#print(i)
superior = len(media_movel)-i
inferior = superior - 11
#print(inferior)
#print(superior)
#Print('---')
previsoes.append(media_movel[inferior:superior].mean())
#a ordem está inversa, então para virar
previsoes = previsoes[::-1] #: para não mecher nas linhas
plt.plot(previsoes)
#agora o arrima com biblioteca ARIMA P(numero dos termos auto regressivos)  Q (numero da media movel Dnumero de não sazonais
modelo = ARIMA(ts, order=(2,1,1))#ts é a serie teporal order (pqd)
modelo_treinado = modelo.fit()
modelo_treinado.summary()

previsoes = modelo_treinado.forecast(steps = 12)[0] #previsões para frente que quer fazer ex12 e [0] para retirar dados a mais
eixo = ts.plot()
modelo_treinado.plot_predict('2005-12-01', '2006-12-01')
Ta meio ruim, mas são os dados que eu usei.

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.