当前位置: 首页 > news >正文

每天都和时间序列打交道,我总结了这篇文章!

 Datawhale干货 

作者:戳戳龍,上海交通大学,量化算法工程师

前言


🔴  平时工作中每天都在和时间序列打交道,对时间序列分析进行研究是有必要的

🟡  分享和交流一些自己的在时序处理方面的心得,提供一些思路

🟢  介绍时序的发展情况,以及目前业界常用的方法

🔵  代码希望能模板化,能直接复制过去使用

时序方法发展


331439daedb9312061b56fe010d68257.png2f02d68d3cc14011153979357a18c59d.png

时间序列特征


📌series = trend + seasons + dependence+ error

趋势

📌 时间序列的趋势分量表示该序列均值持续的、长期的变化

a1e8200a6b0fb4e2dc30ff4fa83ac8d3.gifa0f779dcbe11fb67be8344dc364e802f.png
Df['ma20'] = Df['amt'].rolling(20).mean()

周期性(季节性)

8958ea5acd0f88532815af26741b57a3.png

季节时序图

def plot_season(Df):df = Df.copy()# 计算每周属于哪一年df['year'] = df['date'].dt.year# 计算每周为一年当中的第几周df['week_of_year'] = df['date'].dt.weekofyearfor year in df['year'].unique():tmp_df = df[df['year'] == year]plt.plot(tmp_df['week_of_year'], tmp_df['amt'], '.-', label=str(year))plt.legend()plt.show()
b0c9f75c59bbddb78f4bf231fb754d06.png

周期判断

📌如果每隔h个单位,ACF值有一个局部高峰,则数据存在以h为单位的周期性

from  statsmodels.graphics.tsaplots import plot_acf
plot_acf(Df['amt'], lags=500).show()
539338004ed7f52993b72d0fecf07822.png

自相关性

自相关

📌自相关函数 autocorrelation function 有序的随机变量序列与其自身相比较 自相关函数反映了同一序列在不同时序的取值之间的相关性

from statsmodels.graphics.tsaplots import plot_acf
_ = plot_acf(Df['amt'], lags=50)
cf022e4eafbb05a31502776682969a37.png61f1f20a7a538a583ff48d2aa33743ef.png

偏自相关

from statsmodels.graphics.tsaplots import plot_pacfplot_pacf(Df['amt'], lags=5)
3fceb93967d0d82904c389fab723403f.png

残差

  • 外部变量

  • 残差

Prophet

📌官方文档:https://facebook.github.io/prophet/docs/quick_start.html#python-api

原理

模型结构

