从零开始的数模(十二)时间序列

news2024/9/22 5:27:26

目录

一·、概念

1.2方法

二、基于python的时间序列

2.1移动平均法

2.2指数平滑法

2.3灰色预测

2.4灰色关联

 2.5ARIMA模型

模型系

三、 基于matlab的时间序列

3.1移动平均法

3.2指数平滑法

一次指数平滑法

二次指数平滑法


一·、概念

1.1带有时间的数据有哪些特殊性 带有时间的数据有哪些特殊性

  

1.2方法

二、基于python的时间序列

2.1移动平均法

import numpy as np
y=np.array([423,358,434,445,527,429,426,502,480,384,427,446])
def MoveAverage(y,N):
    Mt=[' ']*N
    for i in range(N+1,len(y)+2):
        M=y[i-N-1:i-1].mean()
        Mt.append(round(M))
    return Mt
yt3=MoveAverage(y, 3)
yt5=MoveAverage(y, 5)
s3=np.sqrt(((y[3:]-yt3[3:-1])**2).mean())
s5=np.sqrt(((y[5:]-yt5[5:-1])**2).mean())
print(yt3)
print(s3)
print(yt5)
print(s5)
import pandas as pd
d=pd.DataFrame(np.c_[np.r_[y,[' ']],np.r_[yt3],np.r_[yt5]])
f=pd.ExcelWriter('move_average_example.xlsx')
d.to_excel(f)
f.close()

2.2指数平滑法

import numpy as np
import pandas as pd
y=np.array([423,358,434,445,527,429,426,502,480,384,427,446])
def ExpMove(y,a):
    n=len(y)
    M=np.zeros(n)
    #M[0]=(y[0]+y[1])/2
    M[0]=y[0]
    for i in range(1,len(y)):
        M[i]=a*y[i-1]+(1-a)*M[i-1]
    return M
yt1=ExpMove(y,0.2)
yt2=ExpMove(y,0.5)
yt3=ExpMove(y,0.8)
s1=np.sqrt(((y-yt1)**2).mean())
s2=np.sqrt(((y-yt2)**2).mean())
s3=np.sqrt(((y-yt3)**2).mean())
d=pd.DataFrame(np.c_[y,yt1,yt2,yt3])
f=pd.ExcelWriter('exp_smooth_example.xlsx')
d.to_excel(f)
f.close()
print(s1)
print(0.2*y[-1]+0.8*yt1[-1])
print(s2)
print(0.5*y[-1]+0.5*yt2[-1])
print(s3)
print(0.2*y[-1]+0.8*yt3[-1])
print(d)

2.3灰色预测

概念

模型

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
class GrayForecast():
#初始化
    def __init__(self, data, datacolumn=None):
        if isinstance(data, pd.core.frame.DataFrame):
            self.data=data
            try:
                self.data.columns = ['数据']
            except:
                if not datacolumn:
                    raise Exception('您传入的dataframe不止一列')
                else:
                    self.data = pd.DataFrame(data[datacolumn])
                    self.data.columns=['数据']
        elif isinstance(data, pd.core.series.Series):
            self.data = pd.DataFrame(data, columns=['数据'])
        else:
            self.data = pd.DataFrame(data, columns=['数据'])

        self.forecast_list = self.data.copy()

        if datacolumn:
            self.datacolumn = datacolumn
        else:
            self.datacolumn = None
        #save arg:
        #        data                DataFrame    数据
        #        forecast_list       DataFrame    预测序列
        #        datacolumn          string       数据的含义
#级比校验
    def level_check(self):
        # 数据级比校验
        n = len(self.data)
        lambda_k = np.zeros(n-1)
        for i in range(n-1):
            lambda_k[i] = self.data.ix[i]["数据"]/self.data.ix[i+1]["数据"]
            if lambda_k[i] < np.exp(-2/(n+1)) or lambda_k[i] > np.exp(2/(n+2)):
                flag = False
        else:
            flag = True

        self.lambda_k = lambda_k

        if not flag:
            print("级比校验失败,请对X(0)做平移变换")
            return False
        else:
            print("级比校验成功,请继续")
            return True

    #save arg:
    #        lambda_k            1-d list
