每天都和时间序列打交道,我总结了这篇文章!
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中的两个下标均相同,则视为同一个元素 �…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
