def arimaPredict(): # 首先创建类实例 ap = arimaPredicter.predicter() # 设置索引,函数的第一个参数是训练数据开始的日期,第二次参数是索引的长度,索引 # 长度不小于训练数据的长度即可 ap.createIndex(dt.datetime(2015, 1, 1), 243) # 可以直接调用sarimaTrain函数训练arima模型,只需将训练标签输入即可 model = ap.sarimaTrain(trainLabel) # 得到模型后调用sarimaPredict函数便可以预测紧接着训练数据之后若干天的预测值, # 两个参数分别为先前得到的模型与预测序列的长度 # 这是一个静态函数,可以直接通过类名调用 predictLabel = ap.sarimaPredict(model, 43) # 这样便可以得到结果 plt.plot(testLabel, color='blue', label='actual') plt.plot(predictLabel, color='red', label='predict') plt.title('ARIMA(default)') plt.show(block=False) # 事实上,在sarimaTrain函数中,你也可以指定ARIMA模型的两个参数(ar, ma) model = ap.sarimaTrain(trainLabel, para=(2, 2)) # 如果参数指定得当,结果将更好,反之更糟糕 predictLabel = ap.sarimaPredict(model, 43) plt.plot(testLabel, color='blue', label='actual') plt.plot(predictLabel, color='red', label='predict') plt.title('ARIMA(2, 2)') plt.show(block=False) # 如果你不知道该指定什么参数,那么可以使用sarimaParaSelect函数选择参数,该函数 # 的输入为类别名称,训练集,测试集及决定在参数选择时是否参考AIC的布尔变量 # 目前来看,在参数选择时是否参考AIC的结果差不多 # 函数执行后将会返回最优的参数以及测试集上的运行结果,同时实例中也会以类别名称为 # 键存储这个最优参数 para, _ = ap.sarimaParaSelect(1001, trainLabel[:-50], trainLabel[-50:], True) # 由于最优参数已被存储,再次训练是指明类别名称即可 model = ap.sarimaTrain(trainLabel, classNo=1001) # 预测的方式始终相同 predictLabel = ap.sarimaPredict(model, 43) plt.plot(testLabel, color='blue', label='actual') plt.plot(predictLabel, color='red', label='predict') plt.title('ARIMA(%d, %d)' % (para[0], para[1])) plt.show(block=False)
def sariamTest(): f = open("datam.csv", "r") f_csv = csv.reader(f) # writer = open("report.txt", "w") ap = arimaPredicter.predicter() ap.setIndex(index) for i in range(0, 10): midclass, trD, trL, teD, teL = getData(f_csv, 120, 0) if (midclass == 0): break trainData = trL[:99] testData = trL[99:] ap.test_stationarity(trL) greatfit = (0, 0, 0) minaic = 99999 for p in range(0, 3): for q in range(0, 3): try: ap.setPara(midclass, (p, q)) model = ap.sarimaTrain(midclass, trainData) if (model.aic < minaic): minaic = model.aic greatfit = (p, 1, q) result = ap.sarimaPredict(model, len(testData)) print("(%d,%d) %f %f\n" % (p, q, model.aic, getBias(testData, result))) except: pass print("midclass %d: %d %d\n" % (midclass, greatfit[0], greatfit[2])) f.close()
import KNN_interface larclasPred = {} larclasLabl = {} totalBias = 0 totalCount = 0 dtIndex = [dt.datetime(2015, 1, x) for x in range(1, 32)] dtIndex = dtIndex + [dt.datetime(2015, 2, x) for x in (range(1, 29))] dtIndex = dtIndex + [dt.datetime(2015, 3, x) for x in range(1, 32)] dtIndex = dtIndex + [dt.datetime(2015, 4, x) for x in (range(1, 31))] modelChoose = [] lcModelChoose = [] ap = arimaPredicter.predicter() ap.setIndex(dtIndex) def dataLog(midclass, accuracy, trainLabl, testPred, testLabl): with open('compare.csv', 'ab') as f: writer = csv.writer(f) count = 1 writer.writerow([midclass, accuracy]) for x in trainLabl: writer.writerow([count, x]) count += 1 for x in range(0, len(testPred)): writer.writerow([count, testLabl[x], testPred[x]]) count += 1
def sariamOutput(): loader = dataLoader.loader("datam.csv", "lcdatam.csv") loader.setSize(120, 0, 0) f1 = open("result01.csv", "wb") writer1 = csv.writer(f1) f2 = open("result11.csv", "wb") writer2 = csv.writer(f2) f3 = open("result12.csv", "wb") writer3 = csv.writer(f3) ap = arimaPredicter.predicter() ap.setIndex(index) while (True): midclass, _, trainData, _, _ = loader.getNextMidClass() if (midclass == 0): break ap.setPara(midclass, (0, 1)) try: model = ap.sarimaTrain(midclass, trainData) result = ap.sarimaPredict(model, 30) except: result = np.zeros(30) for i in range(0, 30): writer1.writerow([midclass, "201505%02d" % (i + 1), result[i]]) ap.setPara(midclass, (1, 1)) try: model = ap.sarimaTrain(midclass, trainData) result = ap.sarimaPredict(model, 30) except: result = np.zeros(30) for i in range(0, 30): writer2.writerow([midclass, "201505%02d" % (i + 1), result[i]]) ap.setPara(midclass, (1, 2)) try: model = ap.sarimaTrain(midclass, trainData) result = ap.sarimaPredict(model, 30) except: result = np.zeros(30) for i in range(0, 30): writer3.writerow([midclass, "201505%02d" % (i + 1), result[i]]) while (True): larclass, _, trainData, _, _ = loader.getNextLarClass() if (larclass == 0): break ap.setPara(larclass, (0, 1)) try: model = ap.sarimaTrain(larclass, trainData) result = ap.sarimaPredict(model, 30) except: result = np.zeros(30) for i in range(0, 30): writer1.writerow([larclass, "201505%02d" % (i + 1), result[i]]) ap.setPara(larclass, (1, 1)) try: model = ap.sarimaTrain(larclass, trainData) result = ap.sarimaPredict(model, 30) except: result = np.zeros(30) for i in range(0, 30): writer2.writerow([larclass, "201505%02d" % (i + 1), result[i]]) ap.setPara(larclass, (1, 2)) try: model = ap.sarimaTrain(larclass, trainData) result = ap.sarimaPredict(model, 30) except: result = np.zeros(30) for i in range(0, 30): writer3.writerow([larclass, "201505%02d" % (i + 1), result[i]]) f1.close() f2.close() f3.close() loader.closeFiles()