时间序列分析

移动平均

import pandas as pd
import numpy as npdata = pd.DataFrame([17,21,19,23,18,16,20,18,22,20,15,22],columns=['sale'])
data["rolling_mean"] = data.rolling(3).mean().shift(1)#选前3个时间单位的平均值,预测值对应下一个样本,所以将结果下移一行,与观察值相对应data['mse'] = (abs(data["sale"]-data["rolling_mean"]))**2 #计算预测差平方和
data['mse'].mean()
data

指数平滑(一次指数平滑)

from statsmodels.tsa.holtwinters import SimpleExpSmoothing
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdata = pd.DataFrame([17,21,19,23,18,16,20,18,22,20,15,22],columns=['sale'])fit1 = SimpleExpSmoothing(data).fit(smoothing_level=0.2,optimized=False)#指定平滑常数α=0.2# fit1 = SimpleExpSmoothing(data).fit() #自行优化出参数data['fit'] = fit1.fittedvalues #拟合,拟合值与观察值已对应
data['mse'] = (abs(data["sale"]-data["fit"]))**2 #计算预测差平方和data['mse'].sum()/(len(data)-1)#计算平方和的平均值,因第一项为实际值,所以分母为样本量-1

Holt线性指数平滑(二次指数平滑)

在一次指数平滑的结果上再次进行指数平滑

from statsmodels.tsa.holtwinters import  Holt
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdata = pd.DataFrame([21.6,22.9,25.5,21.9,23.9,27.5,31.5,29.7,28.6,31.4],columns=['sale'])
fit1 = Holt(data).fit()data['fit'] = fit1.fittedvalues #拟合,拟合值与观察值已对应
data['mse'] = (abs(data["sale"]-data["fit"]))**2 #计算预测差平方和
data['mse'].mean()fit2.forecast(1)#预测后一个值

Holt-Winters 方法(三次指数平滑)

趋势和季节的加乘法模型

from statsmodels.tsa.holtwinters import ExponentialSmoothing
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdata = pd.DataFrame([4.8,4.4,6,6.5,5.8,5.2,6.8,7.4,6,5.6,7.5,7.8,6.3,5.9,8,8.4],columns=['sale'])#Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性
#damped 添加阻尼系数
fit1 = ExponentialSmoothing(data, seasonal_periods=4, trend='add', seasonal='add').fit(use_boxcox=True)
fit2 = ExponentialSmoothing(data, seasonal_periods=4, trend='add', seasonal='mul').fit(use_boxcox=True)
fit3 = ExponentialSmoothing(data, seasonal_periods=4, trend='add', seasonal='add', damped=True).fit(use_boxcox=True)
fit4 = ExponentialSmoothing(data, seasonal_periods=4, trend='add', seasonal='mul', damped=True).fit(use_boxcox=True)data['fit1'] = fit1.fittedvalues
data['fit2'] = fit2.fittedvalues
data['fit3'] = fit3.fittedvalues
data['fit4'] = fit4.fittedvaluesl1, = plt.plot(list(fit1.fittedvalues) + list(fit1.forecast(5)), marker='^')
l2, = plt.plot(list(fit2.fittedvalues) + list(fit2.forecast(5)), marker='*')
l3, = plt.plot(list(fit3.fittedvalues) + list(fit3.forecast(5)), marker='.')
l4, = plt.plot(list(fit4.fittedvalues) + list(fit4.forecast(5)), marker='.')l5, = plt.plot(data.values, marker='.')
plt.legend(handles = [l1, l2, l3, l4, l5], labels = ["aa", "am", "aa damped", "am damped","data"], loc = 'best', prop={'size': 7})plt.show()data['mse1'] = (abs(data["sale"]-data["fit1"]))**2 #计算预测差平方和
data['mse2'] = (abs(data["sale"]-data["fit2"]))**2
data['mse3'] = (abs(data["sale"]-data["fit3"]))**2
data['mse4'] = (abs(data["sale"]-data["fit4"]))**2
data.mean()[-4:]

ARIMA (p,d,q)模型

import pandas as pd
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
from statsmodels.tsa.stattools import adfuller as ADF
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARIMAfilename = r"C:\Users\liuhao\Desktop\python_work\Python数据分析与挖掘实战\chapter5\demo\data\arima_data.xls"
data = pd.read_excel(filename,index_col=0)# 做平稳性检测,输出的第二个值为 p值,大于0.05则为非平稳序列,此处 p = 0.998
ADF(data['销量']) # 画自相关图和偏自相关图,判断拖尾和截尾情况
# plot_acf(data).show()
# plot_pacf(data).show()#一阶拆分
D_data = data.diff().dropna()#再次做平稳性检测,p = 0.022
ADF(D_data[u'销量'])
# plot_acf(D_data).show()
# plot_pacf(D_data).show()#自动定阶,此处求得 (0,1)
(p,q) =(sm.tsa.arma_order_select_ic(D_data,max_ar=3,max_ma=3,ic='bic')['bic_min_order'])
# 需要设定自动取阶的 p和q 的最大值,即函数里面的max_ar,和max_ma,一般不超过 length/10
# ic 参数表示选用的选取标准,这里设置的为bic,当然也可以用aicmodel = ARIMA(data, (0,1,1)).fit() #此处拟合原始数据,非拆分后的数据
# model.summary2() # 给出一份模型报告# 残差检验
resid = model.resid
resid_test = ADF(resid)model.forecast(5)
# 作为后期5天的预测,返回预测结果、标准误差、置信区间。data["fit"] = model.predict(start=str("2015-01-02"), end=str("2015-02-06"), dynamic = False,typ='levels')
# 预测样本数据,第一个观测值无法预测
# typ:str {‘linear’, ‘levels’},"linear"返回的是差分后的拟合值,"levels"返回的是原始拟合值data['mape'] = (abs(data["销量"]-data["fit"]))/data["销量"] # 预测精度,绝对误差百分数

