何为时间序列分析:
时间序列经常通过折线图绘制。时间序列用于统计,信号处理,模式识别,计量经济学,数学金融,天气预报,地震预测,脑电图,控制工程,天文学,通信工程,以及主要涉及时间测量的任何应用科学和工程领域。
时间序列分析包括用于分析时间序列数据的方法,以便提取有意义的统计数据和数据的其他特征。时间序列预测是使用模型根据先前观察到的值预测未来值。虽然回归分析通常采用的方式是测试理论,即一个或多个独立时间序列的当前值会影响另一个时间序列的当前值,但这种时间序列分析不称为“时间序列分析”,其重点是比较不同时间点的单个时间序列或多个相关时间序列的值。中断时间序列 分析是对单个时间序列的干预分析。
时间序列数据具有自然的时间顺序。这使得时间序列分析不同于横断面研究,其中没有观察的自然顺序(例如,通过参考其各自的教育水平来解释人们的工资,其中个体的数据可以以任何顺序输入)。时间序列分析也不同于空间数据分析,其中观测通常与地理位置相关(例如,通过位置来计算房价以及房屋的内在特征)。一个随机的时间序列的模型通常会反映出这样一个事实,即与时间紧密相连的观测结果将比进一步分开的观察结果更加密切相关。此外,时间序列模型通常会利用时间的自然单向排序,因此给定时期的值将表示为从过去的值中获得,而不是从未来的值中获得(参见时间可逆性)。
时间序列分析可应用于实值,连续数据,离散 数字数据或离散符号数据(即字符序列,如英语中的字母和单词)。
常用时间序列分析:
时间序列的常用算法包括移动平均(MA, Moving Average)、指数平滑(ES, Exponen-tial Smoothing)、差分自回归移动平均模型(ARIMA , Auto-regressive Integrated Moving Average Model)三大主要类别,每个类别又可以细分和延伸出多种算法。
当数据集规模较大、数据粒度丰富时,我们可以选择多种时间序列的预测模式。时间序列的数据粒度可分为秒、分、小时、天、周、月、季度、年等,不同的粒度都可以用来做时间序列预测。
假如有3650天(完整10年)以每分钟时间戳为粒度的数据,那么这份数据集会有5256 000(60分钟24小时365天*10年)条记录。基于该数据集预测今天的总数据,可以考虑的时间序列模式有三种:
- 整合模式:将历史数据按每天数据进行汇总,得到按天为粒度的共计3650条时间序列数据;然后应用所有数据集做时间序列分析,预测的时间序列项目为1(天)。
- 横向模式:将历史数据按每小时做汇总,得到按小时为粒度87600条时间序列数据;然后将要预测的1天划分为24小时(即24个预测点),这样会形成24个预测模型,每个模型只预测对应的小时点数据,预测的时间序列项目为1(小时);最后将预测得到的24个小时点的数据求和得到今天的总数据。
- 纵向模式:这种模式的粒度更细,无需对历史数据做任何形式的汇总,这样有525600条时间序列数据。将要预测的1天划分为1440个分钟点(60分钟*24小时),这样会形成1440个预测模型,每个模型只预测对应的分钟点的数据,预测的时间序列项目为1(分钟);最后将预测得到的1440个分钟点的数据求和得到今天的总数据。
这三种方式的训练集都是3650条,即按天为粒度的数据。横向模式和纵向模式由于做更细的粒度切分,因此需要更多的模型,这意味着需要更多的时间来做训练和预测。当第一种整合模式不能满足需求或者预测结果不佳时,可以尝试后两种模式。
平稳性
平稳性是做时间序列分析的前提条件,所谓平稳通俗理解就是数据没有随着时间呈现明显的趋势和规律,例如剧烈波动、递增、递减等,而是相对均匀且随机地分布在均值附近。在ARIMA模型中的I就是对数据做差分以实现数据的平稳,而ARIMA关键参数p、d、q中的d即时间序列成为平稳时所做的差分次数。
如何判断时间序列数据是否需要平稳性处理?一般有三种方法:
- 观察法:通过输出时间序列图发现数据是否平稳。本示例中的adf_val函数便含有该方法。
- 自相关和偏相关法:通过观察自相关和偏相关的系数分析数据是否平稳。
- ADF检验:通过ADF检验得到的显著性水平分析数据是否平稳。本示例中的adf_val函数便有含有该方法。
实现数据的平稳有以下几种方法:
- 对数法:对数处理可以减小数据的波动,使其线性规律更加明显。但需要注意的是对数处理只能针对时间序列的值大于0的数据集。
- 差分法:一般来说,非纯随机的时间序列经一阶差分或者二阶差分之后就会变得平稳(statsmodels的ARIMA模型自动支持数据差分,但最大为2阶差分)。
- 平滑法:根据平滑技术的不同,可分为移动平均法和指数平均法,这两个都是最基本的时间序列方法。
- 分解法:将时序数据分离成不同的成分,包括成长期趋势、季节趋势和随机成分等。
白噪声
白噪声(white noise)检验也称为随机性检验,用于检验时间序列的各项数值之间是否具有任何相关关系,白噪声分布是应用时间序列分析的前提。检测时间序列是否属于随机性分布,可通过图形法和Ljung Box法检验。
- 图形法:时间序列应该是围绕均值随机性上下分布的状态。
- Ljung Box法:是对时间序列是否存在滞后相关的一种统计检验,判断序列总体的相关性或者说随机性是否存在。
白噪声检验通常和数据平稳性检验是协同进行数据检验的,这意味着如果平稳性检验通过,白噪声检验一般也会通过。
python实现
import pandas as pd # pandas库
import numpy as np # numpy库
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf # acf和pacf展示库
from statsmodels.tsa.stattools import adfuller # adf检验库
from statsmodels.stats.diagnostic import acorr_ljungbox # 随机性检验库
from statsmodels.tsa.arima_model import ARMA # ARMA库
import matplotlib.pyplot as plt # matplotlib图形展示库
import prettytable # 导入表格库
# 由于pandas判断周期性时会出现warning,这里忽略提示
import warnings
warnings.filterwarnings('ignore')
#### 读取数据 ####
# 创建解析列的功能对象
date_parse = lambda dates: pd.datetime.strptime(dates, '%m-%d-%Y')
# 读取数据
df = pd.read_table('https://raw.githubusercontent.com/ffzs/dataset/master/time_series.txt', delimiter='\t', index_col='date', date_parser=date_parse)
# 将列转换为float32类型
ts_data = df['number'].astype('float32')
print ('data summary')
# 打印输出时间序列数据概况
print (ts_data.describe())
# 多次用到的表格
def pre_table(table_name, table_rows):
'''
:param table_name: 表格名称,字符串列表
:param table_rows: 表格内容,嵌套列表
:return: 展示表格对象
'''
table = prettytable.PrettyTable() # 创建表格实例
table.field_names = table_name # 定义表格列名
for i in table_rows: # 循环读多条数据
table.add_row(i) # 增加数据
return table
# 稳定性(ADF)检验
def adf_val(ts, ts_title, acf_title, pacf_title):
'''
:param ts: 时间序列数据,Series类型
:par