2

私はこのような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と互換性のある形式で2つを結合するにはどうすればよいですか?JSONの最後の8つのレコードには9日間の移動平均値がないため、上から下に「一致/参加」する必要があります(この場合、キーは引き続き存在します(SMA9)が、値としてnilまたはゼロを使用します。

ありがとうございました。

最新の更新:

私は今これを持っています、それは私を非常に近づけます、しかしそれは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があります。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

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)を呼び出していることです。関数内の変数isma9day(quotes, 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
于 2012-10-30T10:31:57.997 に答える
0

私はあなたの意見を取り入れて、この要点で解決策をまとめました。お役に立てば幸いです。

于 2012-10-30T11:07:36.860 に答える