我有一个在pysqlite中使用的SQLite表:
create table t
(
id integer primary key not null,
time datetime not null,
price decimal(5,2)
)
我该如何使用SQL语句从这些数据中计算出窗口大小为X秒的移动平均值?
>>> cur.execute("SELECT price FROM t WHERE datetime(time) > datetime('now','-720 seconds')").fetchall()
>>> 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日期时间参考可以在这里找到。
移动平均线是指在时间i时,窗口大小为x
的平均值:
(x[i] + x[i+1] + ... + x[i+x-1]) / x
为了计算它,您需要创建一个大小为x
的LIFO堆栈(可以将其实现为队列
),并计算其总和。然后,您可以通过添加新值并从旧总和中减去旧值来更新总和;您可以从数据库获取新值,并通过弹出堆栈的第一个元素来获取旧值。
这样讲清楚了吗?