天天看點

ARIMA

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值

繼續閱讀