1. 时间序列规则

1.1 什么是时间序列规则

对于赛题/业务的规则之前已经描述了它的重要性和应用,在此不再赘述。这章主要了解时间序列及其规则,和周期的应用。

1.1.1 时间序列

时间序列(或称动态数列):指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。通常是在相等间隔的时间段内依照给定的采样率对某种潜在过程进行观测的结果。

目的:时间序列数据本质上反映的是某个或者某些随机变量随时间不断变化的趋势,而时间序列预测方法的核心就是从数据中挖掘出这种规律,并利用其对将来的数据做出估计。

  • 可以反映社会经济现象的发展变化过程,描述现象的发展状态和结果。
  • 可以研究社会经济现象的发展趋势和发展速度。
  • 可以探索现象发展变化的规律,对某些社会经济现象进行预测。
  • 利用时间序列可以在不同地区或国家之间进行对比分析,这也是统计分析的重要方法之一。

构成要素:长期趋势,季节变动,循环变动,不规则变动。

  • 长期趋势( T )现象在较长时期内受某种根本性因素作用而形成的总的变动趋势。
  • 季节变动( S )现象在一年内随着季节的变化而发生的有规律的周期性变动。
  • 循环变动( C )现象以若干年为周期所呈现出的波浪起伏形态的有规律的变动。
  • 不规则变动(I )是一种无规律可循的变动,包括严格的随机变动和不规则的突发性影响很大的变动两种类型。

时间序列的规则

  • 时期长短最好一致
  • 总体范围大小应该一致
  • 指标的经济内容应该统一
  • 时间段内的计算方法应该统一
  • 计算价格和计量单位可比性

1.2 时间序列的周期简介

A. 平稳序列
是基本上不存在趋势的序列,序列中的各观察值基本上在某个固定的水平上波动,在不同时间段波动程度不同,可缓和,可波动,不存在规律周期。

B. 非平稳序列
是包含趋势、季节性或周期性的序列,只含有其中一种成分,也可能是几种成分的组合。可分为:有趋势序列、有趋势和季节性序列、几种成分混合(例如T、S、C、I全有)而成的复合型序列。

a. 趋势T
时间序列在长时期内呈现出来的某种持续上升或持续下降的变动,也称长期趋势。时间序列中的趋势可以是线性和非线性。

b. 季节性S
季节变动(seasonal fluctuation),是时间序列在一年内重复出现的周期波动。这里的季节不仅指一年中的四季,其实是指任何一种周期性的变化。含有季节成分的序列可能含有趋势,也可能不含有趋势。

c. 周期性C
循环波动(cyclical fluctuation),是时间序列中呈现出来的围绕长期趋势的一种波浪形或振荡式波动。周期性通常是由经济环境的变化引起。
不同于趋势变动,不是朝着单一方向的持续运动,而是涨落相间的交替波动。
不同于季节变动,季节变动有比较固定的规律,且变动周期大多为一年,循环波动则无固定规律,变动周期多在一年以上,且周期长短不一。

d. 不规则性I
除此之外,还有偶然性因素对时间序列产生影响,致使时间序列呈现出某种随机波动。时间序列除去趋势、周期性和季节性后的偶然性波动,称为随机性(random),也称不规则波动(irregular variations)。

关于时间序列模型下个章节会详细介绍。

1.3 中位数、临近数据等简单统计量

时间序列的几个模型在第一章节已做介绍,下面对常用特征数据进行筛选分析。

中位数
常见得时间序列特征数据之一:中位数。中位数作为时间序列的特征是一种简单而有效的提取周期因子的方法。因为中位数稳健又十分鲁棒,不受极端值的影响。不过缺点也比较明显,中位数损失了很多信息,后续可以进行优化,例如提取均值和中位数进行融合,按照权重以测试集的结果暂定。

均值
刚才有提到,可以应用均值和中位数进行融合优化特征。其实均值也是常用的模型特征之一,不过由于分布问题,在均匀正态分布的时候较适合使用。

临近数据
对于时间序列特征而言不得不提临近数据,在有一定延续性,季节性以及小区建的趋势时候,临近数据是必不可少的特征之首。

1.4 基于周期因子的时间序列预测

