読者です 読者をやめる 読者になる 読者になる

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]

隙間を良きに補間してくれます。 なにげに最大公約数とかで計算してくれるので嬉しいです。

隙間が謎すぎる時には時間がかかるので気をつけてください 循環参照が入ったら・・・知りません ><