【问题标题】:Postgres resampling time series dataPostgres重新采样时间序列数据
【发布时间】:2018-08-19 18:09:10
【问题描述】:

我在 Postgres 中以 1 分钟为增量存储了 OHLCV 股票数据。

我正在尝试将数据重新采样为 5 分钟间隔。我已使用此answer 生成以下 SQL 查询。

这是生成的 SQL 查询:

SELECT 
avg('open') AS open, 
avg('high') AS high, 
avg('low') AS low, 
avg('close') AS close, 
avg('volume') AS volume, 
avg('open_interest') AS open_interest, 
to_timestamp(floor(EXTRACT(epoch FROM 'timestamp') / 300) * 300) AS interval_alias 
WHERE 'symbol'='IRFC-N8' GROUP BY interval_alias

我收到此错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) function avg(unknown) is not unique
LINE 1: SELECT avg('open') AS open, avg('high') AS high, avg('low') ...
               ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.

你能告诉我出了什么问题吗?

编辑 1:为更好地呈现而格式化的代码。

编辑 2:根据下面的答案,我需要在 avg 函数的参数周围使用双引号。我正在使用 sqlalchemy 生成表达式,它正在创建单引号字符串。这是生成平均查询的代码部分:

    cols = list()
    cols.append(func.avg(self.p.open).label(self.p.open))
    cols.append(func.avg(self.p.high).label(self.p.high))
    cols.append(func.avg(self.p.low).label(self.p.low))
    cols.append(func.avg(self.p.close).label(self.p.close))
    cols.append(func.avg(self.p.volume).label(self.p.volume))
    cols.append(func.avg(self.p.openinterest).label(self.p.openinterest))
    seconds = self._get_seconds()
    cols.append(func.to_timestamp(func.floor(func.extract("epoch", "timestamp") / seconds) * seconds).label("interval_alias"))

SqlAlchemy 应该知道更好地使用双引号,但它会生成单引号。

【问题讨论】:

  • Postgres 中的单引号用于字符串文字。未定义字符串的AVG。请改用双引号 (AVG("open"))。
  • 顺便说一句,使用 AVG() 获取 OHLCV 数据对我来说没有意义。我会使用MAX("high"), MIN("low"), ... first open of the 5-min, ... last close of the 5-min, SUM("volume")

标签: postgresql sqlalchemy time-series


【解决方案1】:

db<>fiddle

您的错误是在您的 AVG() 调用中使用了单引号 ' 而不是双引号 "。单引号标记文本,但您想为平均值命名列。因此,您需要双引号或者可以保留它们(两种变体都显示在 db fiddle 中)。

编辑(真正的问题): self.p.columnname 似乎只给出了列的名称,而不是列本身。在 SQLAlchemy 上,对特定列的引用是 table.c.columnname 用于引用特定列。请使用p 而不是c

注意: 如果您平均所有数据,您可能会丢失重要数据作为真正的最小值和最大值。您可能希望与MINMAX 等其他函数聚合。也许WITHIN GROUP 函数可以帮助你。

https://www.postgresql.org/docs/current/static/functions-aggregate.html

https://www.postgresql.org/docs/9.5/static/functions-aggregate.html#FUNCTIONS-ORDEREDSET-TABLE

【讨论】:

  • 感谢您的指点。我正在使用 sqlalchemy 生成这些表达式,并且我已经更新了问题以包含部分代码。它正在生成单引号表达式。
  • @conquester 似乎self.p.columnname 只给出了列的名称,而不是列本身。可以吗?在您的情况下,self.p 是什么?我并不是很喜欢 SQLAlchemy,但我扫描的每个网站(例如suhas.org/sqlalchemy-tutorial)都说table.c.columnname 引用了特定的列。也许您的问题是p 而不是c
  • 这可能是问题所在。 self.p 是一个引用参数的对象,参数是字符串文字,在这种情况下包含列名。
  • @conquester 太好了,如果这解决了它,请告诉我。如果可行,我想用这个更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2020-05-18
  • 1970-01-01
相关资源
最近更新 更多