对于同个群体/个人或同类群体/个人在一定的时间段内进行的固定活动都具有一定的时间序列规则,有一定的周期性,例如支付、金融、市场、交通数据等等。对于时间序列而言,周期因子是重要的核心。

1.4.1 周期因子的时间序列预测案例

举个简单的栗子:

由图可以看到周一到周日的周期波动。预测的核心任务就是尽可能准确的提取这种周期。
第一步: 除以周均值,得到一个比例。
第二步: 按列取中位数,综上就可以得到一组鲁棒的周期因子。

周期因子1 = 每个日子(工作日或周末)的总值 / 整体的均值
周期因子2 = 每个日子(工作日或周末)/ 周均值 的中位数

做预测时,只要将周期因子,乘以一个base,就可以做下一周的预测。例如根据每周客流量的延续性取最后一周的平均客流量100作为base,选择周期因子2-中位数为这次的周期因子,那么直接乘上中位数,就得到下一周的预测:

直接用最后一周的平均客流量作为base并不一定是最好的方法。也许最后三天或最后五天的均值能更好的反映最新的情况。但是不能直接对最后三天客流量取均值(最后三天是周末,这样取的base就偏大了)。
需要去掉周期性因素后,再取平均。具体做法:
客流量 = 用最近一周的客流量 / 周期因子2

这样可以取最后三天的平均:(108+91.4+120)/3=106.5,作为base。具体取多少天的,也要通过测试集的表现来确定,也可以按某些函数形式来给每天赋予不同的权重。

1.4.1 周期因子的时间序列预测步骤

根据上述周期因子预测的案例,进行以下的步骤总结:

  1. 对周期进行分段:例如按照一个月来计算的周期,分成每一天作为单位计算量,时间段规为每一周,如同上述案例的形式。
  2. 显现频次:统计最小单位的量,并计算时间段的均量,将已有的数据显现出来。
  3. 计算周期因子:中位数因子,加权因子
  • 中位数因子:计算每个最小单位量与时间段均值的比值,根据固定的时间单位,例如周几或每月1号或N天中的第一天作为时间点,计算其中位数的占比值为中位数因子。例如上述案例的“中位数”
  • 加权因子:计算固定时间单位的总量与时间段均值的比值。例如上述案例中的“因子”
  1. 预测:根据每个单位的周期因子和base预测最小单位数值,一般base会选择就近的时间段均值。
  2. 优化Base:优化Base实际是优化时间段的均值,将上述最近单位的数值进行优化-去周期性,再取平均值。即保证了一定的延续性,又去掉了单个单位的周期性因素。
  • 去周期性:就近时间段的单位数值除以对应的周期因子。
  • 新的Base:选择一定的时间(可以根据测试集进行优化),取其均值。

1.5 代码区

import pandas as pd
import sklearn as skr
import numpy as np
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
from dateutil.relativedelta import relativedelta     #实现月份相加减功能

上一章节对数据进行了分析探索,由于业务特点,暂时选择201404及后的数据进行趋势分析预测。

