gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:55 24 4
gpt4 key购买 nike

假设我有一个包含时间/值对数组的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com