InfluxDB 时间序列数据科学问题工具
作者:Anais Dotis-Georgiou / 用例, 产品
2022 年 9 月 2 日
导航至
本文最初发表在 The New Stack 上,经许可在此处转载。
如果您正在处理时间序列数据,您可能需要执行异常检测或预测。在处理您的 时间序列 之前,第一步是找到合适的数据存储。为了有效地检测或 预测您的数据,您将需要一个能够处理大量数据和高摄取速率的数据存储。因此,您可能需要考虑使用专门构建的时间序列数据库。时间序列数据库与更常见的关系数据库不同,因为它们不是使用行和列来快速查找数据点之间的关系,而是设计用于处理时间序列数据的独特工作负载。
在本文中,我们将使用时间序列数据库 InfluxDB,并讨论一些可用于执行预测和异常检测的工具。我们还将讨论 InfluxDB v2 Python 客户端库的一些增强功能,这些功能使从 InfluxDB 查询数据并将数据科学工具应用于您的时间序列数据变得更加容易。
时间序列数据科学问题的工具
虽然您可以使用 InfluxDB 解决一些时间序列数据科学问题,但您可以使用它解决的问题范围在某种程度上是有限的。对于大多数用例,请使用 InfluxDB 存储所有原始时间序列数据,然后使用 Flux(InfluxDB 的原生查询和脚本语言)来准备您的数据。
接下来,使用 客户端库 将数据提取到另一个环境中。如果您正在解决时间序列数据科学问题,请考虑使用 Python。我看到在 Python 中开发的时间序列工具和包比任何其他语言都多。让我们看一下一些最流行的 Python 时间序列工具。
Pandas 是一个用于数据操作的开源 Python 库。如果您打算使用接下来提到的许多库,您必须使用 Pandas 将数据导入 Pandas DataFrame,因为这是预期的数据格式。Pandas DataFrame 是一个二维、大小可变的数据结构。Pandas 在数据科学界广受欢迎有两个原因。首先,它直观且具有出色的用户体验。使用 Pandas 转换和重塑数据非常有趣。其次,一些数据科学库要求输入是 Pandas DataFrame。
TensorFlow 是一个开源的机器学习和人工智能平台。数据科学家使用 TensorFlow 使用 Python 或 JavaScript 构建和训练模型。TensorFlow 主要用于深度学习应用。深度学习是一种使用神经网络的机器学习类型。神经网络由控制数据流和操作的计算或逻辑门组成。它们控制数据流的方式借鉴了人脑学习的方式,这也是神经网络名称的由来。
TensorFlow 既适合初学者也适合专家。神经网络是具有多个特征的数据的优秀预测器。特征是所有相关的属性,它们将帮助您进行预测——在下一个工具描述中会详细介绍。您还可以使用 TensorFlow 执行异常检测。
Keras 是 TensorFlow 的开源包装器。虽然 TensorFlow 也面向初学者,但对于那些刚接触深度学习的人来说,它仍然可能让人感到不知所措。Keras 旨在通过为其提供界面来简化学习 TensorFlow 的过程。我建议查看 这个关于天气数据时间序列预测的 Keras 教程。在其中,您将学习如何使用 14 个输入特征(包括压力、湿度、温度、风速)来预测温度。它还演示了如何通过生成相关图来执行一些基本特征选择。
特征选择是删除冗余或不相关特征的过程,这样它们就不会对您的模型产生不良影响。相关图或相关矩阵图帮助我们可视化不同变量之间的相关性。彼此高度相关的特征被认为是冗余的。与任何特征都不相关的特征被认为是不相关的。例如,湿度和相对湿度可能被认为是温度预测的冗余特征。您还可以使用 Keras 执行异常检测。
Prophet 是一个用于预测的 Python 库。它将预测问题拟合为曲线拟合练习,或者创建提供“最佳拟合”线的数学模型。Prophet 类似于 Holt-Winters 或三重 指数平滑,这是一种著名的统计预测方法。它的创建旨在使所有背景的用户都能够进行预测。Prophet 不需要关于时间序列数据的专门知识(时间序列数据具有几个独特的统计属性)即可进行预测。相反,它允许用户通过指定独特的假期、日程安排和饱和点(或承载能力)轻松地将领域专业知识纳入其模型中。此外,与其他流行的统计预测方法不同,Prophet 可以很好地处理特有的特征和不规则的时间序列数据,而无需进行数据准备工作。这是因为 Prophet 会自动执行插值并删除异常值。
NeuralProphet 是另一个用于预测的 Python 库。它是 Prophet 的继任者。它的目标是成为 Prophet 和深度学习之间的混合方法。NeuralProphet 旨在使近期预测比 Prophet 能够实现的更准确。换句话说,NeuralProphet 可以使用稀疏或较少的数据进行更准确的预测。NueralProphet 通过使用深度学习来识别和对时间序列中的局部上下文敏感,从而实现更高的准确率。局部上下文是指时间序列数据中季节性或特定形状的子部分。识别局部上下文可以提高预测精度,尤其是在这些形状具有周期性时。但是,值得注意的是,如果您有充足的可靠且经过清理的历史数据,那么 Prophet 的性能可能略微优于 NeuralProphet。
ADTK(异常检测工具包)是一个开源 Python 包,用于时间序列数据中的基于规则的异常检测。ADTK 面向工业物联网用例。在大多数工业物联网案例中,操作员都具有关于其系统应如何正常运行以及常见的异常或故障情况可能是什么样的领域专业知识。
ADTK 允许用户通过组合不同的模块来构建异常检测模型。一种模块类型是 检测器。检测器查找异常点。它们包括查看分位数、阈值、水平偏移、季节性等的方法。ADTK 允许用户将这些功能链接在一起以构建模型,例如,该模型评估数据是否超过此阈值,同时表现出一定幅度的水平偏移并违反季节模式。如果数据满足所有这些基于规则的标准,则存在异常。
还有许多其他用于异常检测的开源包,但 ADTK 因其相对简单性而令人耳目一新。此软件包非常适合识别遵循某些明确定义的统计属性的异常,或者相反,用于发现表现出非常可预测或受控行为的 IoT 数据中的异常。
Telegraf 是一个用于指标和事件的开源收集代理。它是数据库无关的,但它是 InfluxDB 堆栈的一部分,因此您可以轻松地收集时间序列数据并将其写入 InfluxDB。但是,它不仅仅是一个收集代理。您还可以使用 Telegraf 处理数据。Telegraf Execd 处理器插件 使 Telegraf 可以用任何语言进行扩展。这包括使用统计预测算法对小批量数据进行连续预测。这个 repo 包含一个使用 Telegraf 对啤酒温度进行连续预测以更好地调节发酵过程的示例。
Amazon Forecast 是一种时间序列预测服务,用户可以轻松地进行预测,而无需他们在模型选择、训练或部署方面接受过专门培训。Amazon Forecast 提供几种流行的预测算法和神经网络,包括 ARIMA、CNN-QR、DeepAR+、ETS(指数趋势平滑)、NPTS(非参数时间序列)和 Prophet。Amazon Forecast 通过允许用户同时训练所有这些预测算法,使模型选择更加容易。Amazon Forecast 还将在使用多个预测指标(包括均方根误差 (RMSE)、加权分位数损失 (wQL)、平均绝对百分比误差 (MAPE)、平均绝对标度误差 (MASE) 和加权绝对百分比误差 (WAPE) 指标)评估预测准确率后,选择获胜算法。Amazon Forecast 也知道如何解释这些准确率预测指标的结果并返回获胜算法,因此您不必学习如何(统计很难!)。最后,用户可以使用训练后的模型进行预测。Amazon Forecast 还为用户提供了一种便捷的方式,可以在训练前将不同的标准特征集(例如假期)包含到他们的数据中,以提高准确率。
InfluxDB v2 Python 客户端库的增强功能
虽然您可以使用 Flux 执行一些预测和异常检测,但您可能希望利用您已经熟悉的语言和工具。一些最流行的时间序列数据科学问题工具是 Python 库。为了同时利用这些流行的 Python 包和 InfluxDB,您需要使用 InfluxDB v2 Python 客户端库。
在之前的文章中,我们了解了如何从 OpenWeatherMap API 获取天气数据 并使用 InfluxDB v2 Python 客户端库将其存储在 InfluxDB 中。但是,还有一些额外的客户端库功能可以改善使用体验。InfluxDB v2 Python 客户端库支持 Pandas。您可以写入 Pandas DataFrame,并将查询结果作为 Pandas DataFrame 返回。
第一个增强功能是您的 Pandas DataFrame 的形状可以比以前更灵活。以前将 DataFrame 写入 InfluxDB 的一个要求是您必须将时间戳列转换为 DataFrame 索引。现在您只需指定哪一列是您的时间戳列即可。
此外,还接受了 更多时间戳 格式。最后,您还可以在写入方法中指定时间戳列的时区,这样您就不必事先进行转换。
最终,所有这些更改都意味着使用 Pandas 将数据写入 InfluxDB 变得更加容易,因为用户不必花费更多代码行来转换其 DataFrame 以满足旧的要求。实际上,您可以直接从 CSV 读取数据并使用以下代码将其写入 InfluxDB:
import pandas as pd
from influxdb_client import InfluxDBClient
from influxdb_client.client.write_api import SYNCHRONOUS
url = "http://localhost:8086"
// or the URL of your Cloud instance e.g. https://us-west-2-1.aws.cloud2.influxdata.com/
token = "my-token"
org = "my-org"
with InfluxDBClient(url=url, token=token, org=org) as client:
df = pd.read_csv("path/to/CSV.csv")
client \
.write_api(write_options=SYNCHRONOUS) \
.write(bucket="my-bucket",
record=df,
data_frame_timestamp_column="Date",
data_frame_timestamp_timezone="EST")
InfluxDB 在解决时间序列数据科学问题方面的局限性和优势
InfluxDB 在解决时间序列数据科学问题方面具有以下局限性:
- 在使用 InfluxDB 解决时间序列数据科学问题时,没有很多原生工具。虽然您可以使用 InfluxDB 进行一些基本的预测或异常检测,但您可能需要使用客户端库来查询您的数据,并使用其他专门构建的工具来解决您的数据科学问题。
InfluxDB 在解决时间序列数据科学问题方面具有以下优势:
- InfluxDB 可以处理许多时间序列问题所需的摄取量。
- 您可以使用 InfluxDB 预处理您的数据,以便为任何其他数据科学工作做好准备。
- 您可以使用 InfluxDB 执行一些基本的预测和异常检测,这可能就足够了。
使用 Flux(InfluxDB 的查询和数据脚本语言)的优势在于,它包含许多用于处理和操作时间序列数据的功能和特性,包括但不限于:
- 用于统计 时间序列分析 的转换函数
- 用于相关性、协方差、标准差、分位数、离差等的函数
- 用于动态统计和基本时间序列分析的转换函数
- 用于导数、移动平均值、时间加权平均值等的函数
- 用于金融分析的技术动量指标
- Chande 动量震荡器、考夫曼移动平均线等
- 用于数学应用的数学包
- 用于地理时空数据的地理包
Flux 的缺点是,虽然它具有 map() 函数,可让您迭代查询结果中的行,但它不提供对循环的支持。这使得在 Flux 中编写复杂的预测或异常检测算法成为不可能。但是,Flux 已被用于编写一些基本的异常检测算法,包括中位数绝对偏差和朴素贝叶斯。中位数绝对偏差 算法用于查找偏离一组相似时间序列的时间序列。朴素贝叶斯 是一种概率分类器,用于确定输入是否属于某个类。
Flux 还包含 holtWinters() 函数,该函数将双指数或三指数平滑应用于时间序列数据。双指数和三指数平滑是一种统计时间序列预测类型,它使用指数加权平均值中的数据、趋势和季节性来进行预测。
结论
希望这篇博文能够启发您利用上述任何工具来解决时间序列数据科学问题。我鼓励您查看以下仓库,其中包含有关如何使用许多 Python 库和 InfluxDB 进行预测和执行异常检测的示例。