InfluxDB按时间分组和派生度量

时间:2017-09-11 17:55:40

标签: time-series influxdb

我使用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功能。

对于简单的时间聚合,涌入数据显示出比PostgreSQL和MySQL好得多的结果,响应速度快十倍。因此,用它完成同样的工作将是非常好的。

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

1 个答案:

答案 0 :(得分:0)

可悲的是,你不能。 InfluxDB只按标记分组,而不是按字段或函数分组。

您有两种选择:

  • 创建与存储桶一样多的连续查询,并对WHERE子句进行过滤:microchip
  • 使用特定存储桶注入您的数据,作为标记:WHERE offset / 480 / n BETWEEN x AND y

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