ARIMA
import pandas as pd
import statsmodels.api as sm
import numpy as np
import csv
import matplotlib.pyplot as plt
from decimal import Decimal
def dataload(filename):
data = []
with open(filename, encoding='utf-8') as f:
reader = csv.reader(f)
for line in reader:
data.append(line[0])
return data
#差分運算
def difference(dataset, interval=1):
diff = []
for i in range(interval, len(dataset)):
value = dataset[i] - dataset[i - interval]
diff.append(value)
return diff
#反差分運算
def inverse_difference(history, yhat, interval=1):
return yhat + history[-interval]
# 畫出acf和pacf圖,便于後面對ARMI模型參數确定
def acf_pacf(train):
diff = difference(train)
sm.graphics.tsa.plot_acf(diff)
sm.graphics.tsa.plot_pacf(diff)
plt.show()
def Prediction(train, test, prediction, p, q):
for i in range(len(test)):
interval = 1
dta = difference(history, interval)#1階差分
#acf_pacf(dta)
model = sm.tsa.ARMA(dta, order=(p, q)).fit(disp=0, trend='nc')
pre = model.forecast()[0]
pre = inverse_difference(history, pre, interval)
prediction.append(pre)
history.append(prediction[i])
del (history[0])
print("真實值", test)
newpre = []
for i in range(len(test)):
newpre.append(prediction[i])
print("預測值", newpre)
return newpre, test
def MAPE(pre, test):
mape = 0
for i in range(len(test)):
if test[i] != 0:
mape = mape + abs((newpre[i] - test[i]) / test[i])
print('誤差MAPE為:' + str(Decimal(str(mape / len(test) * 100)).quantize(Decimal('0.00'))) + '%')
filename = r'C:\Users\Linger\Desktop\data_10-12\data1_10-12.csv'
data = dataload(filename)
data = np.array(data,dtype=float)
train = data[1344:1536]
test = data[1536:1552]
history = [x for x in train]
acf_pacf(train)
prediction = []
newpre, test = Prediction(train, test, prediction, 4, 2)#p, q待定,根據畫出的ACF和PACF圖來進行确定如果報錯調試p,q
MAPE(newpre, test)
plt.figure(12)
plt.subplot(221)
plt.plot(data[1344:1536])
plt.title('training set')
plt.subplot(222)
plt.plot(newpre,color='red')
plt.title('predicted data')
plt.subplot(223)
plt.plot(data[1536:1552])
plt.title('real data')
plt.subplot(224)
plt.plot(data[1536:1552])
plt.plot(newpre,color='red')
#plt.plot(fore, color='yellow')
plt.title('prediction and real')
plt.show()
對PACF進行分析,确定p值,對ACF圖進行分析,得到q值