时间序列(三)

原创 2017年01月17日 17:09:06

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
修正指数曲线法Python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 15 15:36:15 2017

@author: DaiPuWei
"""

'''
    时间序列修正指数曲线法,以收音机销售量为例
'''

import pandas as pd
import numpy as np
import math

def Check_Data(data):
    '''
        检查数据增长率函数,即检查增长率是否稳定在某一常数
        data是数据样本
    '''

    error = []
    flag = False
    for i in range(1,len(data)-1):
        err1 = data[i+1] - data[i]
        err2 = data[i] - data[i-1]
        error.append(err1/err2)
    tmp = np.array(error)
    _range = sum(tmp) / len(tmp) 
    if all(tmp>_range-0.2) and all(tmp<_range+0.2):
        flag = True

    return flag

def subarrsum(data,start,end):
    '''
        数组切片求和
    '''
    tmp = []
    for i in range(start,end):
        tmp.append(data[i])
    return sum(tmp)

def Index_Curve_Model(data,year,T):
    """
        修正指数曲线方法
        模型为: Y(t) = K + a * b^(t-t0+1)
        data为数据集
        T为预测年份
    """

    forecast = 0

    #增长率若稳定在某一常数则进行模型求解
    if Check_Data(data) == True:        
        #将数据分成3份
        len1 = (int)(len(data) / 3)
        len2 = len(data) - len1
        len3 = len(data)

        #各份数据的总和
        tmp = []
        for i in range(len(data)):
            tmp.append(data[i])

        sum1 = subarrsum(data,0,len1)
        sum2 = subarrsum(data,len1,len2)
        sum3 = subarrsum(data,len2,len3)

        #各个参数值的求解
        b = math.pow((sum3-sum2)/(sum2-sum1),1.0/len1)
        a = (sum2-sum1) * (b-1) / (b * (math.pow(b,len1)-1) * (math.pow(b,len1)-1))
        K = (sum1 - a*b*(math.pow(b,len1)-1)/(b-1)) / len1     

        if a > 0:
            print('修正指数曲线模型: Y(t)=',K,'+',a,'*',b,'^(T-',year[0],')')
        elif a == 0:
            print('修正指数曲线模型: Y(t)=',K)
        elif a < 0:
            print('修正指数曲线模型: Y(t)=',K,a,'*',b,'^(',T,'-',year[0],'+1)')
        forecast = K + a * math.pow(b,T-year[0]+1)

    else:
        print("数据不真实,重新输入数据!")

    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]]

    #模型预测
    T = 1986
    forecast = Index_Curve_Model(data,year,T)
    print(T,'年的收音机销售额预测值为:',forecast)

if __name__ == '__main__':
    run_main()

这里写图片描述
这里写图片描述
Compertz曲线法Python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 15 21:54:47 2017

@author: DaiPuWei
"""

'''
    时间序列Compertz曲线法,以收音机销售量为例
'''

import pandas as pd
import numpy as np
import math

def Check_Data(data):
    '''
        检查数据增长率函数,即检查增长率是否稳定在某一常数
        data是数据样本
    '''

    error = []
    flag = False
    for i in range(1,len(data)-1):
        err1 = data[i+1] - data[i]
        err2 = data[i] - data[i-1]
        error.append(err1/err2)
    tmp = np.array(error)
    _range = sum(tmp) / len(tmp) 
    if all(tmp>_range-0.2) and all(tmp<_range+0.2):
        flag = True

    return flag

def subarrsum(data,start,end):
    '''
        数组切片求和
    '''
    tmp = []
    for i in range(start,end):
        tmp.append(data[i])
    return sum(tmp)

def Compertz_Model(data,year,T):
    """
        修正指数曲线方法
        模型为: Y(t) = e^(K + a * b^(t-t0+1))
        data为数据集
        T为预测年份
    """

    forecast = 0

    #增长率若稳定在某一常数则进行模型求解
    if Check_Data(data) == True:        
        #将数据分成3份
        len1 = (int)(len(data) / 3)
        len2 = len(data) - len1
        len3 = len(data)

        #各份数据的总和
        tmp = []
        for i in range(len(data)):
            tmp.append(data[i])

        sum1 = subarrsum(data,0,len1)
        sum2 = subarrsum(data,len1,len2)
        sum3 = subarrsum(data,len2,len3)

        #各个参数值的求解
        b = math.pow((sum3-sum2)/(sum2-sum1),1.0/len1)
        a = (sum2-sum1) * (b-1) / (b * (math.pow(b,len1)-1) * (math.pow(b,len1)-1))
        K = (sum1 - a*b*(math.pow(b,len1)-1)/(b-1)) / len1       

        if a > 0:
            print('Compertz曲线模型: Y(t)=',K,'*',a,'^(',b,'^(T-',year[0],'+1))')
        elif a == 0:
            print('Compertz曲线模型: Y(t)=',K)
        elif a < 0:
            print('Compertz曲线模型: Y(t)=',K,'*(',a,')^(',b,'^(T','-',year[0],'+1))')
        tmp = math.pow(b,T-year[0]+1)
        forecast = K + a*tmp
        forecast = math.exp(forecast)

    else:
        print("数据不真实,重新输入数据!")

    return forecast

