# 时间序列(三)

```# -*- 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代码暂时不更新，等比赛过后有时间再更新！！！！)

0 条评论

• ### 剑指offer——斐波那契数列

大家都知道斐波那契数列，现在要求输入一个整数n，请你输出斐波那契数列的第n项。n<=39

• ### 05-树7 堆中的路径 (25分)

将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i，打印从H[i]到根结点的路径。

• ### 归并排序

归并排序是典型的分而治之策略的应用。主要是把一个数组分成若干个子数组进行从小到大的归并直至有序。下面所说的归并排序默认为2路归并排序。

• ### Lagrange、Newton、分段插值法及Python实现

数据分析中，经常需要根据已知的函数点进行数据、模型的处理和分析，而通常情况下现有的数据是极少的，不足以支撑分析的进行，这里就需要使用差值法模拟新的数值来满足需求...

• ### Python实现数据写入 Excel 的三种模块！

本文说明如何使用 xlsxwriter、pandas、openpyxl 三个库来实现数据写入 Excel，写入后的格式如下图所示：

• ### 干货|十分钟快速掌握CPLEX求解VRPTW数学模型（附JAVA代码及CPLEX安装流程）

提到带时间窗车辆路径问题（vehicle routing problems with time windows，VRPTW），就不得不先说说车辆路径问题（...

• ### 为什么你应该学习 Python 的生成器？

写过一段时间代码的同学，应该对这一句话深有体会：程序的时间利用率和空间利用率往往是矛盾的，可以用时间换空间，可以用空间换时间，但很难同时提高一个程序的时间利用率...

• ### 框架篇-Vue面试题1-为什么 vue 组件中的 data 是函数而不是对象

当一个组件被定义,data必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例

• ### 数据科学家易犯的十大编码错误，你中招了吗？

我是一名高级数据科学家，在 Stackoverflow 的 python 编码中排前 1%，而且还与众多（初级）数据科学家一起工作。下文列出了我常见到的 10 ...