【Python】时间序列数据分析与预测之Python工具汇总

共 10209字,需浏览 21分钟

 ·

2022-05-15 17:06


本文中总结了十多种时间序列数据分析和预测工具和python库,在我们处理时间序列项目时,可以翻开本文,根据需要选择合适的工具,将会事半功倍!
在处理时间序列项目时,数据科学家或 ML 工程师通常会使用特定的工具和库。或者他们使用一些众所周知的工具,而这些工具已被证明可以很好地适用与对应的时间序列项目。

如果能将这些工具汇总,在以后的项目中将会很受用。这篇文章是一个时间序列工具和包的备忘录。其中一些是非常有名的,也有些可能是第一次听说。不过没关系,先点赞加收藏,希望你以后会发现这篇文章很有用!

时间序列

时间序列是按时间顺序索引的数据点序列。这是在连续时间点对同一变量的观察。换句话说,它是在一段时间内观察到的一组数据。具体可以参考该文章:时间序列定义、均值、方差、自协方差及相关性一文解读时间序列基本概念

数据通常绘制为图表上的一条线,x 轴为时间,y 轴为每个点的值。此外,时间序列有四个主要组成部分:

  • 趋势
  • 季节性变化
  • 周期性变化
  • 随机变化

一般来说,时间序列经常被用于经济学、数学、生物学、物理学、气象学等许多领域。

时间序列项目示例

股票预测

股票市场预测是一个具有挑战性和吸引力的话题,其主要目标是开发多种方法和策略来预测未来的股票价格。有很多不同的技术,从经典的算法和统计方法到复杂的神经网络架构。共同点是它们都利用不同的时间序列来实现准确的预测。股市预测方法被业余投资者、金融科技初创公司和大型对冲基金广泛使用。

基本面分析着眼于公司的财务报表、管理和行业趋势等因素。此外,它还考虑了一些宏观经济指标,例如通货膨胀率、GDP、经济状况等。所有这些指标都是时间相关的,因此可以表示为时间序列。

与基本面分析相比,技术分析使用交易量、价格变化和来自市场本身的其他信息的模式来预测股票未来的表现。投资者在做出投资决定之前了解这两种方法很重要。

心电异常检测

心电图异常检测是一种检测心电图异常的技术。心电图是一项监测心脏电活动的测试。基本上,它是由心脏产生并表示为时间序列的电信号。

心电图异常检测是通过将心电图的正常模式与异常模式进行比较来完成的。心电图异常有多种类型,可分为以下几类:

  • 心率异常: 这是指心率在正常范围内的任何变化。这可能是由于心脏问题或如何刺激它。
  • 心律异常:这是指节律与其正常模式的任何变化。这可能是由于脉冲通过心脏传导的方式存在问题,或者它们通过心脏传导的速度存在问题。

从学术研究到商用心电图机,在这个主题上已经做了很多工作,并且有一些有希望的结果。最大的问题是系统应该具有很高的准确性,并且不应该有任何误报或误报。这是由于问题的性质和错误预测的后果。

时间序列项目的工具

时间序列在各个行业中的重要性,已经不用多说。接下来看看用于时间序列项目的Python工具都有哪些。

  1. 数据准备和特征工程工具
  2. 数据分析和可视化工具
  3. 时间序列预测工具

数据准备和特征工程

数据准备和特征工程是数据科学管道中的两个非常重要的步骤。数据准备通常是任何数据科学项目的第一步。这是将数据转换为可用于分析和进一步处理的形式的过程。

特征工程是从原始数据中提取特征以使其对建模和预测更有用的过程。下面,我们将提到一些用于这些任务的最流行的工具。

Pandas 的时间序列处理

Pandas 是一个用于数据操作和分析的 Python 库。它包括用于操作数值表和时间序列的数据结构和方法。此外,它还包含广泛的功能和特性,可用于处理所有领域的时间序列数据。

它支持来自各种文件类型的数据输入,包括 CSV、JSON、Parquet、SQL 数据库表和查询以及 Microsoft Excel。此外,Pandas 允许各种数据操作功能,例如合并、重塑、选择以及数据清理和整理。