def run_main():
    '''
        这是主函数
    '''

    #读取数据集
    sample = pd.read_excel('E:\\Program Files (x86)\\大学数学\\算法大全pdf\\第24章   时间序列模型\\收音机销售量.xlsx')
    data = sample[sample.columns[1]]
    _data = []
    for i in range(len(data)):
        _data.append(math.log(data[i]))
    year = sample[sample.columns[0]]

    #模型预测
    T = 1986
    forecast = Compertz_Curve_Model(_data,year,T)
    print(T,'年的收音机销售额预测值为:',forecast)

if __name__ == '__main__':
    run_main()

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
Logistic曲线(生长曲线)法Python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 15 22:07:39 2017

@author: DaiPuWei
"""

'''
    时间序列Compertz曲线法,以收音机销售量为例
'''

import pandas as pd
import numpy as np
import math

def Check_Data(data):
    '''
        检查数据增长率函数,即检查增长率是否稳定在某一常数
        data是数据样本
    '''

    error = []
    flag = False
    for i in range(1,len(data)-1):
        err1 = data[i+1] - data[i]
        err2 = data[i] - data[i-1]
        error.append(err1/err2)
    tmp = np.array(error)
    _range = sum(tmp) / len(tmp) 
    if all(tmp>_range-0.2) and all(tmp<_range+0.2):
        flag = True

    return flag

def subarrsum(data,start,end):
    '''
        数组切片求和
    '''
    tmp = []
    for i in range(start,end):
        tmp.append(data[i])
    return sum(tmp)

def Logistic_Model(data,year,T):
    """
        修正指数曲线方法
        模型为: Y(t) = 1/(K + a * b^(t-t0))
        data为数据集
        T为预测年份
    """

    forecast = 0

    #增长率若稳定在某一常数则进行模型求解
    if Check_Data(data) == True:        
        #将数据分成3份
        len1 = (int)(len(data) / 3)
        len2 = len(data) - len1
        len3 = len(data)

        #各份数据的总和
        tmp = []
        for i in range(len(data)):
            tmp.append(data[i])

        sum1 = subarrsum(data,0,len1)
        sum2 = subarrsum(data,len1,len2)
        sum3 = subarrsum(data,len2,len3)

        #各个参数值的求解
        b = math.pow((sum3-sum2)/(sum2-sum1),1.0/len1)
        a = (sum2-sum1) * (b-1) / (b * (math.pow(b,len1)-1) * (math.pow(b,len1)-1))
        K = (sum1 - a*b*(math.pow(b,len1)-1)/(b-1)) / len1        

        if a > 0:
            print('Logistic曲线模型: Y(t)=1/(',K,'+',a,'*',b,'^(T-',year[0],'+1))')
        elif a == 0:
            print('Logistic曲线模型: Y(t)=',K)
        elif a < 0:
            print('Logistic曲线模型: Y(t)=1/(',K,'+',a,'*',b,'^(T','-',year[0],'+1))')
        tmp = math.pow(b,T-year[0]+1)
        forecast = K + a*tmp
        forecast = 1.0 / forecast

    else:
        print("数据不真实,重新输入数据!")

    return forecast

def run_main():
    '''
        这是主函数
    '''

    #读取数据集
    sample = pd.read_excel('E:\\Program Files (x86)\\大学数学\\算法大全pdf\\第24章   时间序列模型\\收音机销售量.xlsx')
    data = sample[sample.columns[1]]
    _data = []
    for i in range(len(data)):
        _data.append(1.0/data[i])
    year = sample[sample.columns[0]]

    #模型预测
    T = 1986
    forecast = Logistic_Model(_data,year,T)
    print(T,'年的收音机销售额预测值为:',forecast)

if __name__ == '__main__':
    run_main()

这里写图片描述
(时间序列模型中的ARMA模型由于原理对我来说理解有些困难,加之最近的北美数学建模大赛即将开始,自己为了顾全大局,多看掌握几个重要模型,所以ARMA模型的Python代码暂时不更新,等比赛过后有时间再更新!!!!)

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

相关文章推荐

时间序列(三)

修正指数曲线法Python代码如下:# -*- coding: utf-8 -*- """ Created on Sun Jan 15 15:36:15 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个字)