每天都和时间序列打交道,我总结了这篇文章!
Datawhale干货
作者:戳戳龍,上海交通大学,量化算法工程师
前言
🔴 平时工作中每天都在和时间序列打交道,对时间序列分析进行研究是有必要的
🟡 分享和交流一些自己的在时序处理方面的心得,提供一些思路
🟢 介绍时序的发展情况,以及目前业界常用的方法
🔵 代码希望能模板化,能直接复制过去使用
时序方法发展


时间序列特征
📌series = trend + seasons + dependence+ error
趋势
📌 时间序列的趋势分量表示该序列均值的持续的、长期的变化


Df['ma20'] = Df['amt'].rolling(20).mean()周期性(季节性)

季节时序图
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()
周期判断
📌如果每隔h个单位,ACF值有一个局部高峰,则数据存在以h为单位的周期性
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(Df['amt'], lags=500).show()
自相关性
自相关
📌自相关函数 autocorrelation function 有序的随机变量序列与其自身相比较 自相关函数反映了同一序列在不同时序的取值之间的相关性
from statsmodels.graphics.tsaplots import plot_acf
_ = plot_acf(Df['amt'], lags=50)

偏自相关
from statsmodels.graphics.tsaplots import plot_pacfplot_pacf(Df['amt'], lags=5)
残差
外部变量
残差
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+……):模型残差 不用拟合
以上方程也可以写成乘法形式:
乘法形式和加法形式可以相互转换,乘法形式两边取对数就是加法形式

趋势
分段线性函数
📌线性趋势函数
分段线性趋势函数
超参数,由用户给出
分几段
参数,根据历史数据拟合
k:曲线增长速率
m:曲线的截距
逻辑增长曲线

