时间序列(二)

原创 2017年01月15日 12:30:21

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
一次指数平滑法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()

这里写图片描述

版权声明:本文为博主原创文章,若需转载,请注明http://blog.csdn.net/qq_30091945

相关文章推荐

时间序列模型学习笔记(二)

时间序列模型学习笔记(二)3.非平稳时间序列3.1 非平稳时间序列的差分变换非平稳时间序列可以建立的模型有ARIMA以及残差自回归模型等等,这里主要讨论ARIMA。 差分运算:相距k期的两个序列之间的...
  • weq27
  • weq27
  • 2017年03月29日 20:51
  • 718

时间序列分析之AR模型、MA模型和ARMA模型(二)

对一个时间序列预处理后检验出该序列为平稳时间序列说明该模型有提取信息的价值,就要进行下一步的模型建立来拟合该模型然后做出预测。下面介绍拟合时间序列的三个重要模型。 三个重要模型。 一、AR模型 二...

时间序列分析 R语言原版

  • 2017年11月17日 16:49
  • 33.55MB
  • 下载

时间序列数据的回归模型

  • 2017年10月31日 23:27
  • 842KB
  • 下载

如何将时间序列预测问题转换为python中的监督学习问题

原文:《How to Convert a Time Series to a Supervised Learning Problem in Python》 一、前言 像深度学习这样的机器学习方法可以用...

时间序列分析

  • 2015年06月18日 11:25
  • 14.61MB
  • 下载

平稳时间序列模型的建立

  • 2015年06月24日 19:39
  • 777KB
  • 下载

利用Python进行数据分析——时间序列[十](1) .

http://blog.csdn.net/ssw_1990/article/details/26612573

时间序列分析的工程应用 下册_0

  • 2013年12月03日 23:08
  • 4.42MB
  • 下载

时间序列预测

  • 2012年09月09日 11:14
  • 251KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:时间序列(二)
举报原因:
原因补充:

(最多只允许输入30个字)