ArcticDB
2024年8月19日
任何使用时间序列数据构建模型的人都知道,数据准备是整个过程中非常重要的一部分。
数据准备中常用的一种方法是重采样。实践中,这通常是将高频数据降采样到模型中使用的较低(通常是规则)频率。
为了满足用户社区的需求,我们在 ArcticDB 中实现了一个重采样功能,该功能允许在读取数据时进行高性能的降采样。我们通过现代 C++ 实现来实现这一高性能,该实现可以多线程运行,利用所有核心。
下面我们将通过几个示例来向您展示它的功能以及如何使用它。
在 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
(字符串)数据。数据的一小部分看起来像这样(包含此数据创建代码的完整代码在笔记本中,链接位于本文末尾)
将数据(位于数据框中)写入库中的一个 symbol
mkt_data
,写入库中的一个 symbolsym = 'market_data'
lib.write(sym, mkt_data)
降采样到 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
看起来像这样ArcticDB 的重采样比读取完整数据集并在 Pandas 中进行重采样快 4 倍以上。在本文末尾链接的笔记本中,使用一台配备 14 核的戴尔 XPS 15 笔记本电脑进行测试,ArcticDB 耗时 171 毫秒,而 Pandas 耗时 750 毫秒。
降采样到 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
输出的前几行和后几行看起来像这样
降采样到 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
输出看起来像这样
降采样到 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
输出的前几行看起来像这样
在使用 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/ 与我们联系。