20个教程,掌握时间序列的特征分析(附代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
20个教程,掌握时间序列的特征分析(附代码)
【导语】时间序列是指以固定时间为间隔的序列值。本篇教程将教大家用Python对时间序列进行特征分析。
一、什么是时间序列?
时间序列是指以固定时间为间隔的、由所观察的值组成的序列。根据观测值的不同频率,可将时间序列分成小时、天、星期、月份、季度和年等时间形式的序列。有时候,你也可以将秒钟和分钟作为时间序列的间隔,如每分钟的点击次数和访客数等等。
为什么我们要对时间序列进行分析呢?
因为当你想对一个序列进行预测时,首先要完成分析这个步骤。除此之外,时间序列的预测也具有极大商业价值,如企业的供求量、网站的访客量以及股票价格等,都是极其重要的时间序列数据。
那么,时间序列分析都包括哪些内容呢?
要做好时间序列分析,必须要理解序列的内在属性,这样才能做出更有意义且精准的预测。
二、如何在Python中引入时间序列?
关于时间序列的数据大都存储在csv文件或其他形式的表格文件里,且都包含两个列:日期和观测值。
首先我们来看panda包里面的read_csv()函数,它可以将
时间序列数据集(关于澳大利亚药物销售的csv文件)读取为pandas数据框。增加一个parse_dates=['date']字段,可以把包含日期的数据列解析为日期字段。
时间序列数据框
此外,你也可以将文件读取为pandas序列,把日期作为索引列,只需在pd.read_csv()中指定index_col参数。
pandas 序列
注意,在pandas 序列中,'value' 列的位置高于'date' 列,这表明它是一个pandas 序列而非数据框。
三、什么是面板数据?
面板数据同样是基于时间的数据集。
不同之处是,除了时间序列,面板数据还包括一个或多个相关变量,这些变量也是在同个时间段内测得的。
面板数据中的列包括有助于预测y值的解释变量,这些特征列可用于之后的预测。以下是关于面板数据的例子:
面板数据
四、时间序列可视化
接下来,我们用matplotlib对序列进行可视化。
时间序列可视化
由于所有的值都为正数,无论使用y轴的哪一侧都可以看到增长的趋势。
飞机乘客数据-双边序列
由于这是一个月份的时间序列,每年的走势都遵循着特定重复的模式,你可以在同一个图中画出单独每年的折线。这样有助于对这几年的趋势走向进行平行对比。
药品销售的季节性时间序列图
每年的二月份,药品销售会有一次大幅度下跌,三月份会回涨,四月份再次下跌,以此规律循环。很明显,该模式以年为单位,每年循环往复。
不过,随着年份的变化,药品销售总体呈上升趋势。你可以选择使用箱型图将这一趋势进行可视化,可以方便看出每一年的变化。同样地,你也可以按月份绘制箱型图,来观察每个月的变化。
按月份(季节)和年份绘制箱型图:你可以将数据处理成以季节为时间间隔,然后观察特定年份内值
的分布,也可以将全部时间的数据进行对比。
年份序列和月份序列的箱型图
上面的箱型图可以使年份和月份的序列更易于观察。同样,在月份的箱线图中,十二月和一月的药品销售额明显更
高,这是因为处于假期折扣季。
到目前为止,我们了解了通过相似性来观察时间序列的模式,接下来,如何发现这些常见模式中的差异呢?
五、时间序列的模式
任何一个时间序列都可以被分解成以下几个部分:基准+ 趋势成分+ 季节成分+ 残差成分。
趋势是指时间序列中上升或下降的倾斜程度。但季节成分是由于受季节因素影响而产生的周期性模式循环,也可能受每年内不同月份、每月内不同日期、工作日或周末,甚至每天内不同时间的影响。
然而,不一定所有的时间序列都具备趋势或季节性。一个时间序列也可能不存在趋势,但具有季节性。反之亦然。
因此,一个时间序列可以被想象成趋势、季节性和残差项的组合。
时间序列的模式
另一个需要考虑的方面是周期性模式。当序列中的上升和下降,不是按日历中的特定时间间隔发生时,就会出现这种情况。注意不要把“周期”作用和“季节”作用混淆。
那么,如何区分“周期”和“季节”呢?
如果序列中的模式不是以日历中特定间隔循环出现的,那么就是周期。因为与季节性不同,周期作用通常受到商业或社会经济等因素的影响。
六、加法与乘法时间序列
根据趋势和季节的固有属性,一个时间序列可以被建模为加法模型或乘法模型,也就是说,序列中的值可以用各个成分的加和或乘积来表示:
加法时间序列:
值= 基准+ 趋势+ 季节+ 残差
乘法时间序列:
值= 基准x 趋势x 季节x 残差
七、如何将时间序列的成分分解出来?
通过将一个时间序列视为基准、趋势、季节指数及残差
的加法或乘法组合,你可以对时间序列进行经典分解。
加法和乘法分解
设置extrapolate_trend='freq' 有助于处理序列首部趋势
和残差中的空值。
如果你仔细观察加法分解中的残差项,会发现其中仍保留了一些模式。然而,乘法分解中的残差项看起来更具有随机性。因此,对于这一特定序列来说,采用乘法分解更合适。
趋势、季节和残差成分的数值输出均存储在result_mul 里,下面我们对其进行提取,并放入数据框中:
仔细观察,会发现seas、trend 和resid 三列的乘积正好等于actual_values。
八、平稳和非平稳时间序列
平稳是时间序列的属性之一。平稳序列中的值不是时间的函数。
也就是说,平稳序列的平均值、方差和自相关性等统计特征始终为常数。序列的自相关性是指该序列与之前的值间的相关性。
平稳的时间序列也不包括季节因素的影响。那么如何分