一些常用的时间序列特征是:

  • 日期范围生成和频率转换

  • 移动窗口统计

  • 移动窗口线性回归

  • 日期转换

  • 滞后等等

NumPy 的时间序列处理

NumPy 是一个 Python 库,它增加了对巨大的多维数组和矩阵的支持,以及可以在这些数组上使用大量高级数学运算的函数。它的语法与 MATLAB 非常相似,包括一个高性能的多维数组对象以及处理这些数组的能力。

NumPy 的 datetime64 数据类型和数组可以非常方便地表示时间序列中的日期。使用 NumPy 还可以轻松地使用线性代数运算进行各种时间序列运算。

Datetime 的时间序列处理

Datetime 是一个 Python 模块,它允许我们处理日期和时间。该模块包含处理场景所需的方法和功能,例如:
  • 日期和时间的表示

  • 日期和时间的算术

  • 日期和时间的比较

使用此工具处理时间序列很简单。它允许用户将日期和时间转换为对象并对其进行操作。例如,只需要几行代码,就可以从一种 DateTime 格式转换为另一种格式,添加到日期的天数、月数或年数,或者计算两个时间对象之间的秒数差异。

Tsfresh 的时间序列处理

Tsfresh 是一个 Python 包。它会自动计算大量的时间序列特征,称为特征。该软件包将来自统计、时间序列分析、信号处理和非线性动力学的既定算法与强大的特征选择算法相结合,以提供系统的时间序列特征提取。

Tsfresh 包包括一个过滤程序,以防止提取不相关的特征。此过滤程序评估每个特征对回归或分类任务的解释能力和重要性。

高级时间序列功能的一些示例是:

  • 傅里叶变换组件

  • 小波变换组件

  • 偏自相关等

数据分析和可视化包

数据分析和可视化包是帮助数据分析师从他们的数据中创建图形和图表的工具。数据分析被定义为清理、转换和建模数据的过程,以便发现对业务决策有用的信息。数据分析的目标是从数据中提取有用的信息并根据该信息做出决策。

数据的图形表示称为数据可视化。使用图表和图形等可视化元素的数据可视化工具提供了一种查看和理解数据趋势和模式的简便方法。

时间序列有大量的数据分析和可视化包,这里总结了其中的一些常用的工具。

Matplotlib 的时间序列可视化

用于数据可视化的最流行的 Python 包可能是 Matplotlib。它用于创建静态、动画和交互式可视化。使用 Matplotlib 可以做一些事情,例如:

  • 制作适合出版的地块
  • 创建可以放大、平移和更新的交互式图形
  • 改变视觉风格和布局

Plotly 时间序列可视化

Plotly 是一个交互式、开源和基于浏览器的 Python 和 R 图形库。它是一个高级的声明性图表库,具有 30 多种图表类型,包括科学图表、3D 图表、统计图表、SVG 地图、金融图表等等。

除此之外,使用 Plotly 还可以绘制基于时间序列的交互式图表,例如折线图、甘特图、散点图等。

Statsmodels 时间序列可视化

Statsmodels 是一个 Python 包,它提供了用于估计各种统计模型以及运行统计测试和统计数据分析的类和函数。

它为时间序列分解及其可视化提供了一种非常方便的方法。使用这个包,可以轻松分解任何时间序列并分析其组成部分,例如趋势、季节性组成部分以及残差或噪声。

statsmodels 库在名为seasonal_decompose()的函数中提供了简单或经典分解方法的实现。它要求你指定模型是加法还是乘法。seasonal_decompose() 函数返回一个结果对象。结果对象以数组形式提供对趋势和季节性系列的访问。它还提供了对残差的访问,残差是趋势之后的时间序列,并且去除了季节性成分。

时间序列预测包

时间序列项目中最重要的部分可能是预测。预测是根据当前和过去的数据预测未来事件的过程。它基于这样一种假设,即未来可以从过去实现。此外,它假设数据中有一些模式可用于预测接下来会发生什么。

时间序列预测的方法有很多种,从简单的线性回归和基于 ARIMA 的方法开始,到复杂的多层神经网络或集成模型。在这里,我们将展示一些支持不同类型模型的包。

使用 Statsmodels 进行时间序列预测

