私はpysqliteを使用してsqliteにテーブルを持っています:
create table t
(
id integer primary key not null,
time datetime not null,
price decimal(5,2)
)
このデータから、SQLステートメントを使用してウィンドウX秒の大きさで移動平均を計算するにはどうすればよいですか?
私があなたの質問を理解している限り、あなたは最後の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()
他の時間単位を使用することもでき、それらを連鎖させることもできます。たとえば、過去1時間半の平均価格を取得するには、次のようにします。
>>> 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
それを計算するには、 sizeの LIFO スタック ( として実装できる) を作成し、x
その合計を計算します。次に、新しい値を追加し、古い合計から古い値を減算して、合計を更新できます。データベースから新しいものを取得し、スタックから最初の要素をポップして古いものを取得します。
それは理にかなっていますか?