💚函数展示:https://www.desmos.com/calculator/8pnqou9ojy?lang=zh-CN
超参数
C:渐近线
一共分几段
参数
k:曲线增长速率
m:拐点对应时间
周期性
📌任何周期性函数都可以表示成傅里叶级数
超参数:由用户给定
周期长度,常见的周期有、
傅里叶级数的阶数,越大,季节性曲线波动越大,越容易过拟合
参数:由历史数据拟合
、系数
🔴 函数展示:(https://www.desmos.com/calculator/5prck2beq1?lang=zh-CN

外部因素
: 模型输入, 外部因素在时刻的取值
Z可以是0-1变量 (e.g.是否是法定假日,是否是春节,是否有促销)
也可以是连续变量 (e.g.产品价格, 温度,降雨量)
:线性回归系数
算法流程


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,mforecast,m = FB(df_train)


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 dfdf = FPPredict(df_test.tail(200),m)
申购赎回金额预测
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,mresult_purchase,purchase_model = FB(data_user_byday.iloc[:-30])

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 dfpurchase_df = FPPredict(data_user_byday.iloc[-30:],purchase_model)
赎回
#定义模型
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 forecastresult_redeem = FB(data_user_byday)

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

干货学习,点赞三连↓
相关文章:
每天都和时间序列打交道,我总结了这篇文章!
Datawhale干货 作者:戳戳龍,上海交通大学,量化算法工程师前言🔴 平时工作中每天都在和时间序列打交道,对时间序列分析进行研究是有必要的🟡 分享和交流一些自己的在时序处理方面的心得,提供一…...
【Leetcode——重排链表】
文章目录一、重排链表思路1.思路2.总结一、重排链表 对于这道题,有两种思路: 思路1. 1.使用一个线性表,存储链表中的每个节点,然后按照题目的条件,来链接线性表的各个节点即可。 使用左下标和右下标来定位线性表中的…...
HCIP总结(一)
抽象语言---编码---二进制---电信号----处理电信号 (电脑工作流程) OSI参考模型 ----OSI/RM (核心思想:分层) 应用层----提供各种应用服务,将抽象语言转换成编码,提供人机交互的接口 表示层----将编码转换成二进制 …...
华为OD机试真题Python实现【黑板上色】真题+解题思路+代码(20222023)
题目 疫情过后希望小学终于又重新开学了,3 年 2 班开学第一天的任务是将后面的黑板报重新制作, 黑板上已经写上了N个正整数,同学们需要给这每个数分别上一种颜色, 为了让黑板报既美观又有学习意义,老师要求同种颜色的所有数都可以被这个颜色中最小的那个数整除, 现在帮小…...
C++中的利器——模板
前文本文主要是讲解一下C中的利器——模板,相信铁子们在学完这一节后,写代码会更加的得心应手,更加的顺畅。一,泛型编程想要学习模板,我们要先了解为什么需要模板,我们可以看看下面这个程序。int add(int&a…...
k8s控制器
目录 一、控制器简介 二、控制器类型 1、RC和RS 2、Deployment 3、DaemonSet 4、Job 5、CronJob 6、StateFulSet 7、HPA 一、控制器简介 在kubernetes中,按照Pod的创建方式可以将其分为两类: 自主式:kubernetes直接创建出来的Pod,…...
嵌入式学习笔记——认识STM32的 GPIO口
寄存器开发STM32GPIO口前言认识GPIOGPIO是什么GPIO有什么用GPIO怎么用STM32上GPIO的命名以及数量GPIO口的框图(重点)输入框图解析三种输入模式GPIO输入时内部器件及其作用1.保护二极管2.上下拉电阻(可配置)3.施密特触发器4.输入数…...
类和对象(中)
文章目录 继承的概念继承的语法父类成员访问super关键字子类构造方法super和this初始化protected关键字继承方式final关键字继承与组合一、继承的概念 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类…...
Java——单词接龙
题目链接 leetcode在线oj题——单词接龙 题目描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk: 每一对相邻的单词只差一个字母。 对于 1 < i < k 时ÿ…...
HTML DOM 事件监听器
通过JavaScript,我们可以给页面的某些元素添加事件的监听器,当元素触发相应事件的时候监听器就会捕捉到这个事件并执行相应的代码。addEventListener() 方法实例当用户点击按钮时触发监听事件:document.getElementById("myBtn").ad…...
java基本数据类型取值范围
在JAVA中一共有八种基本数据类型,他们分别是 byte、short、int、long、float、double、char、boolean 整型 其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样 byte的取值范围为-128~127,占用1个字节(-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的含义以及设置导入函数的作用域
放丢失,转载一下,原文:https://blog.csdn.net/qq_31348733/article/details/1010546251. 上下文(context)的含义导入函数的上下文是该函数定义所在的位置,比如$unit 、模块、program或者package作用域(scope),这一点跟…...
redis数据类型
Redis 数据类型 redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型 1. 字符串操作 set key value [ex seconds] [px milliseconds] [nx|xx] 设置ke…...
【独家】华为OD机试 - 最多获得的短信条数(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...
【剧前爆米花--爪哇岛寻宝】包装类的装拆箱和泛型的擦除机制
作者:困了电视剧 专栏:《数据结构--Java》 文章分布:这是关于数据结构的基础之一泛型的文章,希望对你有所帮助。 目录 包装类 装箱 装箱源码小细节 拆箱 泛型 什么是泛型 泛型编译的擦除机制 不能实例化泛型类型数组 包装…...
BufferQueue研究
我们在工作的过程中,肯定听过分析卡顿或者冻屏问题的时候,定位到APP卡在dequeueBuffer方法里面,或者也听身边的同事老说3Buffer等信息。所以3Buffer是什么鬼?什么是BufferQueue?搞Android,你一定知道Graphic Buffer和…...
【计组笔记08】计算机组成与原理之IO设备系统(输入、输出设备、外存储器)
这篇文章,主要介绍计算机组成与原理之IO设备系统(输入、输出设备、外存储器)。 目录 一、IO设备系统 1.1、IO系统的演变 (1)早期阶段 (2)接口模块和DMA阶段...
使用Vue实现数据可视化大屏功能(一)
导语 现在在很多的工程项目中,都有有关于数据大屏相关的监控内容,这里我们就来看一下如何用Vue来搭建一个数据可视化大屏应用。 创建项目 使用WebStorm工具创建一个Vue的项目。如下图所示,配置好vue的脚手架工具和nodejs的运行环境&#…...
华为OD机试真题Python实现【整数对最小和】真题+解题思路+代码(20222023)
整数对最小和 题目 给定两个整数数组 array1 array2 数组元素按升序排列 假设从array1 array2中分别取出一个元素可构成一对元素 现在需要取出K个元素 并对取出的所有元素求和 计算和的最小值 注意: 两对元素如果对应于array1 array2中的两个下标均相同,则视为同一个元素 �…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