Statsmodels 是我们在数据可视化工具一节中已经提到的一个包。但是,这是一个更相关的预测包。基本上,这个包提供了一系列统计模型和假设检验。

Statsmodels 包还包括用于时间序列分析的模型类和函数。自回归移动平均模型 (ARMA) 和向量自回归模型 (VAR) 是基本模型的示例。马尔可夫切换动态回归和自回归是非线性模型的示例。它还包括时间序列描述性统计,例如自相关、偏自相关函数和周期图,以及 ARMA 或相关过程的理论性质。

Statsmodels[8] 描述了如何使用 Statsmodels 包开始使用时间序列。

使用 Pmdarima 进行时间序列预测

Pmdarima 是一个统计库,有助于使用基于 ARIMA 的方法对时间序列进行建模。除此之外,它还具有其他功能,例如:

  • 一组平稳性和季节性的统计检验

  • 各种内生和外生变压器,包括 Box-Cox 和傅里叶变换

  • 季节性时间序列、交叉验证实用程序和其他工具的分解

也许这个库最有用的工具是 Auto-Arima 模块,它在提供的约束内搜索所有可能的 ARIMA 模型,并根据 AIC 或 BIC 值返回最佳模型。

这个包不是很常见,这里给出一个简单的例子:

上下滑动查看更多源码

import pmdarima as pm
from pmdarima import model_selection
import matplotlib.pyplot as plt
import numpy as np
# 加载数据并将其拆分为单独的部分
data = pm.datasets.load_lynx()
train, test = model_selection.train_test_split(data, train_size=100)
# fit一些验证(cv)样本
arima = pm.auto_arima(train, start_p=1, start_q=1, d=0, max_p=5, max_q=5,
                      out_of_sample_size=10, suppress_warnings=True,
                      stepwise=True, error_action='ignore')

# 现在绘制测试集的结果和预测
preds, conf_int = arima.predict(n_periods=test.shape[0],
                                return_conf_int=True)

fig, axes = plt.subplots(21, figsize=(128))
x_axis = np.arange(train.shape[0] + preds.shape[0])
axes[0].plot(x_axis[:train.shape[0]], train, alpha=0.75)
axes[0].scatter(x_axis[train.shape[0]:], preds, alpha=0.4, marker='o')
axes[0].scatter(x_axis[train.shape[0]:], test, alpha=0.4, marker='x')
axes[0].fill_between(x_axis[-preds.shape[0]:], conf_int[:, 0], conf_int[:, 1],
                     alpha=0.1, color='b')

# 填写在模型中"held out"样本的部分
axes[0].set_title("Train samples & forecasted test samples")

# 现在将实际样本添加到模型中并创建NEW预测
arima.update(test)
new_preds, new_conf_int = arima.predict(n_periods=10, return_conf_int=True)
new_x_axis = np.arange(data.shape[0] + 10)

axes[1].plot(new_x_axis[:data.shape[0]], data, alpha=0.75)
axes[1].scatter(new_x_axis[data.shape[0]:], new_preds, alpha=0.4, marker='o')
axes[1].fill_between(new_x_axis[-new_preds.shape[0]:],
                     new_conf_int[:, 0], new_conf_int[:, 1],
                     alpha=0.1, color='g')
axes[1].set_title("Added new observed values with new forecasts")
plt.show()


使用 Sklearn 进行时间序列预测

Sklearn 或 Scikit-Learn 无疑是 Python 中最常用的机器学习包之一。它提供了各种分类、回归和聚类方法,包括随机森林、支持向量机、k-means 等。除此之外,它还提供了一些与降维、模型选择、数据预处理等相关的实用程序。

除了各种模型之外,对于时间序列,还有一些有用的功能,例如管道、时间序列交叉验证函数、用于测量结果的各种指标等。

使用 PyTorch 进行时间序列预测

PyTorch 是一个基于 Python 的深度学习库,用于快速灵活的实验。它最初由 Facebook 人工智能研究团队的研究人员和工程师开发,然后开源。Tesla Autopilot、Uber 的 Pyro 和 Hugging Face 的 Transformers 等深度学习软件都建立在 PyTorch 之上。