#GM(1,1)建模
    def GM_11_build_model(self, forecast=5):
        if forecast > len(self.data):
            raise Exception('您的数据行不够')
        X_0 = np.array(self.forecast_list['数据'].tail(forecast))
    #       1-AGO
        X_1 = np.zeros(X_0.shape)
        for i in range(X_0.shape[0]):
            X_1[i] = np.sum(X_0[0:i+1])
    #       紧邻均值生成序列
        Z_1 = np.zeros(X_1.shape[0]-1)
        for i in range(1, X_1.shape[0]):
            Z_1[i-1] = -0.5*(X_1[i]+X_1[i-1])

        B = np.append(np.array(np.mat(Z_1).T), np.ones(Z_1.shape).reshape((Z_1.shape[0], 1)), axis=1)
        Yn = X_0[1:].reshape((X_0[1:].shape[0], 1))

        B = np.mat(B)
        Yn = np.mat(Yn)
        a_ = (B.T*B)**-1 * B.T * Yn

        a, b = np.array(a_.T)[0]

        X_ = np.zeros(X_0.shape[0])
        def f(k):
            return (X_0[0]-b/a)*(1-np.exp(a))*np.exp(-a*(k))

        self.forecast_list.loc[len(self.forecast_list)] = f(X_.shape[0])
#预测
    def forecast(self, time=5, forecast_data_len=5):
        for i in range(time):
            self.GM_11_build_model(forecast=forecast_data_len)
#打印日志
    def log(self):
        res = self.forecast_list.copy()
        if self.datacolumn:
            res.columns = [self.datacolumn]
        return res
#重置
    def reset(self):
        self.forecast_list = self.data.copy()
#作图
    def plot(self):
        self.forecast_list.plot()
        if self.datacolumn:
            plt.ylabel(self.datacolumn)
            plt.legend([self.datacolumn])
        plt.show()

f = open("电影票房.csv", encoding="utf8")
df = pd.read_csv(f)
gf = GrayForecast(df, '票房')
gf.forecast(10)
print(gf.log())
gf.plot()

2.4灰色关联

概念

 2.5ARIMA模型

序列的平稳性

 判定方法

 转换 

差分法        比值法        取对数

模型系

例题

#导入相关库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决图标题中文乱码问题
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
#导入数据
data=pd.read_excel('huiseguanlian.xlsx')
# print(data)
#提取变量名 x1 -- x7
label_need=data.keys()[1:]
# print(label_need)
#提取上面变量名下的数据
data1=data[label_need].values
print(data1)
#0.002~1区间归一化
[m,n]=data1.shape #得到行数和列数
data2=data1.astype('float')
data3=data2
ymin=0
ymax=1
for j in range(0,n):
    d_max=max(data2[:,j])
    d_min=min(data2[:,j])
    data3[:,j]=(ymax-ymin)*(data2[:,j]-d_min)/(d_max-d_min)+ymin
print(data3)
# 绘制 x1,x4,x5,x6,x7 的折线图
t=range(2007,2014)
plt.plot(t,data3[:,0],'*-',c='red')
for i in range(4):
    plt.plot(t,data3[:,2+i],'.-')
plt.xlabel('year')
plt.legend(['x1','x4','x5','x6','x7'])
plt.title('灰色关联分析')
plt.show()
# 得到其他列和参考列相等的绝对值
for i in range(3,7):
    data3[:,i]=np.abs(data3[:,i]-data3[:,0])
#得到绝对值矩阵的全局最大值和最小值
data4=data3[:,3:7]
d_max=np.max(data2)
d_min=np.min(data2)
a=0.5 #定义分辨系数
# 计算灰色关联矩阵
data4=(d_min+a*d_max)/(data4+a*d_max)
xishu=np.mean(data4, axis=0)
print(' x4,x5,x6,x7 与 x1之间的灰色关联度分别为:')
print(xishu)

三、 基于matlab的时间序列

3.1移动平均法

例题

在这里插入图片描述

在这里插入图片描述

clc
clear
y = [533.8 574.6 606.9 649.8 705.1 772.0 816.4 892.7 963.9 1015.1 1102.7]
m = length(y)
n = [4 5]
for i = 1 : length(n)
	for j = 1 : m - n(i) + 1
		yhat{i}(j) = sum(y(j : j + n(i) - 1 ))/n(i) % 由于取得n的值不同,所以用到了细胞数组。
	end
	y(12) = yhat{i}(end)
	s(i) = sqrt(mean((y(n(i) + 1 : end) - yhat{i}(1 : end - 1)) .^ 2))
end

3.2指数平滑法

一次移动平均实际上认为最近N期数据对未来的值的影响相同加权都是1/N,但是N期之前的数据对当前数据的预测起不到任何的作用,即加权为0。但是二次及更高次的平均权数不是1/N,而且次数越高,权数的结构越复杂。指数平滑法很有作用。

一次指数平滑法

模型在这里插入图片描述

 加权系数的选择
若α = 0, 则 yt+1hat = ythat, 就是下期的预测值等于本期的预测值。
那么对于α的选择尤为重要
(1)如果时间序列波动变化不大,比较平稳,那么阿尔法取小点0.1-0.5之间,以减少修正的幅度。
(2)若具有迅速明显的变动倾向,阿尔法取大些,0.6-0.8,使得灵敏度高些,以便于跟得上速度的变化。
现实中可以选择多个数据进行比较。

