时间序列(一)

原创 2017年01月13日 21:07:55

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
Python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan 13 11:20:10 2017

@author: DaiPuWei
"""

'''
    时间序列简单平移法:以预测12月份的销售收入为例
'''

import math

def 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 result

def 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 pd

def 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 forecast


def 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 pd

def 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_data

def 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 forecast

def 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()

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。若需转载,请注明http://blog.csdn.net/qq_30091945 举报

相关文章推荐

时间序列之灰色预测

灰色预测是针对灰色系统所做的预测。控制论中,信息的多少常以颜色的深浅来表示,信息充足、确定为白色;信息缺乏、不确定为黑色;部分确定部分不确定为灰色。灰色系统指信息不完全的系统,信息的不完全可能是系统因...

灰色系统预测GM(1,1)模型

预备知识 (1)灰色系统 白色系统是指系统内部特征是完全已知的;黑色系统是指系统内部信息完全未知的;而灰色系统是介于白色系统和黑色系统之间的一种系统,灰色系统其内部一部分信息已知,...

我是如何成为一名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代码如下:# -*- coding: utf-8 -*- """ Created on Fri Jan 13 11:20:10 2017@author: DaiPuWei """''' ...

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

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

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

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

R基于案例学习时间序列

基于案例学习时间序列 时间序列的组成成分 系统性部分 – 水平 – 趋势 – 季节性 非系统性部分 – 噪声/随机扰动 时间序列的组成成分 加法模型 – Y = 水平 + 趋势 +...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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