2012-10-30 64 views
2

与另一JSON加盟我有这样一个JSON:哈希JSON然后在Ruby中

[ 
    { 
    "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 
    } 
] 

而且已经计算出一个简单的移动平均收盘价中的每一天,并把它称为一个变量​​。我想与原来的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),但具有零或零值

谢谢

最新升级。

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

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。

任何帮助表示赞赏。谢谢

+0

Thats javascript ... – AJcodez

回答

0

大概是做红宝石计算,你以某种方式解析了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 

编辑:

你真的需要尝试开始红宝石教程。问题是你正在一个数组上调用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 
+0

嗨AJ,我以为我评论过这个,抱歉没有及时回复。我昨天玩过你的代码,但无法让它为我工作。然后托马斯贴出来,我一直在试图弄明白。感谢您的帮助(再次)! – gcubed

+1

嗨AJ - 抱歉迟到的答复 - 正如你所建议的,我做了一些(更多)红宝石教程,我很高兴地说,一切正常!我一直在四舍五入方面遇到问题,然后意识到这是因为json结尾处的零值(尝试四舍五入)。所以我添加了一个if语句,只在该值不为零时才轮回。再次感谢所有的帮助! – gcubed

0

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

+0

非常感谢托马斯。我遇到了一个小问题,因为我计算出的平均数有点不同,你会介意看看上面的更新#2并让我知道你的想法吗?再次感谢你的帮助。 PS:我注意到你做了一个sma9.round(3)得到一个有三个整数的数字?有没有办法强制两位小数(如果我不知道有多少数字会在小数前面,但想确保有两位小数?)。 – gcubed

+0

以下是simple_statistics gem的功能:[源代码](https://github.com/craigmdavidson/Simple-Statistics/blob/master/lib/simple_statistics.rb)。有许多其他方法可以计算出相同结果的未加权平均值,其中一个显示在要点中。 –

+0

试着了解它是如何工作的。 –