使用 PyTorch,可以构建强大的循环神经网络模型,例如 LSTM 和 GRU 以及预测时间序列。此外,还有一个具有最先进网络架构的 PyTorch 预测包(PyTorch Forecasting )。它还包括一个时间序列数据集类,用于抽象处理变量转换、缺失值、随机子采样、多个历史长度和其他类似问题。

PyTorch Forecasting 旨在通过神经网络简化最先进的时间序列预测,以用于现实世界的案例和研究等。目标是为专业人士提供具有最大灵活性并为初学者提供合理默认值的高级 API。具体来说,该软件包提供

  • 一个时间序列数据集类,它抽象处理变量转换、缺失值、随机子采样、多个历史长度等。
  • 一个基本模型类,它提供时间序列模型的基本训练以及登录张量板和通用可视化,例如实际与预测和依赖图
  • 用于时间序列预测的多个神经网络架构,已针对实际部署进行了增强,并具有内置的解释功能
  • 多水平时间序列指标
  • Ranger 优化器用于更快的模型训练
  • 使用optuna进行超参数调整

使用 Tensorflow (Keras) 进行时间序列预测

TensorFlow 是一个基于数据流图的机器学习开源软件库。它最初由 Google Brain 团队开发供内部使用,但后来作为开源项目发布。该软件库提供了一组高级数据流算子,可以组合起来以自然的方式表达涉及多维数据数组、矩阵和高阶张量的复杂计算。它还提供了一些较低级别的原语,例如用于构造自定义运算符或加速执行常见操作的内核。

Keras 是构建在 TensorFlow 之上的高级 API。使用 Keras 和 TensorFlow,可以构建用于时间序列预测的神经网络模型。下面的教程解释了使用天气时间序列数据集的时间序列项目的一个示例:

使用 Sktime 进行时间序列预测

Sktime 是一个用于时间序列和机器学习的开源 Python 库。它包括有效解决时间序列回归、预测和分类任务所需的算法和转换工具。创建 Sktime 是为了与 scikit-learn 一起工作,并且可以轻松地为相互关联的时间序列任务调整算法以及构建复合模型。

总体而言,此包提供:

  • 最先进的时间序列预测算法
  • 时间序列的转换,例如去趋势或去季节化等
  • 模型和转换、模型调整实用程序和其他有用功能的管道

使用 Prophet 进行时间序列预测

Prophet 是 Facebook 核心数据科学团队发布的开源库。简而言之,它包含一个预测时间序列数据的程序,该程序基于一个加性模型,该模型将一些非线性趋势与年度、每周和每日季节性以及假日效应相结合。它最适用于具有强烈季节性影响的时间序列和来自多个季节的历史数据。它通常能够处理缺失数据、趋势变化和异常值。

使用 Pycaret 进行时间序列预测

PyCaret 是 Python 中的一个开源机器学习库,可自动执行机器学习工作流。使用 PyCaret,可以用最少的工作和几行代码来构建和测试多个机器学习模型。一般用最少的代码,不需要深入细节,就可以构建一个从 EDA 到部署的端到端机器学习项目。

这个库有一些有用的时间序列模型,其中包括:

  • 季节性朴素预测器
  • ARIMA
  • 多项式趋势预测器
  • Lasso Net 具有去季节化和去趋势选项以及许多其他选项

使用 AutoTS 进行时间序列预测



AutoTS 是 Python 的时间序列包,旨在自动化时间序列预测。它可用于为单变量和多变量时间序列找到最佳时间序列预测模型。此外,AutoTS 本身会从数据中清除任何缺失值或异常值。

近 20 个预定义模型(如 ARIMA、ETS、VECM)可用,并且使用遗传算法,它可以为给定数据集进行预处理、找到最佳模型和模型集成。

使用 Darts 进行时间序列预测

Darts 是一个 Python 库,允许对时间序列进行简单的操作和预测。它包括范围广泛的模型,从经典的 ES 和 ARIMA 到 RNN 和transformers。所有模型都可以以与 scikit-learn 包中相同的方式使用。

该库还允许轻松地对模型进行回测、组合来自多个模型的预测以及合并外部数据。它支持单变量和多变量模型。可以在此处找到所有可用模型的表以及几个示例:

