時間序列(二)
阿新 • • 發佈:2019-01-07
一次指數平滑法Python程式碼如下:
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 14 11:57:34 2017
@author: DaiPuWei
"""
"""
時間序列一次指數平移法,以電器銷售額的預測為例
"""
import pandas as pd
import math
def Index_Translation(data,alpha):
"""
一次指數平移法函式
data是樣本資料
alpha為加權係數
"""
#資料陣列長度
length = len(data)
forecast_data = []
#預測初值去頂
tmp = 0
if length > 20:
tmp = data[0]
else:
for i in range(2):
tmp = tmp + data[i]
tmp = tmp / 2
forecast_data.append(tmp)
#計算預測資料
for i in range(1,length):
tmp = 0
tmp = alpha * data[i-1 ] + (1-alpha) * forecast_data[i-1]
forecast_data.append(tmp)
#相對誤差
error = 0
for i in range(length):
error = error + (data[i] - forecast_data[i]) * (data[i] - forecast_data[i])
error = error * 1.0 / (length - 2)
error = math.sqrt(error)
return error,forecast_data
def Index_Translation_Model(data,alpha):
"""
這是一次指數平移模型
data是樣本資料
alpha為加權係數陣列
forecast是需要預測的指標年份
"""
#把數預測據按相對誤差進行裝飾
tmp = []
for i in range(len(alpha)):
error = 0
forecast_data = []
error,forecast_data = Index_Translation(data,alpha[i])
tmp.append((error,alpha[i],forecast_data))
#按相對誤差從小到大排序
tmp.sort(reverse = False)
#獲取相關資訊
t = tmp[0]
Alpha = t[1]
forecast_data = t[2]
#對要預測的資料進行預測
length = len(data)
last = data[length-1]
_forecast = forecast_data[length-1]
forecast = Alpha * last + (1-Alpha) * _forecast
return forecast
def run_main():
'''
這是主是函式
'''
#讀取檔案中的樣例
sample = pd.read_excel('E:\\Program Files (x86)\\大學數學\\演算法大全pdf\\第24章 時間序列模型\\電器銷售額.xlsx')
data = sample[sample.columns[1]]
year = sample[sample.columns[0]]
#加權係數
alpha = []
for i in range(10):
alpha.append((i+1)*1.0/10)
#預測結果
forecast_result = Index_Translation_Model(data,alpha)
print(year[len(year)-1]+1,'年的電器銷售額預測值為:',forecast_result)
if __name__ == '__main__':
run_main()
二次指數平滑法Python程式碼如下:
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 14 13:37:09 2017
@author: DaiPuWei
"""
"""
時間序列二次指數平滑法,以發電量預測為例
"""
import pandas as pd
import math
def Index_Translation(data,alpha):
"""
指數平移法函式
data是樣本資料
alpha為加權係數
"""
#資料陣列長度
length = len(data)
forecast_data = []
#預測初值去頂
tmp = 0
if length > 20:
tmp = data[0]
else:
for i in range(2):
tmp = tmp + data[i]
tmp = tmp / 2
forecast_data.append(tmp)
#計算預測資料
for i in range(1,length):
tmp = 0
tmp = alpha * data[i-1] + (1-alpha) * forecast_data[i-1]
forecast_data.append(tmp)
return forecast_data
def Second_Index_Translation_Model(data,alpha,year,forecast_year):
"""
這是一次指數平移模型
data是樣本資料
alpha為加權係數
forecast是需要預測的指標年份
"""
#一次指數平滑
forecast_data1 = Index_Translation(data,alpha)
#二次指數平滑
forecast_data2 = Index_Translation(forecast_data1,alpha)
#對要預測的資料進行預測
A = 2 * forecast_data1[-1] - forecast_data2[-1]
B = alpha *(forecast_data1[-1] - forecast_data2[-1]) / (1 - alpha)
first_year = year[len(year)-1]
print('二次指數平滑模型為:')
print('Y(t)=',A,'+',B,'(T-',first_year,')')
forecast = A + B * (forecast_year-first_year)
return forecast
def run_main():
'''
這是主函式
'''
#讀取資料集
sample = pd.read_excel('E:\\Program Files (x86)\\大學數學\\演算法大全pdf\\第24章 時間序列模型\\1965-1985年發電總量統計.xlsx')
data = sample['發電總量']
year = sample['年份']
#加權係數
alpha = 0.3
#模型預測
forecast_year = 1986
forecast = Second_Index_Translation_Model(data,alpha,year,forecast_year)
print(forecast_year,'年的發電總量的預測值為',forecast)
forecast_year = 1987
forecast = Second_Index_Translation_Model(data,alpha,year,forecast_year)
print(forecast_year,'年的發電總量的預測值為',forecast)
if __name__ == '__main__':
run_main()
三次指數平滑法Python程式碼如下:
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 14 17:34:30 2017
@author: DaiPuWei
"""
"""
時間序列三次指數平滑法,以固定資產他投資總額預測為例
"""
import pandas as pd
def Index_Translation(data,alpha):
"""
指數平移法函式
data是樣本資料
alpha為加權係數
"""
#資料陣列長度
length = len(data)
forecast_data = []
#預測初值去頂
tmp = 0
if length > 20:
tmp = data[0]
else:
for i in range(3):
tmp = tmp + data[i]
tmp = tmp / 3
forecast_data.append(tmp)
#計算預測資料
for i in range(1,length):
tmp = 0
tmp = alpha * data[i-1] + (1-alpha) * forecast_data[i-1]
forecast_data.append(tmp)
return forecast_data
def Third_Index_Translation_Model(data,alpha,year,forecast_year):
"""
這是一次指數平移模型
data是樣本資料
year是樣本年份
alpha為加權係數
forecast是需要預測的指標年份
"""
#一次指數平滑
forecast_data1 = Index_Translation(data,alpha)
#二次指數平滑
forecast_data2 = Index_Translation(forecast_data1,alpha)
#三次指數平滑
forecast_data3 = Index_Translation(forecast_data2,alpha)
#對要預測的資料進行預測
A = 3 * forecast_data1[-1] - 3 * forecast_data2[-1] + forecast_data3[-1]
B = alpha *((6 - 5 * alpha) * forecast_data1[-1] - 2*(5 - 4 * alpha) * forecast_data2[-1] + (4 - 3 * alpha) * forecast_data3[-1]) / (2*(1 - alpha)*(1 - alpha))
C = alpha * alpha * (forecast_data1[-1] - 2 * forecast_data2[-1] + forecast_data3[-1])
first_year = year[len(year)-1]
print('二次指數平滑模型為:')
print('Y(t)=',A,'+',B,'(T-',first_year,')+',C,'*(T-',first_year,')^2')
forecast = A + B * (forecast_year-first_year) + C * (forecast_year-first_year) * (forecast_year-first_year)
return forecast
def run_main():
"""
這是主函式
"""
#讀取資料集
sample = pd.read_excel('E:\\Program Files (x86)\\大學數學\\演算法大全pdf\\第24章 時間序列模型\\固定資產總額.xlsx')
data = sample[sample.columns[1]]
year = sample[sample.columns[0]]
#加權係數
alpha = 0.3
#模型預測
forecast_year = 1989
forecast = Third_Index_Translation_Model(data,alpha,year,forecast_year)
print(forecast_year,'年的發電總量的預測值為',forecast)
forecast_year = 1990
forecast = Third_Index_Translation_Model(data,alpha,year,forecast_year)
print(forecast_year,'年的發電總量的預測值為',forecast)
if __name__ == '__main__':
run_main()
一次差分指數平滑法Python程式碼如下:
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 14 19:58:25 2017
@author: DaiPuWei
"""
"""
時間序列一階差分指數平滑法,以鍋爐燃料消耗量預測為例
"""
import pandas as pd
def Difference_Index(data,alpha):
'''
一階差分函式
data是樣本資料
alpha為加權係數
'''
#差分數值
length = len(data)
first_difference = []
for i in range(length-1):
difference = data[i+1] - data[i]
first_difference.append(difference)
#差分指數平滑
forecast_difference = []
forecast_difference.append(first_difference[0])
for i in range(1,len(first_difference)):
forecast = alpha * first_difference[i-1] + (1-alpha) * forecast_difference[i-1]
forecast_difference.append(forecast)
forecast = forecast_difference[-1] + data[len(data)-1]
return forecast
def First_Difference_Index_Model(data,year,alpha):
"""
一階差分指數平滑法模型
"""
#模型預測
forecast = Difference_Index(data,alpha)
print(year[len(year)-1]+1,'年的鍋爐燃料消耗量預測值為:',forecast)
def run_main():
'''
這是主函式
'''
#讀取資料集
sample = pd.read_excel('E:\\Program Files (x86)\\大學數學\\演算法大全pdf\\第24章 時間序列模型\\鍋爐燃料消耗量.xlsx')
data = sample[sample.columns[1]]
year = sample[sample.columns[0]]
#加權係數
alpha = 0.4
#一階差分指數平滑法預測
First_Difference_Index_Model(data,year,alpha)
if __name__ == '__main__':
run_main()
二階差分指數平滑法
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 14 20:06:47 2017
@author: DaiPuWei
"""
"""
時間序列二階差分指數平滑法,以鍋爐燃料消耗量預測為例
"""
import pandas as pd
def Difference_Index(data,alpha):
'''
差分函式
data是樣本資料
alpha為加權係數
'''
#差分數值
length = len(data)
first_difference = []
for i in range(length-1):
difference = data[i+1] - data[i]
first_difference.append(difference)
#差分指數平滑
forecast_difference = []
forecast_difference.append(first_difference[0])
for i in range(1,len(first_difference)):
forecast = alpha * first_difference[i-1] + (1-alpha) * forecast_difference[i-1]
forecast_difference.append(forecast)
return forecast_difference
def Second_Difference_Index_Model(data,year,alpha):
"""
一階差分指數平滑法模型
"""
#一階差分指數平滑
forecast_difference1 = Difference_Index(data,alpha)
#二階差分指數平滑
forecast_difference2 = Difference_Index(forecast_difference1,alpha)
#模型預測
forecast = forecast_difference1[-1] + forecast_difference2[-1] + data[len(data)-1]
print(year[len(year)-1]+1,'年的鍋爐燃料消耗量預測值為:',forecast)
def run_main():
'''
這是主函式
'''
#讀取資料集
sample = pd.read_excel('E:\\Program Files (x86)\\大學數學\\演算法大全pdf\\第24章 時間序列模型\\鍋爐燃料消耗量.xlsx')
data = sample[sample.columns[1]]
year = sample[sample.columns[0]]
#加權係數
alpha = 0.4
#二階差分指數平滑法預測
Second_Difference_Index_Model(data,year,alpha)
if __name__ == '__main__':
run_main()
自適應濾波法Python程式碼如下:
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 15 10:16:52 2017
@author: DaiPuWei
"""
"""
時間序列自適應濾波法
"""
def Forecast(data,weight,N,index):
'''
對資料進行預測
'''
tmp = []
forecast = 0
for i in range(index-N,index):
tmp.append(data[i])
tmp = tmp[::-1]
for i in range(len(tmp)):
forecast = forecast +tmp[i] * weight[i]
return forecast,tmp
def Adaptive_Filtering(data,weight,error,N,K,index):
'''
一次自適應濾波預測
data是樣本資料
weight是權值陣列
error為誤差陣列
N是權值陣列長度
K為學習係數
index是需要預測資料的下標
'''
#進行預測
forecast ,tmp = Forecast(data,weight,N,index)
#進行資料修正
_error = data[index] - forecast
error[index] = _error
#data[index] = forecast
for i in range(N):
weight[i] = weight[i] + 2 *K * error[index] * tmp[i]
return weight,error
def Adaptive_Filtering_Model(data,weight,error,N,K):
"""
時間序列自適應濾波法模型
"""
#誤差的最大值
weight,error = Adaptive_Filtering(data,weight,error,N,K,N)
error_max = max(error)
#開始進行自適應濾波法,進行迭代修改資料
'''
第一次迴圈單獨考慮
'''
for i in range(N+1,len(data)):
weight,error = Adaptive_Filtering(data,weight,error,N,K,i)
error_max = max(error)
while error_max > 0.00001:
for i in range(N,len(data)):
weight,error = Adaptive_Filtering(data,weight,error,N,K,i)
error_max = max(error)
#對資料進行預測
forecast,tmp = Forecast(data,weight,N,len(data))
j = len(data)+1
print('第',j,'期資料預測值為:',forecast)
def run_main():
'''
這是主函式
'''
#10個測試資料
data = []
for i in range(10):
tmp = (i + 1)* 1.0 /10
data.append(tmp)
#權值以及權值個數
weight = [0.5,0.5]
N = len(weight)
#學習係數
K = 0.9
#誤差陣列
error = []
for i in range(len(data)):
error.append(0)
print('權值為:',weight)
print('資料為:',data,'\n')
#模型運用
Adaptive_Filtering_Model(data,weight,error,N,K)
if __name__ == '__main__':
run_main()