2012-10-30 4 views
2

다른 JSON과 합류. 나는 원래 JSON과 이동 평균 값에 가입하고 싶습니다, 그래서 나는 매일 같은 것을 얻을 :해시 나는이 같은 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 
    } 

이 한 i를 sma9day 변수 :

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

을이 출력 :

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

어떻게 JSON과 호환되는 형식으로 넣고 두 가지를 결합합니까? JSON의 마지막 8 개 레코드는 9 일 이동 평균 값을 갖지 않으므로 위에서 아래로부터 "일치/결합"해야합니다 (이 경우에는 여전히 키가 있어야합니다 (SMA9)). 값으로 전무 제로가

감사합니다

UPDATE 최신 :..

내가 지금 이것을 가지고, 나를 매우 가까이 가져, 그러나 그것은 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를가집니다.

도움을 주시면 감사하겠습니다. 감사합니다

+0

그 밖의 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이 끝날 때 무한 값으로 인해서 깨달았다. 그래서 값이 nil이 아닌 경우 if 문만 반올림합니다. 모든 도움에 다시 한 번 감사드립니다! – gcubed

0

저는 귀하의 의견을 받아서 this gist의 솔루션을 컴파일했습니다. 나는 그것이 도움이되기를 바랍니다.

+0

토마스에게 고마워. 내 평균을 조금 다르게 계산했기 때문에 약간의 문제가있었습니다. 위의 업데이트 # 2를보고 나에게 당신이 생각하는 것을 알려주시겠습니까? 도와 줘서 고마워. 추신 : 당신이 sma9.round (3) 정수를 사용하여 그림을 얻은 것을 알았습니까? 소수 자릿수 두 자리를 강요하는 방법이 있습니까 (소수 자릿수 앞에 얼마나 많은 자릿수가 있는지 모르지만 두 자릿수가 있는지 확인하고 싶습니까?). – gcubed

+0

다음은 simple_statistics gem의 기능입니다 : [소스 코드] (https://github.com/craigmdavidson/Simple-Statistics/blob/master/lib/simple_statistics.rb). 가중치가 적용되지 않은 평균을 동일한 요령으로 계산할 수있는 다른 많은 방법이 있습니다 (요점에 표시된 것). –

+0

작동 방식을 이해하십시오. –