SQLite - 计算移动平均线

时间:2012-04-17 09:52:42

标签: python sql sqlite pysqlite moving-average

我使用pysqlite在sqlite中有一个表:

create table t
(
    id integer primary key not null,
    time datetime not null,
    price decimal(5,2)
)

如何使用sql语句从这个数据计算{strong> X 秒大的moving average

2 个答案:

答案 0 :(得分:3)

据我了解你的问题,你不希望平均超过最后N个项目,但是在过去的x秒内,我是否正确?

嗯,这会为您提供最近720秒记录的所有价格列表:

>>> cur.execute("SELECT price FROM t WHERE datetime(time) > datetime('now','-720 seconds')").fetchall()

当然,您可以将其提供给AVG-SQL-Function,以获得该窗口中的平均价格:

>>> cur.execute("SELECT AVG(price) FROM t WHERE datetime(time) > datetime('now','-720 seconds')").fetchall()

您还可以使用其他时间单位,甚至可以链接它们。 例如,要获得最后一个半小时的平均价格,请执行以下操作:

>>> cur.execute("SELECT AVG(price) FROM t WHERE datetime(time) > datetime('now','-30 minutes','-1 hour')").fetchall()

编辑:可以找到SQLite日期时间参考here

答案 1 :(得分:1)

窗口x单位较大的移动平均线由时间i给出:

(x[i] + x[i+1] + ... + x[i+x-1]) / x

要计算它,您想要制作一个大小为x的LIFO堆栈(可以实现为queue),并计算其总和。然后,您可以通过添加新值并从旧总和中减去旧值来更新总和;你可以从数据库中获取新的一个,然后从堆栈中弹出第一个元素。

这有意义吗?