初始值的确定
一般情况下,可以去前10%的数据的均值开确定初始值。

例题在这里插入图片描述

在这里插入图片描述

clc
clear
yt = load('doanqi.txt')
n = length(yt)
alpha = [0.2 0.5 0.8]
m = length(alpha)
yhat (1, [1 : m])= (yt(1) + yt(2)) / 2;
for  i = 2 : n
	yhat(i, :) = alpha * yt(i - 1) + (1 - alpha) .* yhat( i - 1, : )
end
yhat
err = sqrt(mean((repmat(yt, 1, m) - yhat) .^ 2 ))

二次指数平滑法

一次指数平滑法,虽然克服了移动平均法的缺点,但是当时间序列的变动出现直线趋势时,用一次指数平滑法就会存在明显的滞后偏差,因此也必须要加以修正再做二次指数平滑,利用滞后偏差的规律建立直线趋势模型,就是所谓的二次指数平滑法。

例题

在这里插入图片描述在这里插入图片描述在这里插入图片描述

clc
clear
yt = load('fadian.txt')
n = length(yt); alpja = 0.3; st1(1) = yt(1); st2(1) = yt(1)
for i = 2 : n
	st1(i) = alpha * yt(i) + ( 1 - alpha ) * st1( i - 1 )
	st2(i) = alpha * st1(i) + (1 - alpha) * st2(i - 1)
end
at = 2*st1 - st2
bt = alpha/(1 - alpha)*(st1 - st2)
yhat = at + bt
str = ['C', int2str(n+2)]; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OAuthApp v2.2.3 更新 | 前端发布工具

OAuthApp 是一个前端发布工具&#xff0c;用于快速开发前端网页项目&#xff0c;并发布到服务器。具有引入脚本库就能使用服务端 API、在线发布 H5、站点数据独立存储的特性。 2023-2-3 主要更新 1&#xff0c;[修复] 站点文件功能&#xff0c;上传图片报错。 2&#xff0c;[新…

某FPS游戏飞天辅助及原理

FPS游戏先天的竞技性以及对战性决定了他必然有很多的BUG可以被利用又必须的去检测解决。 FPS游戏中有这样的外挂&#xff0c;飞在高空中打敌人,因为很少有人会注意头顶 躲在墙壁中攻击敌人&#xff0c;敌人根本无法看到高空墙壁中的人物。 那么胜利就很简单了。 FPS游戏能够…

4000字IB EE论文该怎么解决?

IB课程的Extend Essay&#xff0c;即EE拓展论文&#xff0c;是一篇基于六门学科课程的论文&#xff0c;需要学生在一年左右的时间里&#xff0c;完成一篇将近4000字&#xff08;中文为4800字&#xff09;的论文。该论文与某一门IB学科组课程相关。学生在论文中要体现自己对这门…

Windows Server 2022 Install Veeam Backup 12

Veeam Backup & Replication 是一款可靠的四合一解决方案&#xff0c;将备份、复制副本、存储快照和 CDP 复制副本统一在一款可靠的数据保护解决方案下&#xff0c;可助力实现数据保护现代化并消除停机。通过有效的勒索软件防护实现更快速、更灵活的恢复和保留选项&#xf…

seo网站内容优化有哪些(网站链接怎么做)

网站链接seo过程中&#xff0c;如果存在死链接会对网站造成影响吗&#xff1f;如果网站中有过多的死链接存在&#xff0c;会对网站产生什么样的影响呢&#xff1f;针对这个问题&#xff0c;小编就带大家一起来分析一下。 如果网站内存在着大量的死链接&#xff0c;当搜索引擎蜘…

vue2低代码平台搭建(二)揭秘页面设计器

前言 大家好,我是L丶Y。我们在上一篇文章中走进了低代码的世界,这一章节我们要开始干货内容了,来探索一下低代码开发的核心 —— 页面设计器。 我们知道,低代码开发平台都是通过拖拉拽可视化的页面设计器进行页面开发的,在这一章节,我们来探索一下页面设计器的实现方式…

在Manjaro平台安装flutter开发环境

安装flutter 安装flutter&#xff0c;配套的java建议使用openjdk 11。 yay -S flutter安装好以后注意看提示&#xff0c;还需要额外执行几条命令&#xff1a; sudo gpasswd -a ${USER} flutterusers newgrp flutterusers安装android studio yay -S android-studio配置andro…

yaml、yml:配置介绍及用法

目录 1、yaml介绍 2、yaml语法规则 3、yml显示自动提示 1、yaml介绍 YAML (YAML Ain t Markup Language) &#xff0c;一种数据序列化格式 优点: 1、容易阅读 2、容易与脚本语言交互 3、以数据为核心&#xff0c;重数据轻格式 YAML文件扩展名 .yml(主流) .yaml 2、ya…

2022年末29个省市区14企业征信机构分析及申请建议

