# 时间序列模型(一)

2017-01-14 08:42:58来源:CSDN作者:qq_30091945人点击

Python代码如下:

``# -*- coding: utf-8 -*-"""Created on Fri Jan 13 11:20:10 2017@author: DaiPuWei"""'''    时间序列简单平移法：以预测12月份的销售收入为例'''import mathdef Forecast(profit,N,month):    '''        预测函数：profit为销售收入数据        N为预测周期，month为需要预测的月份    '''    result = []    if month >=1 and month <= 12:        #预测值        forecast= 0        for i in range(month-N-1,month-1):            forecast += profit[i]        forecast = forecast / 4        result.append(forecast)        #标准误差        error = 0        for i in range(N,len(profit)):            tmp = forecast - profit[i]            error = error + tmp * tmp        error = error / (len(profit) - N)        error = math.sqrt(error)        result.append(error)    else:       print('月份不正确，请重新输入月份(1-12)')        return resultdef run_main():    '''        这是组函数    '''    #销售收入    profit = [553.8,574.6,606.9,649.8,705.1,772.0,816.4,892.7,963.9,1015.1,1102.7]    #以4为预测周期的预测值    forecast1 = Forecast(profit,4,12)    #以4为预测周期的预测值    forecast2 = Forecast(profit,5,12)    if forecast1[1] < forecast2[1]:        print('12月份的预测值为%g'%forecast1[0])    else:        print('12月份的预测值为%g'%forecast2[0])if __name__ == '__main__':    run_main()``

Python代码如下:

``# -*- coding: utf-8 -*-"""Created on Fri Jan 13 11:58:31 2017@author: DaiPuWei"""'''    时间序列加权移动平均法:以预测1989年原煤产量为例'''import pandas as pddef Weighted_Forecast(data,weight,N):    '''        data是统计数据        weight是权重        N是预测周期        index是要预测的下标    '''    #各个权重之和    sum_weight = sum(weight)    #预测值    forecast  = 0    length = len(data)     #预测年份    year = data.index[length-1]+1    j = 0    for i in range(length-N,length):        forecast = forecast + weight[j] * data[data.columns[0]][data.index[i]]        j = j + 1    forecast = forecast / sum_weight    print('%d年原煤产量未校对的预测值为:'%year)    print(forecast)    #data中数据的预测值    forecast_data = []    for i in range(N):        forecast_data.append(data[data.columns[0]][data.index[i]])    for i in range(N,length):        tmp = 0        k = 0        for j in range(i-N,i):            tmp = tmp + data[data.columns[0]][data.index[j]]*weight[k]            k = k + 1        forecast_data.append(tmp/sum_weight)    print('所有的预测值为:')    for i in range(length):        print(data.index[i],forecast_data[i])    #相对误差    error_rate = []    for i in range(length):        error_rate.append(1-forecast_data[i]/data[data.columns[0]][data.index[i]])    sum_error = sum(error_rate)    sum_data = sum(data[data.columns[0]][data.index[N:]])    avg_rate = 0    #校正预测值    forecast = forecast/(1-avg_rate)    return forecastdef run_main():    '''        这是主函数    '''    #读取数据    data = pd.read_excel('E://Program Files (x86)//大学数学//算法大全pdf//第24章   时间序列模型//原煤产量统计.xlsx')    #周期数    N = 3    #权重    weight = []    for i in range(N):        weight.append(i+1)    forecast = Weighted_Forecast(data,weight,N)    length = len(data)    year = data.index[length-1]+1    print('%d年的原煤产量预测值为:'%year)    print(forecast)if __name__ == '__main__':    run_main()``

Python代码如下:

``# -*- coding: utf-8 -*-"""Created on Fri Jan 13 17:56:56 2017@author: DaiPuWei"""'''    时间序列趋势移动平均法，以1965-1985年发电总量为数据集合预测1986年与1987年    的发电总量'''import pandas as pddef Forecast(data,N):    '''        预测函数：data为销售收入数据        N为预测周期,    '''    forecast_data = []     length = len(data)    for i in range(N,length):        tmp = 0        for j in range(i-N,i):            tmp = tmp + data[j]        tmp = tmp / N        forecast_data.append(tmp)    result = forecast_data[len(forecast_data)-1]    return result,forecast_datadef Model(data,N,year,init):    '''        模型为:y(t+T) = a + b * T        a = 2 * M1 - M2        b = 2* (M1 - M2) / (N - 2)    '''    #一次移动平均的预测值以及预测数据    M1,first_forecast = Forecast(data,N)    #二次移动平均的预测值以及预测数据    M2,Second_forecast = Forecast(first_forecast,N)    #趋势移动平均模型参数a,b    a = 2 * M1 - M2    b = 2 *(M1 - M2) / (N - 2)    print('预测模型为：y(T) = ',a,'+',b,'*(T-',init,')')    #预测值    forecast = a + b * (year -init)    return forecastdef run_main():    '''        这是主函数    '''    #读取数据集    sample = pd.read_excel('E://Program Files (x86)//大学数学//算法大全pdf//第24章   时间序列模型//1965-1985年发电总量统计.xlsx')    data = sample['发电总量']    #预测周期    N = 6    #初始年份    init = sample['年份'][len(sample)-1]    #1986年预测值    forecast_1986 = Model(data,N,1986,init)    print('1986年发电总量的预测值为:%f'%forecast_1986)    #1987年预测值    forecast_1987 = Model(data,N,1987,init)    print('1987年发电总量的预测值为:%f'%forecast_1987)if __name__ == '__main__':    run_main()``