📌模型结构——关于时间的广义线性模型

  • g(t):trend,用分段线性函数或逻辑增长曲线(logistic)拟合

  • s(t):seasonality,用傅里叶级数拟合。可以叠加多个季节性,如weekly,yearly (s = s1+s2……

  • h(t):regressor,用线性函数拟合。可以叠加多个外部变量,如节假日、温度、活动(h = h1+h2+……

  • :模型残差 不用拟合

  • 以上方程也可以写成乘法形式:

    • 乘法形式和加法形式可以相互转换,乘法形式两边取对数就是加法形式

b295179ed480eac742212b3404b46ce7.png

趋势

分段线性函数

📌线性趋势函数

分段线性趋势函数

  • 超参数,由用户给出

    • 分几段

  • 参数,根据历史数据拟合

    • k:曲线增长速率

    • m:曲线的截距

逻辑增长曲线

7220d60a23d701df84f5c6b5fd2deeb7.png

💚函数展示:https://www.desmos.com/calculator/8pnqou9ojy?lang=zh-CN

  • 超参数

    • C:渐近线

    • 一共分几段

  • 参数

    • k:曲线增长速率

    • m:拐点对应时间

周期性

📌任何周期性函数都可以表示成傅里叶级数

  • 超参数:由用户给定

    周期长度,常见的周期有、

    傅里叶级数的阶数,越大,季节性曲线波动越大,越容易过拟合

  • 参数:由历史数据拟合

    、系数

🔴 函数展示:(https://www.desmos.com/calculator/5prck2beq1?lang=zh-CN

9330927c399ab67814eb8f7ae0d8c063.png

外部因素

  • : 模型输入, 外部因素在时刻的取值

    Z可以是0-1变量 (e.g.是否是法定假日,是否是春节,是否有促销)

    也可以是连续变量 (e.g.产品价格, 温度,降雨量)

  • :线性回归系数

算法流程

b01a4b542ac360aad7127cbeda0d0372.png0b5f8dbdd062c59d12d0f48f5b10dad4.png

1️⃣ 先设定表达式(超参数)

2️⃣ 根据训练集数据求解参数

实践

发电耗煤预测

df_train = Df[ (Df['date']<'2022-01-01') & (Df['date']>='2018-01-01') ]
df_test =  Df[ (Df['date']>='2022-01-01')]
def FB(data):df = pd.DataFrame({'ds': data.date,'y': data.amt,})
#     df['cap'] = data.amt.values.max()
#     df['floor'] = data.amt.values.min()m = prophet.Prophet(changepoint_prior_scale=0.05, daily_seasonality=False,yearly_seasonality=True, #年周期性weekly_seasonality=True, #周周期性
#         growth="logistic",)m.add_seasonality(name='monthly', period=30.5, fourier_order=5, prior_scale=0.1)#月周期性m.add_country_holidays(country_name='CN')#中国所有的节假日    m.fit(df)future = m.make_future_dataframe(periods=30, freq='D')#预测时长
#     future['cap'] = data.amt.values.max()
#     future['floor'] = data.amt.values.min()forecast = m.predict(future)fig = m.plot_components(forecast)fig1 = m.plot(forecast)a = add_changepoints_to_plot(fig1.gca(), m, forecast)return forecast,m
forecast,m = FB(df_train)
48614204859d215aaf1f4259fa5851df.pngac04d8c50ce47480f2f93e0ae25b6594.png5efd5e6135eaae78959f2abedd2ddb95.png
def FPPredict(data,m):df = pd.DataFrame({'ds': data.date,'y': data.amt,})df_predict = m.predict(df)df['yhat'] = df_predict['yhat'].valuesdf = df.set_index('ds')df.plot()return df
df = FPPredict(df_test.tail(200),m)
b852a68eed351d48642f3bfa36d1d6ed.png

申购赎回金额预测

kaggle notebook[1]

Purchase Redemption Data.zip

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import prophet
from prophet.diagnostics import cross_validation
from prophet.diagnostics import performance_metrics
from prophet.plot import plot_cross_validation_metric
import warnings
warnings.filterwarnings('ignore')
data_user = pd.read_csv('../input/purchase-redemption/Purchase Redemption Data/user_balance_table.csv')
data_user['report_date'] = pd.to_datetime(data_user['report_date'], format='%Y%m%d')
data_user.head()
data_user_byday = data_user.groupby(['report_date'])['total_purchase_amt','total_redeem_amt'].sum().sort_values(['report_date']).reset_index()
data_user_byday.head()

申购

#定义模型
def FB(data: pd.DataFrame):df = pd.DataFrame({'ds': data.report_date,'y': data.total_purchase_amt,})
#     df['cap'] = data.total_purchase_amt.values.max()
#     df['floor'] = data.total_purchase_amt.values.min()m = prophet.Prophet(changepoint_prior_scale=0.05, daily_seasonality=False,yearly_seasonality=True, #年周期性weekly_seasonality=True, #周周期性
#         growth="logistic",)
#     m.add_seasonality(name='monthly', period=30.5, fourier_order=5, prior_scale=0.1)#月周期性m.add_country_holidays(country_name='CN')#中国所有的节假日    m.fit(df)future = m.make_future_dataframe(periods=30, freq='D')#预测时长
#     future['cap'] = data.total_purchase_amt.values.max()
#     future['floor'] = data.total_purchase_amt.values.min()forecast = m.predict(future)fig = m.plot_components(forecast)fig1 = m.plot(forecast)return forecast,m
result_purchase,purchase_model = FB(data_user_byday.iloc[:-30])
01ec50e217c0466a46301abe5676dfa7.png4ebae825960b9880bca4d3443df04782.png
def FPPredict(data,m):df = pd.DataFrame({'ds': data.report_date,'y': data.total_purchase_amt,})
#     df['cap'] = data.total_purchase_amt.values.max()
#     df['floor'] = data.total_purchase_amt.values.min()df_predict = m.predict(df)df['yhat'] = df_predict['yhat'].valuesdf = df.set_index('ds')df.plot()return df
purchase_df = FPPredict(data_user_byday.iloc[-30:],purchase_model)
e8595e90936fddeb2ecc8980bc4e08b8.png

赎回

#定义模型
def FB(data: pd.DataFrame):df = pd.DataFrame({'ds': data.report_date,'y': data.total_redeem_amt,})df['cap'] = data.total_purchase_amt.values.max()df['floor'] = data.total_purchase_amt.values.min()m = prophet.Prophet(changepoint_prior_scale=0.05, daily_seasonality=False,yearly_seasonality=True, #年周期性weekly_seasonality=True, #周周期性growth="logistic",)
#     m.add_seasonality(name='monthly', period=30.5, fourier_order=5, prior_scale=0.1)#月周期性m.add_country_holidays(country_name='CN')#中国所有的节假日    m.fit(df)future = m.make_future_dataframe(periods=30, freq='D')#预测时长future['cap'] = data.total_purchase_amt.values.max()future['floor'] = data.total_purchase_amt.values.min()forecast = m.predict(future)fig = m.plot_components(forecast)fig1 = m.plot(forecast)return forecast
result_redeem = FB(data_user_byday)
29ea2fac1e7bd3a531bbdd2d9a4eab9e.pngaecb97951668889ffbd42ed80b1f776e.png

Bonus 时间序列特征工程

https://www.heywhale.com/mw/project/63904f5658e3bea6a3e52800

EDA

import sweetviz as svdef eda(df, name, target=None):sweet_report = sv.analyze(df, target_feat=target)sweet_report.show_html(f'{name}.html')def eda_compare(df1, df2, name, feature, target):feature_config = sv.FeatureConfig(force_text=feature, force_cat=feature)sweet_report = sv.compare(df1, df2, feat_cfg=feature_config, target_feat=target)sweet_report.show_html(f'{name}_compare.html')

完整版请访问:https://www.wolai.com/stupidccl/5dqha79nnrPMf5xTAs6jUu

参考资料

[1]

kaggle notebook: https://www.kaggle.com/code/stupidccl/time-serious-analysis-1/edit/run/107631286

bd8a195f0ef46a06e24bc706f3f64e95.png

干货学习,三连

相关文章:

每天都和时间序列打交道,我总结了这篇文章!

Datawhale干货 作者&#xff1a;戳戳龍&#xff0c;上海交通大学&#xff0c;量化算法工程师前言&#x1f534; 平时工作中每天都在和时间序列打交道&#xff0c;对时间序列分析进行研究是有必要的&#x1f7e1; 分享和交流一些自己的在时序处理方面的心得&#xff0c;提供一…...

【Leetcode——重排链表】

文章目录一、重排链表思路1.思路2.总结一、重排链表 对于这道题&#xff0c;有两种思路&#xff1a; 思路1. 1.使用一个线性表&#xff0c;存储链表中的每个节点&#xff0c;然后按照题目的条件&#xff0c;来链接线性表的各个节点即可。 使用左下标和右下标来定位线性表中的…...

HCIP总结(一)

抽象语言---编码---二进制---电信号----处理电信号 &#xff08;电脑工作流程&#xff09; OSI参考模型 ----OSI/RM (核心思想&#xff1a;分层) 应用层----提供各种应用服务&#xff0c;将抽象语言转换成编码&#xff0c;提供人机交互的接口 表示层----将编码转换成二进制 …...

华为OD机试真题Python实现【黑板上色】真题+解题思路+代码(20222023)

题目 疫情过后希望小学终于又重新开学了,3 年 2 班开学第一天的任务是将后面的黑板报重新制作, 黑板上已经写上了N个正整数,同学们需要给这每个数分别上一种颜色, 为了让黑板报既美观又有学习意义,老师要求同种颜色的所有数都可以被这个颜色中最小的那个数整除, 现在帮小…...

C++中的利器——模板

前文本文主要是讲解一下C中的利器——模板&#xff0c;相信铁子们在学完这一节后&#xff0c;写代码会更加的得心应手&#xff0c;更加的顺畅。一&#xff0c;泛型编程想要学习模板&#xff0c;我们要先了解为什么需要模板&#xff0c;我们可以看看下面这个程序。int add(int&a…...

k8s控制器

目录 一、控制器简介 二、控制器类型 1、RC和RS 2、Deployment 3、DaemonSet 4、Job 5、CronJob 6、StateFulSet 7、HPA 一、控制器简介 在kubernetes中&#xff0c;按照Pod的创建方式可以将其分为两类&#xff1a; 自主式:kubernetes直接创建出来的Pod&#xff0c;…...

嵌入式学习笔记——认识STM32的 GPIO口

寄存器开发STM32GPIO口前言认识GPIOGPIO是什么GPIO有什么用GPIO怎么用STM32上GPIO的命名以及数量GPIO口的框图&#xff08;重点&#xff09;输入框图解析三种输入模式GPIO输入时内部器件及其作用1.保护二极管2.上下拉电阻&#xff08;可配置&#xff09;3.施密特触发器4.输入数…...

类和对象(中)

文章目录 继承的概念继承的语法父类成员访问super关键字子类构造方法super和this初始化protected关键字继承方式final关键字继承与组合一、继承的概念 继承(inheritance)机制&#xff1a;是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类…...

Java——单词接龙

题目链接 leetcode在线oj题——单词接龙 题目描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&#xff…...

HTML DOM 事件监听器

通过JavaScript&#xff0c;我们可以给页面的某些元素添加事件的监听器&#xff0c;当元素触发相应事件的时候监听器就会捕捉到这个事件并执行相应的代码。addEventListener() 方法实例当用户点击按钮时触发监听事件&#xff1a;document.getElementById("myBtn").ad…...

java基本数据类型取值范围

在JAVA中一共有八种基本数据类型&#xff0c;他们分别是 byte、short、int、long、float、double、char、boolean 整型 其中byte、short、int、long都是表示整数的&#xff0c;只不过他们的取值范围不一样 byte的取值范围为-128~127&#xff0c;占用1个字节&#xff08;-2的…...

maven的安装配置

目录 1. Maven的安装配置 1.1检测jdk的版本 1.2下载maven 1.3配置maven环境变量 2.认识maven的目录结构 2.1 创建一个文件夹作为项目的根目录 1.创建如下结构的目录 2. 在pom.xml文件中写入如下内容(不用记忆) 3.在mian-->java--》下边创建java文件​编辑 4.cmd下…...

【转载】System Verilog 上下文context的含义以及设置导入函数的作用域

放丢失&#xff0c;转载一下&#xff0c;原文&#xff1a;https://blog.csdn.net/qq_31348733/article/details/1010546251. 上下文(context)的含义导入函数的上下文是该函数定义所在的位置&#xff0c;比如$unit 、模块、program或者package作用域(scope)&#xff0c;这一点跟…...

redis数据类型

Redis 数据类型 redis无论什么数据类型&#xff0c;在数据库中都是以key-value形式保存&#xff0c;并且所有的key(键)都是字符串&#xff0c;所以讨论基础数据结构都是讨论的value值的数据类型 1. 字符串操作 set key value [ex seconds] [px milliseconds] [nx|xx] 设置ke…...

【独家】华为OD机试 - 最多获得的短信条数(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...

【剧前爆米花--爪哇岛寻宝】包装类的装拆箱和泛型的擦除机制

作者&#xff1a;困了电视剧 专栏&#xff1a;《数据结构--Java》 文章分布&#xff1a;这是关于数据结构的基础之一泛型的文章&#xff0c;希望对你有所帮助。 目录 包装类 装箱 装箱源码小细节 拆箱 泛型 什么是泛型 泛型编译的擦除机制 不能实例化泛型类型数组 包装…...

BufferQueue研究

我们在工作的过程中&#xff0c;肯定听过分析卡顿或者冻屏问题的时候&#xff0c;定位到APP卡在dequeueBuffer方法里面&#xff0c;或者也听身边的同事老说3Buffer等信息。所以3Buffer是什么鬼&#xff1f;什么是BufferQueue?搞Android&#xff0c;你一定知道Graphic Buffer和…...

【计组笔记08】计算机组成与原理之IO设备系统(输入、输出设备、外存储器)

这篇文章,主要介绍计算机组成与原理之IO设备系统(输入、输出设备、外存储器)。 目录 一、IO设备系统 1.1、IO系统的演变 (1)早期阶段 (2)接口模块和DMA阶段...

使用Vue实现数据可视化大屏功能(一)

导语   现在在很多的工程项目中&#xff0c;都有有关于数据大屏相关的监控内容&#xff0c;这里我们就来看一下如何用Vue来搭建一个数据可视化大屏应用。 创建项目 使用WebStorm工具创建一个Vue的项目。如下图所示&#xff0c;配置好vue的脚手架工具和nodejs的运行环境&#…...

华为OD机试真题Python实现【整数对最小和】真题+解题思路+代码(20222023)

整数对最小和 题目 给定两个整数数组 array1 array2 数组元素按升序排列 假设从array1 array2中分别取出一个元素可构成一对元素 现在需要取出K个元素 并对取出的所有元素求和 计算和的最小值 注意: 两对元素如果对应于array1 array2中的两个下标均相同,则视为同一个元素 �…...

2023年绿色建筑国际会议(ICoGB 2023)

2023年绿色建筑国际会议&#xff08;ICoGB 2023&#xff09; 重要信息 会议网址&#xff1a;www.icogb.org 会议时间&#xff1a;2023年5月19-21日 召开地点&#xff1a;斯德哥尔摩 截稿时间&#xff1a;2023年4月1日 录用通知&#xff1a;投稿后2周内 收录检索&#xff…...

【力扣1653】使字符串平衡的最少删除次数

给你一个字符串 s &#xff0c;它仅包含字符 a 和 b​​​​ 。你可以删除 s 中任意数目的字符&#xff0c;使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j &#xff0c;且 s[i] b 的同时 s[j] a &#xff0c;此时认为 s 是 平衡 的。请你返回使 s 平衡 的 最少 删除次数。…...

链表的中间结点与链表的倒数第k个结点(精美图示详解哦)

全文目录引言链表的中间结点题目描述与思路实现链表的倒数第k个结点题目描述与思路实现总结引言 在上一篇文章中&#xff0c;介绍了反转链表 我们利用了链表是逻辑连续的特点&#xff0c;逆置了链表的逻辑连接顺序&#xff0c;从而实现反转链表&#xff1a; 戳我查看反转链表详…...

防静电监控仪可以检测现场设备是否和实际大地接触

随着电子产品集成化度越来越高&#xff0c;对于电子产品装配来说&#xff0c;静电的危害严重影响到产品的质量、成品率和可靠性, 必须对用于电子产品装配的净化间进行系统防静电措施&#xff0c;将生产过程中的静电危害程度降至最低。近年来电子企业对ESD的危害的深入认识&…...

计算机网络第八版——第二章课后题答案(超详细)

第二章 该答案为博主在网络上整理&#xff0c;排版不易&#xff0c;希望大家多多点赞支持。后续将会持续更新&#xff08;可以给博主点个关注~ 第一章 答案 【2-01】物理层要解决哪些问题&#xff1f;物理层的主要特点是什么&#xff1f; 解答&#xff1a;物理层考虑的是怎…...

2023年3月全国DAMA-CDGA/CDGP数据管理认证火热报名中...

弘博创新是DAMA中国授权的数据治理人才培养基地&#xff0c;贴合市场需求定制教学体系&#xff0c;采用行业资深名师授课&#xff0c;理论与实践案例相结合&#xff0c;快速全面提升个人/企业数据治理专业知识与实践经验&#xff0c;通过考试还能获得数据专业领域证书。 DAMA认…...

查询与进程调度(CFS)相关信息

目录 查询与进程相关的调度信息 查看CFS调度信息 CPU相关的信息 CFS就绪队列的总运行时间 实时队列与deadline调度的相关信息 所有进程相关的信息 查询与进程相关的调度信息 进程的nice值&#xff0c;优先级&#xff0c;调度策略,vruntime等信息。在proc目录下&#xf…...

07对MVC的理解

MVC是一种设计模式&#xff0c;用于将应用程序的不同方面分离开来&#xff0c;以便更容易地管理和维护应用程序。MVC代表模型-视图-控制器&#xff0c;它将应用程序分为三个主要组件&#xff1a;模型&#xff08;Model&#xff09;&#xff1a;负责管理应用程序的数据和业务逻辑…...

WebSocket与Socket、TCP、HTTP的关系

目录&#xff1a;1、名词解析&#xff1b;2、WebSocket简介与原理&#xff1b;3、WebSocket和Http的关系和异同点&#xff1b;4、WebSocket与Socket的区别&#xff1b;5、Socket和TCP/IP&#xff1b;6、一个应用程序的通信链路&#xff1b;1、基础名词解析&#xff1a;&#xf…...

音频基础知识简述 esp-sr 上手指南

此篇博客先对音频基础知识进行简要叙述&#xff0c;然后帮助读者入门 esp-sr SDK。 1 音频的基本概念 1.1 声音的本质 声音的本质是波在介质中的传播现象&#xff0c;声波的本质是一种波&#xff0c;是一种物理量。 两者不一样&#xff0c;声音是一种抽象的&#xff0c;是声…...

网站三大要素是什么意思/自助友链平台

JAVA面经复习&#xff08;十&#xff09; 面试难度:☆☆☆☆ 问&#xff1a;String s new String&#xff08;“abc”&#xff09;创建了几个对象? 答&#xff1a;2个&#xff0c;在JVM中存在着一个字符串池&#xff0c;其中保存着很多String对象&#xff0c;并且可以被共…...

wordpress 说说 插件/互联网推广话术

恶意代码分析实战&#xff08;最权威的恶意代码分析指南&#xff0c;理论实践分析并重&#xff0c;业内人手一册的宝典&#xff09; 【美】Michael Sikorski&#xff08;迈克尔.斯科尔斯基&#xff09;, Andrew Honig&#xff08;安德鲁.哈尼克&#xff09;著 《恶意代码分析…...

青岛网站设计哪家好/seoul是什么意思中文

state 1.类中方法this的指向 constructor和render里的this指向类组件的实例对象在类组件内部定义的普通函数&#xff0c;作为onClick的回调&#xff0c;不是通过实例调用的&#xff0c;是直接调用&#xff0c;并且类组件内部默认开启了局部严格模式&#xff0c;所以this指向u…...

win2008做的网站打不开/品牌设计公司排名前十强

“开始”——“运行”——“msconfig”回车 在“服务”里面可以找到 至于删除服务项&#xff0c;可能 Windows 不允许吧&#xff0c;如果真的要彻底删除&#xff0c;就请打开注册表&#xff08;“开始”——“运行”——“regedit”&#xff09;然后依次打开HKEY_LOCAL_MACHI…...

赚钱网站如何做/it教育培训机构

由于公司停了系统的密码认证&#xff0c;所有传输文件只能用其他认证方式。 rsync和scp都可以用自己的认证方式传输数据&#xff0c;rsync传输速度快&#xff0c;但是需要deamon模式运行&#xff0c;配置起来比较慢&#xff0c;而scp可以比较快速的部署两台机器之间的认证&…...

移动网站建设哪家好/免费数据分析网站

//程序存在bug&#xff0c;会不断占用内存直到死机//是malloc函数的问题/**************************************************** 文件名&#xff1a;pthread_server.c* 文件描述&#xff1a;创建子线程来接收客户端的数据***************************************************…...