2013年1月21日&#xff0c;国务院颁布了《征信业管理条例》(国务院令第631号)&#xff0c;自2013年3月15日起施行。该条例要求设立经营企业征信业务的征信机构&#xff0c;自公司登记机关准予登记之日起30日内向所在地的国务院征信业监督管理部门派出机构办理备案。后陆续出台了…

ubuntu 下的opencv3的下载与实现简单功能

看自己用户的名字 whoami 例子1&#xff1a; #include <stdio.h> #include <opencv2/opencv.hpp>using namespace std; using namespace cv;int main() {cv::Mat image;namedWindow("DebugWindow", WINDOW_NORMAL); resizeWindow("DebugWindow&q…

OAuth2(2)

目录 一、OAuth2的项目介绍 1.搭建OAuth2流程演示 2.创建项目结构 ① 客户 ② 认证服务器 ③ 资源所有者 ④ 资源服务器 ⑤ 客户发送请求 3.流程 一、OAuth2的项目介绍 1.搭建OAuth2流程演示 ① 下载代码 演示代码下载&#xff1a; https://gitee.com/lisenaq/…

MySQL8.0-Linux版安装

MySQL8.0.26-Linux版安装 1. 准备一台Linux服务器 云服务器或者虚拟机都可以; Linux的版本为 CentOS7; 2. 下载Linux版MySQL安装包 https://downloads.mysql.com/archives/community/ 3. 上传MySQL安装包 4. 创建目录,并解压 mkdir mysqltar -xvf mysql-8.0.26-1.el7.x86…

redis四:redis实现分布式锁

文章目录redis实现分布式锁环境搭建redis手写分布式锁redisson 分布式锁分析springboot 整合 redissonredisson原理分析redisson源码分析加锁逻辑锁续命逻辑redisson获取不到锁自旋逻辑解锁逻辑redis实现分布式锁 环境搭建 搭建nginx 模拟分布式情况 upstream redissonlock{…

排序算法的实现

文章目录 一、排序的概念及其运用 1.排序的概念2.常见的排序算法二、常见排序算法的实现 1.插入排序 1.直接插入排序2.希尔排序2.选择排序 1.直接选择排序2.堆排序3.交换排序 1.冒泡排序2.快速排序 1.hoare版本2.挖坑法3.前后指针版本4.归并排序5.非比较排序三、排序算法复杂度…

AOSP 8.0 系统启动之一内核启动

目录 一、前言 二、涉及源码​​​​​​​ 三、源码分析​​​​​​​ 一、前言 Android本质上就是一个基于Linux内核的操作系统&#xff0c;与Ubuntu Linux、Fedora Linux类似&#xff0c;我们要讲Android&#xff0c;必定先要了解一些Linux内核的知识。 Linux内核的东西…

LeetCode - 630 课程表Ⅲ

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 630. 课程表 III - 力扣&#xff08;LeetCode&#xff09; 题目描述 这里有 n 门不同的在线课程&#xff0c;按从 1 到 n 编号。给你一个数组 courses &#xff0c;其中 courses[i] [durationi, lastDay…

被面试官问住了,MySQL两阶段提交是什么鬼?

前言 MySQL通过两阶段提交的机制&#xff0c;保证了redo log和bin log的逻辑一致性&#xff0c;进而保证了数据的不丢失以及主从库的数据一致。 而说起两阶段提交&#xff0c;就不得不先介绍一下redo log和bin log。 redo log redo log即重做日志&#xff0c;是InnoDB引擎特…

捷报频传 | 中睿天下再获“2022信创产业实干者企业”荣誉称号

近日&#xff0c;国内信创专业媒体“信创产业”正式公布“2022信创产业实干者”申报结果&#xff0c;同期发布信创产业实干者全景图。作为以“实战对抗”为特点的能力价值型网络安全厂商&#xff0c;中睿天下凭借自主研发实力、信创生态兼容性等综合实力&#xff0c;再次入选信…

stm32使用TB6600驱动器控制42BYGH型步进电机

stm32使用TB6600驱动器控制42BYGH型步进电机 stm32使用TB6600驱动器控制42BYGH型步进电机 文章目录stm32使用TB6600驱动器控制42BYGH型步进电机前言一、使用的设备说明介绍24V开关电源TB6600驱动器产品特点技术规格拨码开关设定42BYGH 步进电机接线方法控制步进电机的正反转控…

深度学习与排序模型发展

8.3 深度学习与排序模型发展 学习目标 目标 了解深度学习排序模型的发展应用 无 8.3.1 模型发展 CTR/CVR预估经历了从传统机器学习模型到深度学习模型的过渡。下面先简单介绍下传统机器学习模型&#xff08;GBDT、LR、到深度模型及应用&#xff0c;然后再详细介绍在深度学习…