当前位置: 首页 > 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中的两个下标均相同,则视为同一个元素 �…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...