时间序列分解法

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdata = pd.DataFrame([4.8,4.1,6,6.5,5.8,5.2,6.8,7.4,6,5.6,7.5,7.8,6.3,5.9,8,8.4],columns=['sale'])rolling = data['sale'].rolling(4).mean()
data['trend'] = rolling.rolling(2).mean().shift(-2) #中心化移动平均数
data['s*i'] = data['sale']/data['trend'] #季节-不规则值index = ['1','2','3','4'] * 4
data['seasonal'] = index #引入季度序列
group = data['s*i'].groupby(data['seasonal'])
seasonal = group.mean() #求各季度的季节-不规则值的平均值,即为季节指数# 填充季节指数序列
seasonal.index = list(range(4))
for i in range(4,16):seasonal[i] = seasonal[i-4]# 消除季节影响
data['t*i'] = data['sale']/seasonal
data['seasonal'] = seasonal
plt.plot(data['t*i'])

《商务与经济统计》Python实现笔记(五)相关推荐

  1. Python学习笔记五:控制语句

    Python学习笔记五:控制语句 Pycharm 开发环境的下载安装配置_项目管理 控制语句 Pycharm 开发环境的使用 Pycharm 下载和安装 激活和选择不同UI 风格 创建项目和初始化配置 ...

  2. python爬虫笔记五:汽车之家贴吧信息(字体反爬-动态映射)

    学习网址: https://jia666666.blog.csdn.net/article/details/108974149 ----------------------------------- ...

  3. Python学习笔记五:条件循环

    文章目录 一.再谈print和import 1. 打印多个参数 2. 导入时重命名 二.赋值魔法 1. 序列解包 2. 链式赋值 3. 增强赋值 三.代码块:缩进的乐趣 四.条件和条件语句 1. 这正 ...

  4. python精简笔记(五)——函数式编程

    函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变量的程序设计语言,由 ...

  5. Python学习笔记五--条件和循环

    5.1 if语句 没什么好说,if语句语法如下: if expression: expr_true_suit 5.1.1多重条件表达式 单个if语句可以通过布尔操作符and,or,not实现多重条件判 ...

  6. Python学习笔记(五)—LOOP 循环

    个人认为Python基础学习直到LOOP才算真正开始. 循环有While, do-while, 和for() 比如while 我们要输出100条"you are my sunshine &q ...

  7. 【懒懒的Python学习笔记五】

    在这一章中,你将学习到能够将信息关联起来的Python字典,将学习如何访问和修改字典中的信息,同时也会学习如何遍历字典中的数据. 一.一个简单的字典 新建了一个存储用户信息的字典,里面存储了用户姓名. ...

  8. 《商务与经济统计》学习笔记(二)---辛普森悖论

    阅读之前看这里

  9. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  10. Python学习笔记总结

    了解了python语言后,决定以后使用python来进行各项工作,因此一直想要深入学习python.千里之行始于足下,万事开头难. 由于最近在准备写毕业论文,陆陆续续学习了Python的语法知识. P ...

最新文章

  1. Leetcode-探索 | 存在重复
  2. Android:如何使用addJavaScriptInterface
  3. 手把手教你用Java的swing制作计算器
  4. tensorflow计算网络占用内存_详细图解神经网络梯度下降法(tensorflow计算梯度)...
  5. yarn全局安装vue/cli vue不是内部命令
  6. 在jsp中使用smartupload组件上传文件- -
  7. webstorm使用gitee_webstorm 中 git 基本操作
  8. 登录oracle sql,登录 Oracle SQL Developer
  9. 【洛谷1527】 [国家集训队]矩阵乘法(整体二分)
  10. Android属于绑定服务特点是,android – 每个Service绑定是否需要一个ServiceConnection?...
  11. python输出姓名
  12. 3d人体智能测试软件,三维人体解剖软件(3dbody)
  13. 使用人工智能加快海底数据处理-从粗略过滤到精细智能数据筛选
  14. html制作手机预览效果,webstorm实现手机预览页面
  15. 白话深度学习与Tensorflow+白话大数据与机器学习
  16. 8. 查询表orders——统计各类商品的销售量
  17. android PMU
  18. Acitivity的生命周期
  19. android群英传 百度,超级群英传百度版
  20. 动作捕捉技术应用于地面移动机器人协同

热门文章

  1. 感谢一起合作的小伙伴
  2. .NET MVC:实现导出Excel表格
  3. ccs11 安装教程
  4. lisp 河道水面线计算_天然河道水面线计算表
  5. 我所参加的最贵的培训
  6. 艾斯是蒙奇·D·路飞的义兄
  7. 网络流媒体--SDP会话描述协议(RFC-4566)
  8. 基于easyui 1.3.6设计的后台管理系统模板界面
  9. 基于灰狼算法优化的Elman神经网络数据预测
  10. 计算机电源MOD,自制模组板给黑群电源改模组