# TimeSeries从 Pandas DataFrame创建一个对象,并将其拆分为训练/验证系列:
import pandas as pd
import matplotlib.pyplot as plt
from darts import TimeSeries
from darts.models import ExponentialSmoothing
df = pd.read_csv('AirPassengers.csv', delimiter=",")
series = TimeSeries.from_dataframe(df, 'Month''#Passengers')
train, val = series[:-36], series[-36:]
# 拟合指数平滑模型,并对验证系列的持续时间进行(概率)预测:
model = ExponentialSmoothing()
model.fit(train)
prediction = model.predict(len(val), num_samples=1000)
# 绘制中位数、第 5 和第 95 个百分位数:
series.plot()
prediction.plot(label='forecast', low_quantile=0.05, high_quantile=0.95)
plt.legend()

使用 Kats 进行时间序列预测

Kats 是 Facebook 基础设施数据科学团队发布的一个包,旨在执行时间序列分析。这个包的目标是提供时间序列分析所需的一切,包括检测、预测、特征提取/嵌入、多变量分析等。

Kats 提供了一套全面的预测工具,例如集成、元学习模型、回测、超参数调整和经验预测区间。此外,它还包括用于检测时间序列数据中的季节性、异常值、变化点和缓慢趋势变化的功能。使用 TSFeature 选项,可以生成 65 个具有清晰统计定义的特征,这些特征可用于大多数机器学习模型。

from kats.models.sarima import SARIMAModel, SARIMAParams
# create SARIMA param class
params = SARIMAParams(p = 2, d=1, q=1
       trend = 'ct', seasonal_order=(1,0,1,12))
# initiate SARIMA model
m = SARIMAModel(data=air_passengers_ts, params=params)
# fit SARIMA model
m.fit()
# generate forecast values
fcst = m.predict(steps=30, freq="MS")
m.plot()

预测库比较

这里提供了一个包含一些常见功能的表格来比较预测包。表中显示了一些指标,例如 GitHub 星数、发布年份、支持功能等。


发行年份GitHub 星星统计与计量经济学机器学习深度学习
Statsmodels20107200✅ ✅
Pmdarima20181100
Sklearn200750000✅✅
PyTorch201655000
✅✅
TensorFlow2015164000
✅✅
Sktime20195000

Prophet201714000
PyCaret20205500
AutoTS2020450
Darts20213800
Kats20213600

结论

在这篇文章中,我们描述了时间序列项目最常用的工具、包和库。使用此工具列表,可以涵盖几乎所有与时间序列相关的项目。最重要的是,我们提供了用于预测的库的比较,其中显示了一些有趣的统计数据,例如发布年份、受欢迎程度以及它支持的模型类型。

上下滑动查看更多

参考资料

[1]

Pandas: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html

[2]

NumPy: https://numpy.org/

[3]

Datetime: https://docs.python.org/3/library/datetime.html#module-datetime

[4]

Tsfresh: https://tsfresh.readthedocs.io/en/latest/index.html

[5]

Matplotlib: https://matplotlib.org/

[6]

Plotly: https://plotly.com/python/time-series/

[7]

Statsmodels: https://www.statsmodels.org/dev/generated/statsmodels.tsa.seasonal.seasonal_decompose.html

[8]

Statsmodels: https://www.statsmodels.org/stable/tsa.html

[9]

pmdarima: https://alkaline-ml.com/pmdarima/

[10]

Sklearn: https://scikit-learn.org/stable/index.html

[11]

PyTorch: https://github.com/jdb78/pytorch-forecasting

[12]

TensorFlow: https://www.tensorflow.org/tutorials/structured_data/time_series

[13]

Sktime: https://www.sktime.org/en/stable/

[14]

Prophet: https://github.com/facebook/prophet

[15]

PyCaret: https://pycaret.readthedocs.io/en/time_series/api/time_series.html

[16]

autots_1280: https://github.com/winedarksea/AutoTS

[17]

Darts: https://unit8co.github.io/darts/

[18]

smaimr1: https://facebookresearch.github.io/Kats/

[19]

smaimr2: https://github.com/facebookresearch/Kats



往期精彩回顾




浏览 123
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报