使用 ArcticDB 快速重采样时间序列数据

ArcticDB

2024年8月19日

1*sTMg5PIKosq6e9Tr5hclRw

引言

任何使用时间序列数据构建模型的人都知道,数据准备是整个过程中非常重要的一部分。

数据准备中常用的一种方法是重采样。实践中,这通常是将高频数据降采样到模型中使用的较低(通常是规则)频率。

为了满足用户社区的需求,我们在 ArcticDB 中实现了一个重采样功能,该功能允许在读取数据时进行高性能的降采样。我们通过现代 C++ 实现来实现这一高性能,该实现可以多线程运行,利用所有核心。

下面我们将通过几个示例来向您展示它的功能以及如何使用它。

设置 ArcticDB

ArcticDB 中设置数据库非常简单。只需要几行 Python 代码,如下所示。

import arcticdb as adb
arctic = adb.Arctic("lmdb://arcticdb_resample")
lib = arctic.get_library('resample', create_if_missing=True)

创建一些数据

我们将使用一个包含 12,000,000 行 1 秒时间序列数据的合成数据集,该数据集包含 3 列数据,分别是

id
(整数),一个
price
(浮点数)和一个
category
(字符串)数据。数据的一小部分看起来像这样

1*m vZwPV6QO N0E-IYOc5BQ

(包含此数据创建代码的完整代码在笔记本中,链接位于本文末尾)

将数据(位于数据框中)写入库中的一个 symbol

mkt_data
,写入库中的一个 symbol

sym = 'market_data'
lib.write(sym, mkt_data)

示例 1:简单的重采样

  • 降采样到 1 分钟频率

  • 使用不同的聚合器

  • 重采样可以被视为基于时间的 groupby 操作

  • 组是时间间隔内的所有行

# frequency and aggregator params
freq1 = '1min'
aggs1 = {'id': 'max', 'price': 'last', 'category': 'count'}
# create the resample query and apply it on the read
q1 = adb.QueryBuilder().resample(freq1).agg(aggs1)
market_data_1min_df = lib.read(sym, query_builder=q1).data

最后 5 行

market_data_1min_df
看起来像这样

1*ydSwwQadPLagOBLX6Mbdvw

ArcticDB 的重采样比读取完整数据集并在 Pandas 中进行重采样快 4 倍以上。在本文末尾链接的笔记本中,使用一台配备 14 核的戴尔 XPS 15 笔记本电脑进行测试,ArcticDB 耗时 171 毫秒,而 Pandas 耗时 750 毫秒。

示例 2:每列使用多个聚合器

  • 降采样到 5 分钟频率

  • 同时应用

    max 
    last 
    聚合器到
    value2 
    列。

  • 对于多个聚合器,语法是

    output_column_name: (input_column_name, aggregator)

q2 = adb.QueryBuilder()
q2 = q2.resample('5min').agg({
    'id': 'max',
    'price_last': ('price' ,'last'),
    'price_count': ('price' ,'count'),
    'category': 'first'
})
lib.read(sym, query_builder=q2).data

输出的前几行和后几行看起来像这样

1*t8L0ILQBajGXJJ53J2W0Tg

示例 3:使用处理管道链接操作

  • 降采样到 2 分 30 秒频率

  • 按字符串列对重采样数据进行分组

    category

  • 聚合

    category 
    组使用
    mean

q3 = adb.QueryBuilder()
q3 = q3.resample('2min30s').
    agg({'id': 'min', 'category': 'first'}).
    groupby('category').agg({'id': 'mean'})
lib.read(sym, query_builder=q3).data

输出看起来像这样

1*I 6YtM49qx5qIURH-0jvWQ

示例 4:OHLC(开盘价、最高价、最低价、收盘价)柱

  • 降采样到 5 分钟频率

  • value2 
    列使用多个聚合器

  • 这是一个如何将逐笔数据转换为 OHLC 柱数据的简单示例

freq_ohlc = '5min'
agg_ohlc = {
    'open': ('price', 'first'),
    'high': ('price', 'max'),
    'low': ('price', 'min'),
    'close': ('price', 'last')
}
q_ohlc = adb.QueryBuilder().resample(freq_ohlc).agg(agg_ohlc)
ohlc_bars = lib.read(sym, query_builder=q_ohlc).data

输出的前几行看起来像这样

1*A7OWx10QxsYzXbVU0q5xBQ

在使用 5 亿行数据运行相同代码时,在上述相同的硬件设置下,生成这些柱耗时 2.6 秒。Pandas 在数据已加载到内存的情况下进行相同计算耗时 44 秒。如果您的机器内存足够,可以尝试一下(在免费的 Google Colab 环境中可能无法运行)。

结论

  • 我们展示了新的 ArcticDB 重采样功能的强大之处,特别是

  • 它非常易于使用,特别是如果您已经了解 Pandas

  • 它性能出色,在我们的简单示例中,比读取数据并在 Pandas 中重采样提高了 4 倍速度

  • 它可以与其他 ArcticDB 查询功能结合使用,创建处理管道

  • 它可以用于生成时间序列柱数据

此外,我们计划将来添加更多重采样和查询功能,并进一步提高性能。

后续步骤

希望您喜欢这篇文章。如果您想亲自尝试,这里有一些后续步骤。

这些示例的完整笔记本可在我们的文档网站上找到:https://docs.arcticdb.cn/latest/notebooks/ArcticDB_demo_resample/,并且可以在 Google Colab 上一键运行,无需额外设置。

ArcticDB Querybuilder 的文档,包括重采样,位于:https://docs.arcticdb.cn/latest/api/query_builder/

如果您想了解更多信息,请通过我们的网站 https://arcticdb.cn/ 与我们联系。