interpolate.js作りました
npmで名前が被ったので「series.interpolate.js」にしました
背景・課題
時系列分析をずっと調べているのですが、時系列データで途中データが飛ぶケースがあります。 例えば、ガチャのデータ、Webサイトのアクセスログ、404の回数のログ、いくらでもあります。
なんですが、例えば、ARIMAとかExponential Smoothingなどにしても、基本的には時間的なステップが揃っていることが前提です。 具体的には
time:2013/01/29 11:00:00 count:332 time:2013/01/29 12:00:00 count:124 time:2013/01/29 13:00:00 count:62 time:2013/01/29 15:00:00 count:36 // <= ここで14時が飛んでる!!! time:2013/01/29 16:00:00 count:93
こういうデータが来ると計算上大変困るわけです。
数式上は飛んでたら困るんです!
補間
データが良くわかっていたとしても補間するのは結構面倒です。 一つ前のデータと比較して、想定しているステップ幅(例えば、3600秒)よりステップが開いていたら、埋める。 また、その際の値をデフォルトの値(例えば0)で埋めるのか、線形補間するのか、など、いろいろと手間です。
解決
とりあえず、手元のjsでinterpolate.jsを作りました。
- github
- 名前変更しました(2013/04/08)
これを使うと次のようなことができるようになります。
interpolate([0, 1, 2, 4, 5]) // => [[0, 1, 2, 3, 4, 5], 1] interpolate([0, 4, 16, 20]) // => [[0, 4, 8, 12, 16, 20], 4] interpolate([0, 4, 14, 20]) // => [[2, 4, 6, 8, 10, 12, 14, 16, 18, 20], 2] interpolate([{x: 0}, {x: 4}, {x: 16}, {x: 20}]) // => [[{x: 0}, {x: 4}, {x: 8}, {x: 12}, {x: 16}, {x: 20}], 4] interpolate([{time: 0}, {time: 4}, {time: 16}, {time: 20}], {index: 'time'}) // => [[{time: 0}, {time: 4}, {time: 8}, {time: 12}, {time: 16}, {time: 20}], 4] interpolate([{x: 0, v: 2}, {x: 4, v: 6}, {x: 16, v: 12}, {x: 20, v: 4}]) // => [[{x:0,v:2},{x:4,v:6},{x:8,v:8},{x:12,v:10},{x:16,v:12},{x:20,v:4}], 4] // fill default value interpolate([{x: 0, v: 2}, {x: 4, v: 6}, {x: 16, v: 12}, {x: 20, v: 4}], {defaults: {v: 0}}) // => [[{x:0,v:2},{x:4,v:6},{x:8,v:0},{x:12,v:0},{x:16,v:12},{x:20,v:4}],4]
隙間を良きに補間してくれます。 なにげに最大公約数とかで計算してくれるので嬉しいです。
隙間が謎すぎる時には時間がかかるので気をつけてください 循環参照が入ったら・・・知りません ><