关闭

[置顶] 时间序列(三)

标签: python时间序列数学建模
497人阅读 评论(1) 收藏 举报
分类:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
修正指数曲线法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代码暂时不更新,等比赛过后有时间再更新!!!!)

1
0
查看评论

时间序列笔记(三)

纯随机性 纯随机性检验 纯随机序列的定义 纯随机性性质 纯随机性检验 纯随机性序列也成为白噪声序列,它满足如下性质: 纯随机数列也是平稳性数据 之所以检验是否满足纯随机性,是为了在检验平稳性数据后排除没有研究价值的数据 时序图(常数均值附近波动),系协方差相关...
  • zhmjunjun
  • zhmjunjun
  • 2017-11-26 15:51
  • 28

时间序列(三)滑动窗口

滑动窗口就是能够根据指定的单位长度来框住时间序列,从而计算框内的统计指标。相当于一个长度指定的滑块在刻度尺上面滑动,每滑动一个单位即可反馈滑块内的数据。import matplotlib.pylab import numpy as np import pandas as pd指定六百个数据的序列df...
  • kong1287988804
  • kong1287988804
  • 2017-12-11 15:46
  • 302

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

思路:将时间序列转化为图像类似的格式,然后进行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

时间序列数据挖掘

来自:http://blog.sciencenet.cn/blog-34250-287173.html
  • fennvde007
  • fennvde007
  • 2014-10-10 17:16
  • 4083

时间序列预测全攻略(附带Python代码)

http://www.36dsj.com/archives/44065 介绍 时间序列(简称TS)被认为是分析领域比较少人知道的技能。(我也是几天前才知道它)。但是你一定知道最近的小型编程马拉松就是基于时间序列发展起来的,我参加了这项活动去学习了解决时间序列问题的基本步骤,在这儿我要...
  • Goldxwang
  • Goldxwang
  • 2017-06-16 21:29
  • 4197

时间序列数据库的秘密(1)—— 介绍

什么是时间序列数据?最简单的定义就是数据格式里包含timestamp字段的数据。比如股票市场的价格,环境中的温度,主机的CPU使用率等。但是又有什么数据是不包含timestamp的呢?几乎所有的数据都可以打上一个timestamp字段。时间序列数据更重要的一个属性是如何去查询它。在查询的时候,对于时...
  • ASIA_kobe
  • ASIA_kobe
  • 2016-06-27 17:40
  • 5336

时间序列形态相似性分析(一)——时间序列形态相似性的度量

序 时间序列是一类最常见的数据,目前时间序列分析重点研究的多是时间序列的预测。但针对有些问题,时间序列的形态比较也是一类重要的问题。例如:各种商品每日均价(或者股票的每日收盘价格)构成了时间序列,如何评价商品价格走势的一致性,就可以归结为时间序列形态相似性问题。本系列短文将就这一问题逐步展...
  • yunfeizhong
  • yunfeizhong
  • 2008-09-09 21:07
  • 2841

混淆矩阵(Confusion Matrix)

混淆矩阵是除了ROC曲线和AUC之外的另一个判断分类好坏程度的方法。 以下有几个概念需要先说明: TP(True Positive): 真实为0,预测也为0 FN(False Negative): 真实为0,预测为1 FP(False Positive): 真实为1,预测为0 TN(True Neg...
  • joeland209
  • joeland209
  • 2017-05-02 10:57
  • 1231

时间序列规则法快速入门(转自dropout)

最近参加了有关时序问题的比赛,自己的论文也是相关问题。所以 在天池技术圈看了dropout 老师 的这篇文章,询问了老师后可以转载,转载简书网址如下,以供学习。 http://www.jianshu.com/p/31e20f00c26f?spm=5176.9876270.0....
  • zhangbo_0323
  • zhangbo_0323
  • 2017-09-14 15:22
  • 257

【时间序列】时间序列分割聚类算法TICC

2017年KDD最佳论文,解决高维时间信号的自动分割聚类问题,并给出基于python的源码。
  • shenxiaolu1984
  • shenxiaolu1984
  • 2017-09-29 15:39
  • 1176
    个人资料
    • 访问:155567次
    • 积分:4927
    • 等级:
    • 排名:第6843名
    • 原创:329篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论