ruby - 如何在 Ruby 的时间序列中规范化和插入缺失值?

标签 ruby arrays time-series

假设我有一个包含时间/值对数组的 Ruby 数组,例如:

[
  # about 9:00 AM on consecutive days
  [<DateTime: 2014-05-15T09:00:00Z>, 56],
  [<DateTime: 2014-05-16T09:06:00Z>, 57],
    # ... missing data for May 17th, 2014
    # ... missing data for May 18th, 2014
  [<DateTime: 2014-05-19T08:57:00Z>, 61],
  # ...
]

请注意 (1) 并非每天在同一时间收集值,并且 (2) 某些值缺失。

我想通过以下方式规范化数据:

  1. 重新采样,使它们在时间上等间隔
  2. 插入任何缺失值。

以编程方式执行此操作的正确方法是什么?

更新1

How do you want to interpolate? In your example [58, 59], [58, 60] and [59, 60] would be equally plausible.

预期值将取决于所使用的插值策略(例如,线性插值、二次插值等),因此我无法提供确切的答案。

我愿意接受任何以最小误差(例如 < 0.1%)预测原始实际数据点的插值策略。我愿意接受任何导致时间序列观察间隔相等的规范化策略。

最佳答案

您可以使用样条插值法。这是一个使用 Spliner gem 的示例:

require 'date'
require 'spliner'

arr = [
  [DateTime.new(2014,5,15,9), 56],
  [DateTime.new(2014,5,16,9,6), 57],
  [DateTime.new(2014,5,19,8,57), 61]
]

spline = Spliner::Spliner.new(arr.to_h, extrapolate: '10%')

(DateTime.new(2014,5,15,9)..DateTime.new(2014,5,19,9)).each do |date|
  puts "#{date}: #{spline[date]}"
end

输出:

2014-05-15T09:00:00+00:00: 56.0                 # exact value
2014-05-16T09:00:00+00:00: 56.995496729398646   # interpolated value
2014-05-17T09:00:00+00:00: 58.18937752978536    # interpolated value
2014-05-18T09:00:00+00:00: 59.55365781173006    # interpolated value
2014-05-19T09:00:00+00:00: 61.0030489943531     # extrapolated value

关于ruby - 如何在 Ruby 的时间序列中规范化和插入缺失值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23761777/

相关文章:

ios - 如何在 CocoaPod PodSpec 中创建 Ruby 字符串?

C - 字符数组似乎可以复制,但仅限于循环范围内

python - 通过宽数据格式的多列循环python auto_arima

ruby - Clojure 与 Node.js RAM 消耗

mysql - Rails 中的嵌套 SQL 查询

javascript - Socket.io 发送数组时出错

r - xts 按周拆分函数将一周的第一天指定为星期日而不是默认的星期一

在C中压缩一系列接近的数字

ruby - Ruby 中的 AES-256-GCM 加密和 Golang 解密

C 数组的数组 : why do I need to cast TO const here?