# 加载申购赎回的数据
def load_data(path: str = 'user_balance_table.csv')->pd.DataFrame:data_balance = pd.read_csv(path)data_balance = add_timestamp(data_balance)return data_balance.reset_index(drop=True)# 在申购赎回数据集上添加时间标签
def add_timestamp(data: pd.DataFrame, time_index: str = 'report_date')->pd.DataFrame:data_balance = data.copy()data_balance['date'] = pd.to_datetime(data_balance[time_index], format= "%Y%m%d")data_balance['day'] = data_balance['date'].dt.daydata_balance['month'] = data_balance['date'].dt.monthdata_balance['year'] = data_balance['date'].dt.yeardata_balance['week'] = data_balance['date'].dt.weekdata_balance['weekday'] = data_balance['date'].dt.weekdayreturn data_balance.reset_index(drop=True)# 计算单位时间的申购和赎回总量
def get_total_balance(data: pd.DataFrame, date: str = '2014-03-31')->pd.DataFrame:df_tmp = data.copy()df_tmp = df_tmp.groupby(['date'])['total_purchase_amt','total_redeem_amt'].sum()df_tmp.reset_index(inplace=True)return df_tmp[(df_tmp['date']>= date)].reset_index(drop=True)# 将测试集数据拼接到原数据集汇总
def generate_test_data(data: pd.DataFrame)->pd.DataFrame:total_balance = data.copy()start = datetime.datetime(2014,9,1)testdata = []while start != datetime.datetime(2014,10,15):temp = [start, np.nan, np.nan]testdata.append(temp)start += datetime.timedelta(days = 1)testdata = pd.DataFrame(testdata)testdata.columns = total_balance.columnstotal_balance = pd.concat([total_balance, testdata], axis = 0)total_balance = total_balance.reset_index(drop=True)return total_balance.reset_index(drop=True)# L下载查看乘客信息数据集
def load_user_information(path: str = 'user_profile_table.csv')->pd.DataFrame:return pd.read_csv(path)
# 载入数据balance_data = load_data('user_balance_table.csv')
balance_data = add_timestamp(balance_data)
total_balance = get_total_balance(balance_data, date = '2014-03-01')
total_balance = generate_test_data(total_balance)
total_balance = add_timestamp(total_balance, 'date')
# 创建数据的深层拷贝data = total_balance.copy()
# 定义生成时间序列规则预测结果的方法def generate_base(df: pd.DataFrame, month_index: int)->pd.DataFrame:# 选中固定时间段的数据集total_balance = df.copy()total_balance = total_balance[['date','total_purchase_amt','total_redeem_amt']]total_balance = total_balance[(total_balance['date'] >= datetime.datetime(2014,3,1)) & (total_balance['date'] < datetime.datetime(2014, month_index, 1))]# 加入时间戳total_balance['weekday'] = total_balance['date'].dt.weekdaytotal_balance['day'] = total_balance['date'].dt.daytotal_balance['week'] = total_balance['date'].dt.weektotal_balance['month'] = total_balance['date'].dt.month# 统计翌日因子mean_of_each_weekday = total_balance[['weekday']+['total_purchase_amt','total_redeem_amt']].groupby('weekday',as_index=False).mean()for name in ['total_purchase_amt','total_redeem_amt']:mean_of_each_weekday = mean_of_each_weekday.rename(columns={name: name+'_weekdaymean'})mean_of_each_weekday['total_purchase_amt_weekdaymean'] /= np.mean(total_balance['total_purchase_amt'])mean_of_each_weekday['total_redeem_amt_weekdaymean'] /= np.mean(total_balance['total_redeem_amt'])# 合并统计结果到原数据集total_balance = pd.merge(total_balance, mean_of_each_weekday, on='weekday', how='left')# 分别统计翌日在(1~31)号出现的频次weekday_count = total_balance[['day','weekday','date']].groupby(['day','weekday'],as_index=False).count()weekday_count = pd.merge(weekday_count, mean_of_each_weekday, on='weekday')# 依据频次对翌日因子进行加权,获得日期因子weekday_count['total_purchase_amt_weekdaymean'] *= weekday_count['date']   / len(np.unique(total_balance['month']))weekday_count['total_redeem_amt_weekdaymean'] *= weekday_count['date']  / len(np.unique(total_balance['month']))day_rate = weekday_count.drop(['weekday','date'],axis=1).groupby('day',as_index=False).sum()# 将训练集中所有日期的均值剔除日期残差得到baseday_mean = total_balance[['day'] + ['total_purchase_amt','total_redeem_amt']].groupby('day',as_index=False).mean()day_pre = pd.merge(day_mean, day_rate, on='day', how='left')day_pre['total_purchase_amt'] /= day_pre['total_purchase_amt_weekdaymean']day_pre['total_redeem_amt'] /= day_pre['total_redeem_amt_weekdaymean']# 生成测试集数据for index, row in day_pre.iterrows():if month_index in (2,4,6,9) and row['day'] == 31:breakday_pre.loc[index, 'date'] = datetime.datetime(2014, month_index, int(row['day']))# 基于base与翌日因子获得最后的预测结果day_pre['weekday'] = day_pre.date.dt.weekdayday_pre = day_pre[['date','weekday']+['total_purchase_amt','total_redeem_amt']]day_pre = pd.merge(day_pre, mean_of_each_weekday,on='weekday')day_pre['total_purchase_amt'] *= day_pre['total_purchase_amt_weekdaymean']day_pre['total_redeem_amt'] *= day_pre['total_redeem_amt_weekdaymean']day_pre = day_pre.sort_values('date')[['date']+['total_purchase_amt','total_redeem_amt']]return day_pre
# 生成预测结果(以及残差)base_list = []
for i in range(4, 10):base_list.append(generate_base(data, i).reset_index(drop=True))base = pd.concat(base_list).reset_index(drop=True)
for i in ['total_purchase_amt','total_redeem_amt']:base = base.rename(columns={i: i+'_base'})data = pd.merge(data.reset_index(drop=True), base.reset_index(drop=True), on='date', how='left').reset_index(drop=True)data['purchase_residual'] = data['total_purchase_amt'] / data['total_purchase_amt_base']data['redeem_residual'] = data['total_redeem_amt'] / data['total_redeem_amt_base']

