关闭

[置顶] 时间序列(二)

标签: python数学建模时间序列
592人阅读 评论(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()

这里写图片描述

1
0
查看评论

预测算法——指数平滑法

指数平滑法是生产预测中常用的一种方法。也用于中短期经济发展趋势预测,所有预测方法中,指数平滑是用得最多的一种。指数平滑法是移动平均法中的一种,其特点在于给过去的观测值不一样的权重,即较近期观测值的权数比较远期观测值的权数要大。根据平滑次数不同,指数平滑法分为一次指数平滑法、二次指数平滑法和三次指数平...
  • NIeson2012
  • NIeson2012
  • 2016-07-21 12:59
  • 31007

时间序列分析--指数平滑法

一. 基础知识:1. 概念:时间序列是指一个数据序列,特别是之由一段时间内采集的信号组成的序列,序列前面的信号表示采集的时间较早。 2. 前提假设:时间序列分析一般假设我们获得的数据在时域上具有一定的相互依赖关系,例如股票价格在t时刻很高,那么在t+1时刻价格也会比较高(跌停才10%);如果股票...
  • u013527419
  • u013527419
  • 2016-10-15 14:02
  • 2676

python构建指数平滑预测模型

指数平滑法其实我想说自己百度的… 只有懂的人才会找到这篇文章… 不懂的人…看了我的文章…还是不懂哈哈哈指数平滑法相比于移动平均法,它是一种特殊的加权平均方法。简单移动平均法用的是算术平均数,近期数据对预测值的影响比远期数据要大一些,而且越近的数据影响越大。指数平滑法正是考虑了这一点,并将其权值按...
  • AlanConstantineLau
  • AlanConstantineLau
  • 2017-04-14 16:31
  • 3653

R语言时间序列函数整理[不断更新]

来自:http://www.xiaowanxue.com/up_files/2012919161514.html
  • fennvde007
  • fennvde007
  • 2014-07-17 16:52
  • 1410

时间序列(二)数据重采样

数据重采样 时间数据由一个频率转换到另一个频率 降采样 升采样生成一条带随机值的时间序列rng = pd.date_range('1/1/2011', periods=90, freq='D') ts = pd.Series(np.random.randn(le...
  • kong1287988804
  • kong1287988804
  • 2017-12-11 15:35
  • 73

指数平滑法

指数平滑法中a值的确定
  • wtt561111
  • wtt561111
  • 2016-05-21 20:22
  • 1057

python 时序数据分析

时序数据有四种主要的组成方式 1.trend 趋势: 可以是线性的也可以是非线性的,但可以研究其参数 2. seasonality 季度变化:可以是加法型的,也可以是乘法型的 3. noise 噪音:噪音一般都是数据中的一段,所以找到方法来减小噪音是分析过程的关键 4. 其他:例如意外值,缺失值等等...
  • JannaShen
  • JannaShen
  • 2017-05-16 20:34
  • 615

时间序列笔记(二)

平稳序列 1:时间序列的预处理 平稳性检验: 特征统计量 平稳性时间序列的定义 平稳性时间序列的统计性质 平稳性时间序列的意义 平稳性检验 特征统计量: 概率分布 的意义:   统计特征完全用联合分布函数或联合密度函数决定    例如:均值,方差这些都是在分布函...
  • zhmjunjun
  • zhmjunjun
  • 2017-11-23 22:56
  • 46

深度学习进行时间序列模式识别

思路:将时间序列转化为图像类似的格式,然后进行CNN识别。 http://danielnouri.org/notes/2014/01/10/using-deep-learning-to-listen-for-whales/ Using deep learning to listen fo...
  • wa2003
  • wa2003
  • 2016-03-13 19:56
  • 4524

时间序列之指数平滑法(Exponential Smoothing)

统计中,预测方法除了利用多个影响因素建立回归模型来做预测外,在影响因素复杂,或者是没办法得到相关影响因素的数据信息时,回归模型就无能为力了。如果数据是时间序列上的值,在时间上可能呈现一定的稳态或者规律,利用过去时间区间的值来预测未来值,指数平滑法是其中的一个方法。    &#...
  • cl1143015961
  • cl1143015961
  • 2014-11-13 16:09
  • 5163
    个人资料
    • 访问:155551次
    • 积分:4927
    • 等级:
    • 排名:第6843名
    • 原创:329篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论