使用InfluxDB解决时间序列数据科学问题的工具
作者:Anais Dotis-Georgiou / 用例,产品
2022年9月2日
导航至
本文最初发表在The New Stack上,并在此处获得许可转载。
如果您正在处理时间序列数据,您可能需要进行异常检测或预测。在进行时间序列工作之前的第一步是找到合适的数据存储。为了有效地检测或预测数据,您需要一个能够处理大量数据并以高摄入率处理数据的数据存储。因此,您可能希望考虑使用专为时间序列数据构建的数据库。时间序列数据库与更常见的数据库不同,因为它们不是使用行和列来快速查找数据点之间的关系,而是设计来处理时间序列数据的独特工作负载。
对于本文,我们将使用时间序列数据库InfluxDB,并讨论一些可以用于进行预测和异常检测的工具。我们还将讨论InfluxDB v2 Python客户端库的一些增强功能,这些功能使得从InfluxDB查询数据并将数据科学工具应用于您的时序数据变得更加容易。
时间序列数据科学问题的工具
虽然您可以使用InfluxDB解决一些时间序列数据科学问题,但您可以用它解决的问题范围有限。对于大多数用例,使用InfluxDB存储所有原始时间序列数据,然后使用InfluxDB的本地查询和脚本语言Flux来准备您的数据。
接下来,使用客户端库将数据拉取到另一个环境中。如果您正在解决时间序列数据科学问题,请考虑使用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 可以很好地处理具有特殊特征的和不规则的时间序列数据,而不需要数据准备工作。这是因为 Prophet 自动执行插值和去除异常值。
NeuralProphet 是另一个用于预测的 Python 库。它是 Prophet 的继任者。它旨在成为 Prophet 和深度学习之间的混合方法。NeuralProphet 的目标是使近未来的预测比 Prophet 更准确。换句话说,NeuralProphet 可以在稀疏或数据较少的情况下进行更准确的预测。NueralProphet 通过使用深度学习来识别和敏感地处理时间序列中的局部上下文来提高准确性。局部上下文指的是时间序列数据中季节性的子集或特定形状。识别局部上下文可以特别提高预测准确性,尤其是当这些形状具有周期性时。然而,值得注意的是,如果您有大量可靠且经过清洗的历史数据,那么 Prophet 可以以微小的优势超越 NeuralProphet。
ADTK(异常检测工具包)是一个用于时间序列数据基于规则的异常检测的开源 Python 包。ADTK 适用于工业物联网用例。在大多数工业物联网案例中,操作员对其系统应有的正常行为以及常见的异常或故障情况有一定的领域专业知识。
ADTK 允许用户通过组合不同的模块来构建异常检测模型。其中一种模块是 检测器。检测器找到异常点。它们包括查看分位数、阈值、水平移动、季节性等方法。ADTK 允许用户将这些函数串联起来,构建一个模型,例如,评估数据是否超过这个阈值,同时表现出一定振幅的水平移动,并违反季节模式。如果数据满足所有这些基于规则的准则,则存在异常。
有其他许多用于异常检测的开源包,但 ADTK 的简洁性令人耳目一新。此包非常适合识别遵循某些定义良好的统计属性或相反,在物联网数据中发现具有非常可预测或可控行为的异常。
Telegraf 是一款开源的指标和事件收集代理。它对数据库不敏感,但属于 InfluxDB 堆栈的一部分,因此您可以轻松收集时序数据并将其写入 InfluxDB。然而,它不仅仅是收集代理。您还可以使用 Telegraf 处理数据。《Telegraf Execd 处理器插件》使 Telegraf 能够在任何语言中进行扩展。这包括使用统计预测算法对小型数据批次进行连续预测。此 存储库 包含了一个示例,说明如何使用 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 客户端库。
在之前的一篇文章中,我们学习了如何使用 InfluxDB v2 Python 客户端库从 OpenWeatherMap API 获取天气数据并将其存储在 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 = "https://127.0.0.1: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进行一些基本的预测和异常检测,这可能是足够的。
使用InfluxDB的查询和数据脚本语言Flux的优势在于,它包含大量用于处理和操纵时间序列数据的功能和特性,包括但不限于
- 用于统计时间序列分析的转换函数
- 用于相关性、协方差、标准差、分位数、离散度等的函数
- 用于动态统计和基本时间序列分析的转换函数
- 用于导数、移动平均、时间加权平均等的函数
- 用于金融分析的技术动量指标
- Chande动量摆动器、Kaufman移动平均等
- 数学应用包
- 地理包,用于地理时间数据
Flux的缺点是,尽管它有一个map()函数,允许您遍历查询结果中的行,但它不提供对循环的支持。这使得在Flux中编写复杂的预测或异常检测算法变得不可能。然而,Flux已被用于编写一些基本的异常检测算法,包括中值绝对偏差和朴素贝叶斯。中值绝对偏差算法用于查找偏离类似时间序列组的时间序列。《中值绝对偏差》算法用于找到偏离类似时间序列组的时间序列。《朴素贝叶斯》是一种概率分类器,用于确定输入是否属于某个特定类别。
Flux还包含holtWinters()函数,该函数对时间序列数据应用双重或三重指数平滑。双重和三重指数平滑是一种使用指数加权的平均数据、趋势和季节性来预测的统计时间序列预测类型。
结论
我希望这篇博客文章能激发您利用上述任何工具解决时间序列数据科学问题。我鼓励您查看以下存储库,其中包含如何使用许多这些Python库和InfluxDB进行预测和异常检测的示例。