我在使用 pysqlite 的 sqlite 中有一个表:
create table t
(
id integer primary key not null,
time datetime not null,
price decimal(5,2)
)
我如何从这个数据中计算移动平均值,窗口X秒大,使用 sql 语句?
据我了解您的问题,您不想要最后 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 日期时间参考
x
窗口单位大的移动平均线由下式给出i
:
(x[i] + x[i+1] + ... + x[i+x-1]) / x
要计算它,您需要创建一个queue
大小为 LIFO 的堆栈(您可以将其实现为 a )x
,并计算其总和。然后,您可以通过添加新值并从旧总和中减去旧值来更新总和;您可以通过从堆栈中弹出第一个元素来从数据库中获取新元素和旧元素。
那有意义吗?