【问题标题】:InfluxDB grouping by time and derivate metricInfluxDB 按时间分组和派生指标
【发布时间】:2017-09-11 17:55:39
【问题描述】:

我正在使用 InfluxDB 对股票市场数据的时间序列进行测试,包括高、低、开盘和收盘价的分钟数。我的目标是汇总数据,以便将每一天分为 N 个批次(蜡烛),N 是一个整数,如果某些分钟被无法填充的批次忽略,也没有问题。

例如:

一个交易日显示从上午 9 点到下午 5 点的每一分钟(即 480 分钟)的市场数据。如果我想每天在 13 根蜡烛中聚合这些数据点,我有 13 根蜡烛,每根 36 分钟,最后 12 分钟被忽略。

由于我找不到一种简单的方法来提取日期组件,例如一年中的月份、一天中的分钟等,我创建了一个预处理度量,表示自市场开盘以来每分钟的偏移量,因此每个数据点看起来像:

date                 symbol  open  high  low  close  offset
2017-01-01 09:00:00  XPTO    1.0   1.3   0.9  1.1    0 
2017-01-01 09:01:00  XPTO    1.0   1.3   0.9  1.1    1
2017-01-01 09:02:00  XPTO    1.0   1.3   0.9  1.1    2 
...

在流行的关系数据库中,通过查询(下面的伪 SQL)在这些存储桶中进行聚合是微不足道的:

SELECT ...,FLOOR(offset / FLOOR(480 / n)) AS candle_id FROM prices WHERE symbol = 'XPTO' GROUP BY DAY(date), candle_id 

但我无法弄清楚如何在 InfluxDB 中执行此操作,因为没有功能性 FLOOR 函数。

对于简单的时间聚合,influxDB 的结果比 PostgreSQL 和 MySQL 好得多,响应速度快了十倍。所以用它完成同样的工作会非常好。

BONUS:实际上市场开放时间取决于学期,所以它在 1 月至 6 月的上午 9 点和 7 月至 12 月的上午 10 点开放,因此桶大小会根据它而变化。

【问题讨论】:

    标签: time-series influxdb


    【解决方案1】:

    很遗憾,你不能。 InfluxDB 仅按标签分组,而不是按字段或函数分组。

    你有两个选择:

    • 创建尽可能多的连续查询,并根据 WHERE 子句进行过滤:WHERE offset / 480 / n BETWEEN x AND y
    • 使用特定存储桶注入您的数据,作为标签:bucket = 1

    但也许 Grafana 的热图插件会正确地表示您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多