时间序列(二)

原创 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 举报

相关文章推荐

时间序列(二)

一次指数平滑法Python代码如下:# -*- coding: utf-8 -*- """ Created on Sat Jan 14 11:57:34 2017@author: DaiPuWei "...

时间序列模型

时间序列是指把某一变量在不同时间上的数值按时间先后顺序排列起来所形成的序列,它的时间单位可以是分、时、日、周、旬、月、季、年等。时间序列模型就是利用时间序列建立的数学模型,它主要被用来对未来进行短期预...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

时间序列常用方法

时间序列分析基本特征: http://wiki.mbalib.com/wiki/%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E9%A2%84%E6%B5%8B%E6%B...

时间序列分析(一) 如何判断序列是否平稳

序列平稳不平稳,一般采用两种方法: 第一种:看图法 图是指时序图,例如(eviews画滴):   分析:什么样的图不平稳,先说下什么是平稳,平稳就是围绕着一个常数上下波...

ARIMA(待续。。。)

ARIMA标签(空格分隔): 时间序列ARIMA 理论 0 基本概念 1 平稳ARMA 11 一般线性过程 12 MAmoving average 121 一般MAq过程 13 ARAutoregre...

Python时间序列分析--从线性模型到GARCH模型

四级渣渣看个英文文章简直就是自虐,一天只能看一点,还只能看个半懂。唉,写下来以后慢慢理解改正吧。目录一、Motivation 二、基础知识 1.平稳性 2.序列相关(自相关) ...

时间序列分析——ARIMA模型预测(R)

读取数据(scan()scan()及read.csv()read.csv()等函数,row.namesrow.names参数可以用来指定索引列) 转换成时间序列(ts()ts()函数,注意freque...

R基于案例学习时间序列

基于案例学习时间序列 时间序列的组成成分 系统性部分 – 水平 – 趋势 – 季节性 非系统性部分 – 噪声/随机扰动 时间序列的组成成分 加法模型 – Y = 水平 + 趋势 +...

时间序列 R 读书笔记 04 Forecasting: principles and practice

本章开始学习《Forecasting: principles and practice》1 getting started1.1 事件的可预言性一个时间能不能被预言主要取决于以下三点 1. 对事件的...

时间序列 R 读书笔记 05 判断预测法 Judgmental forecasts

1 简介判断预测法是指Forecasting using judgement,也就是用专业知识和相关信息来进行预测,是一种主观预测方法 判断预测法主要用于一下情况 1. 没有历史数据,没有方法用统...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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