1. 程式人生 > >時間序列(二)

時間序列(二)

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
一次指數平滑法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()

這裡寫圖片描述