哈希到JSON然后加入Ruby中的另一个JSON

时间:2012-10-30 07:19:41

标签: ruby json

我有一个像这样的JSON:

[
  {
    "Low": 8.63,
    "Volume": 14211900,
    "Date": "2012-10-26",
    "High": 8.79,
    "Close": 8.65,
    "Adj Close": 8.65,
    "Open": 8.7
  },
  {
    "Low": 8.65,
    "Volume": 12167500,
    "Date": "2012-10-25",
    "High": 8.81,
    "Close": 8.73,
    "Adj Close": 8.73,
    "Open": 8.76
  },
  {
    "Low": 8.68,
    "Volume": 20239700,
    "Date": "2012-10-24",
    "High": 8.92,
    "Close": 8.7,
    "Adj Close": 8.7,
    "Open": 8.85
  }
]

并计算了收盘价每天的简单移动平均线,并将其称为变量sma9day。我想用原始的JSON加入移动平均值,所以我每天都得到这样的东西:

  {
   "Low": 8.68,
   "Volume": 20239700,
   "Date": "2012-10-24",
   "High": 8.92,
   "Close": 8.7,
   "Adj Close": 8.7,
   "Open": 8.85,
   "SMA9": 8.92
  }

使用sma9day变量我做了这个:

h = { "SMA9" => sma9day }
sma9json = h.to_json
puts sma9json

输出:

{"SMA9":[8.92,8.93,8.93]}

如何将其与JSON兼容并加入两者?我需要从上到下“匹配/加入”,因为JSON中的最后8个记录不会有9天移动平均值(在这些情况下我仍然喜欢那里的关键(SMA9),但是价值为零或零。

谢谢。

最新更新:

我现在有了这个,它让我非常接近,但它返回JSON中SMA9字段中的整个字符串......

require json
require simple_statistics

json = File.read("test.json")
quotes = JSON.parse(json)

# Calculations
def sma9day(quotes, i)
close = quotes.collect {|quote| quote['Close']}
sma9day = close.each_cons(9).collect {|close| close.mean}
end

quotes = quotes.each_with_index do |day, i|
  day['SMA9'] = sma9day(quotes, i)
end

p quotes[0]

 => {"Low"=>8.63, "Volume"=>14211900, "Date"=>"2012-10-26", "High"=>8.79, "Close"=>8.65, "Adj Close"=>8.65, "Open"=>8.7, "SMA9"=>[8.922222222222222, 8.93888888888889, 8.934444444444445, 8.94222222222222, 8.934444444444445, 8.937777777777777, 8.95, 8.936666666666667, 8.924444444444443, 8.906666666666666, 8.912222222222221, 8.936666666666666, 8.946666666666665, 8.977777777777778, 8.95111111111111, 8.92, 8.916666666666666]}

当我在计算结束前尝试执行sma9day.round(2)时,它会给出一个方法错误(大概是因为数组?),当我做了sma9day [0] .round(2)时,它确实正确,但每个记录当然都有相同的SMA。

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:0)

据说要在ruby中进行计算,你以某种方式解析了json,并得到了一个红宝石哈希。

为了做到这一点,你有一个sma9day值数组和一个对象数组,你想要迭代它们。

要做到这一点,这样的事情应该让你开始:

hashes = JSON.parse( json )
sma9day_values = [9.83, 9.82, etc... ]

hashes.each_with_index do |hash, index|
  if index >= 9
    hash["SMA9"] = sma9day_values[index-9]
  else
    hash["SMA9"] = 0
  end
end

puts hashes.to_json

编辑:

你真的需要尝试一个开始的ruby教程。问题是你在数组上调用round(2)。不使用sma9day(quotes, i)函数中的变量i(提示)。也许尝试像sma9day[i].round(2)

这样的东西

同样,each_with_index的返回不是要分配的东西。不要这样做,只需在数组上调用each_with_index即可。即。

quotes = quotes.each_with_index do |day, i| #bad
quotes.each_with_index do |day, i| #good

答案 1 :(得分:0)

我接受了您的输入并在this gist中编译了一个解决方案。我希望它有所帮助。