# 对结果表重命名data = data[['date','purchase_residual','redeem_residual','total_purchase_amt_base', 'total_redeem_amt_base']]
for i in data.columns:if i == 'date':data[i] = data[i].astype(str)data[i] = data[i].str.replace('-','')
data.columns = [['date'] + ['total_purchase_amt','total_redeem_amt'] + ['total_purchase_predicted_by_cycle','total_redeem_predicted_by_cycle'] ]

# 保存预测结果到本地data.to_csv('base_one.csv',index=False)

将第一次计算的结果上传,得到分数

分数不高,有待优化。

2. 时间序列

上面对时间序列进行了基本介绍,下面将对时间序列模型进行详细介绍。

时间序列模型通常有三种:

混合模型实际上是可根据业务多种分析组装的,例如IJCAI的季军曾用过周期与周期项后剩余的残杀作为周期因子,如下:

2.1 时间序列分解

时间序列对于模型分解方法常用的有四种:经典分解法、X11分解法、SEATS分解法以及STL分解法。

基本思路:

  • 运用移动平均法剔除长期趋势和周期变化,得到序列TC。然后再用按月(季)平均法求出季节指数S。
  • 做散点图,选择合适的曲线模型拟合序列的长期趋势,得到长期趋势T。
  • 计算周期因素C。用序列TC除以T即可以得到周期变动因素C。
  • 将时间序列T、S、C分解出来以后,剩余的即为不规则变动,即:I=Y/(TSC)。

经典分解法(Classical decomposition)
经典分解法属于最早的分解法,步骤相对简单,同时也是很多其他分解算法的基础。
经典分解法的假设周期性成分在每个周期内都是相同的。

算法比较古老,已不适用。

** X11分解法(X11 decomposition)**
季度性数据和月度数据的分解算法是 X11分解法,它发明于美国人口普查局和加拿大统计局。X11有一些 复杂的方法来处理交易日、假期、一些已知的影响因素的影响。它同时处理了加性模型和乘性模型。这个过程是全自动的,而且对于时间序列中的异常值和数据平平变动很鲁棒。

X11-ARIMA模型属于长应用模型。对于X11分解法在次不做详解。

** SEATS分解(SEATS decomposition)**
“SEATS”是指“Seasonal Extraction in ARIMA Time Series”。这个方法是由西班牙银行开发 的,现在被广泛应用在各国的政府部门中。这个算法只是针对季度性和月度数据。因此天级数据、小时级数据或者周数据,需要其他的方法。

STL分解(STL decomposition)
STL是时间序列分解的一种versatile和鲁棒的方法。它是“Seasonal and Trend decomposition using Loess”的缩写,其中Loess是一种鲁棒的回归算法。
本章索要详细介绍的正是STL分解法。

2.2 STL分解




2.3 时间序列模型

这次主要介绍的是ARIMA模型:





参考文献

https://blog.csdn.net/roger_royer/article/details/86439723

https://blog.csdn.net/qq_29831163/article/details/89440215

https://blog.csdn.net/mengjizhiyou/article/details/82683448

https://zhuanlan.zhihu.com/p/70282110

https://blog.csdn.net/snowdroptulip/article/details/79125912

https://www.cnblogs.com/en-heng/p/7390310.html

https://www.ucloud.cn/yun/41868.html

时间序列规则和时间序列模型相关推荐

  1. matlab 神经网络预测时间序列示例(水痘模型)

    神经网络预测时间序列示例(水痘模型) clc,clear; close all; %% Importing Data and plotting data=chickenpox_dataset; dat ...

  2. bagging和时间序列预测_时间序列的LSTM模型预测——基于Keras

    一.问题背景     现实生活中,在一系列时间点上观测数据是司空见惯的活动,在农业.商业.气象军事和医疗等研究领域都包含大量的时间序列数据.时间序列的预测指的是基于序列的历史数据,以及可能对结果产生影 ...

  3. 【算法竞赛学习】资金流入流出预测-挑战Baseline_时间序列规则

    赛题简介 蚂蚁金服拥有上亿会员并且业务场景中每天都涉及大量的资金流入和流出,面对如此庞大的用户群,资金管理压力会非常大.在既保证资金流动性风险最小,又满足日常业务运转的情况下,精准地预测资金的流入流出 ...

  4. 数据挖掘——时间序列算法之ARCH模型

    数据挖掘--时间序列算法之ARCH模型 先占个坑 1.平滑法 2.趋势拟合法 3.组合模型 4.AR模型 5.MA模型 6.ARMA模型 7.ARIMA模型 8.ARCH模型 9.GARCH模型及其衍 ...

  5. 【深度学习 项目实战】Keras深度学习多变量时间序列预测的LSTM模型

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程.人工智能教程 本篇文章将介绍基于 ...

  6. 时间序列预测-传统统计学模型ARIMA

    ARIMA单变量预测股价DEMO 时间序列介绍: 统计学模型-ARIMA介绍 ARIMA 参数选择说明 源代码解析 参考资料 时间序列介绍: 时间序列(TIME-SERISE)充斥着我们生活的空间,在 ...

  7. 时间序列预测任务的模型选择最全总结

    在第一部分,将了解多种时间序列的模型,如 经典的时间序列模型 监督学习模型 基于深度学习的模型 在第二部分,将建立几个时间序列模型来预测股市的应用案例,并了解一些时间序列建模技术.这些模型将相互比较, ...

  8. 数据挖掘——时间序列算法之MA模型

    数据挖掘--时间序列算法之MA模型 1.平滑法 2.趋势拟合法 3.组合模型 4.AR模型 5.MA模型 6.ARMA模型 7.ARIMA模型 8.ARCH模型 9.GARCH模型及其衍生模型 前一篇 ...

  9. 数据挖掘——时间序列算法之ARIMA模型

    数据挖掘--时间序列算法之ARIMA模型 前言 差分定义 ARIMA模型 实践 1.检验序列的平稳性 2.进行一阶差分后,进行平稳性和白噪声检验 3.对一阶差分之后的平稳非白噪声序列拟合ARMA模型 ...

最新文章

  1. 【原创】Python 源文件编码解读
  2. vector嵌套vector嵌套pair
  3. java解析html的table
  4. 第 18 章 Django 入门
  5. Java初阶知识总结
  6. 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
  7. 关于微信“被返回页”在被返回时自动刷新
  8. C++离航篇——函数默认参数、函数重载、内敛函数
  9. 没有bug队——加贝——Python 57,58
  10. 需要gmail的朋友请留下你们的email,还有86个
  11. SAP License:如何建立应付暂估明细查询
  12. delphi解析json(解决乱码问题)
  13. OpenCV学习(13) 细化算法(1)(转)
  14. studio创建java工程_Android studio从头一步步创建Java项目
  15. Visual Studio 2005 提示“试图运行项目时出错:无法启动调试。绑定句柄无效”~[解决方案]...
  16. Ubuntu18.04 iso文件下载地址
  17. 随机效应模型介绍及实例分析
  18. 计算机网络启动慢,台式电脑开机网络连接慢的解决办法
  19. 用to_datetime函数实现时间格式的转化
  20. pytorch系统学习

热门文章

  1. 2021阿里巴巴编程题(4星)第二题
  2. eclipse下搭建SWT图形界面开发环境
  3. 华为 C8800 C8650 tun.ko 模块
  4. 汉语是最了不起的语言
  5. 公式编辑器打的文字上浮怎么办?
  6. 适配器AdapterView(ArrayAdapter SimpleAdapter BaseAdapter)
  7. 元宇宙是一个美丽神话还是下一代互联网的终极形态?
  8. 微信中直接下载app的解决方法,解决微信中无法直接下载app的问题
  9. 工业齿轮润滑油市场现状及未来发展趋势
  10. 常用颜色中英文,16进制,rgb格式