2016-09-05 17 views
0

私は、パーソナルファイナンスマネジメントのためのシステムを構築しようとしています。これでRubyを学びたいと思っています。ハッシュ内部のデータを使って作業する

私は株式を作成しました<資産。 資産に関するすべての情報(現在のスポット価格など)があります。 私は、資産をbuy_price、数量、日付などで残高に追加することができる私のプロフィールを持っています。

私はshow_assets_by_codeを使いたいと思います。私のAssestを通過し、コードでこれを分類し、Quantityを合計して、average_priceをコストに含めます。そして、これを返す:[資産、average_price_with_cost、total_quantity]

今私は資産グループにできる午前:

{"RNGO11"=> 
    [{:quantity=>10, 
    :buying_price=>75.0, 
    :cost=>16.91, 
    :date=>2016-09-05 18:06:06 -0300, 
    :code=>"RNGO11", 
    :asset_id=>18563448}, 
    {:quantity=>100, 
    :buying_price=>75, 
    :cost=>16.91, 
    :date=>"16/4/2015", 
    :code=>"RNGO11", 
    :asset_id=>18563448}, 
    {:quantity=>100, 
    :buying_price=>77, 
    :cost=>16.91, 
    :date=>"16/4/2016", 
    :code=>"RNGO11", 
    :asset_id=>18563448}], 
"BRCR11"=> 
    [{:quantity=>100, 
    :buying_price=>75, 
    :cost=>16.91, 
    :date=>2016-09-05 18:06:06 -0300, 
    :code=>"BRCR11", 
    :asset_id=>18563316}]} 

どのように情報を取得し、グループごとにハッシュ内のデータを扱うことができます?

私は出力をしたい:

[RNGO11, quantity: 210, average_price: 76.19] 
[BRCR11, quantity: 100, average_price: 75.17] 

任意のヒント?

答えて

1
data.map do |key, values| 
    quantity = values.map { |entry| entry[:quantity] }.reduce(:+) 
    average_price = values.map { |entry| entry[:buying_price] + entry[:cost] }.reduce(:+).to_f/values.size 
    { code: key, quantity: quantity, average_price: average_price } 
end 

これはあなたのため 編集機能するかどうか、私に教えてください:考慮にコストを追加パヴェル・ドゥダに

+0

ほとんどあり!! average_priceでなければなりませんによるとこれを実行することはできませんどのように –

+0

'assets_by_group = balance.assets.group_by {|資産|資産[:コード]}!? \t \t \t assets_by_group.map行う|資産、値| \t \t \t量= values.map { |エントリ|エントリ[:数量]} .reduce(:+) \t \t \t total_spent = values.map {|エントリ|エントリ[:buyi to_f} .reduce(:+)to_f \t \t \t average_price = total_spent/quantity' しかし、私が売るとうまくいきません。 ..数学は変わるでしょう...しかし、助けてくれてありがとう!! –

0

おかげで、私はそれが右です!

transactions = balance.assets 
    assets_by_group = transactions.group_by{|asset| asset[:code]} 
    assets_by_group.map do |asset, transactions| 
    sum_quantity = 0 
    asset_average_price = 0 
      transactions.each do |transaction| 
       quantity = transaction[:quantity] 
    ## :average_price = price + (cost/(quantity).abs) for each transaction. 
       average_price = transaction[:average_price] 
       asset_average_price = (average_price * quantity + asset_average_price * sum_quantity)/(sum_quantity + quantity) if quantity > 0 
    ## Sells (quantity < 0) do not change asset_average_price. 
       sum_quantity += quantity 
      end 
    { code: asset, quantity: sum_quantity, average_price: asset_average_price} 
    end 

誰でもこのコードを改善したい場合は、私は喜ぶでしょう! 私は改善の匂いがしますが、それを見つけられません。乾燥していないように見えます...可読ではありません。 しかし、ねえ、それは資産を売買するために働いています。 。各資産のために:: 合計((buying_price *数量)+コスト)/ total_quantity 私は(私は所得の連邦税(ブラジル)のために宣言する必要がありますどのような

+0

あなたは解決策を見つけて良かったです(これで答えの1つをマークし、その質問は「回答済み」と見なされます)。しかし、コードレビューのために他の場所を使用してください(https://codereview.stackexchange.com/?)そして、あなたのような問題は、 'minitest'のようなテストフレームワークに恋しがるための招待です。 – Felix

+0

@Felix私はPawel Dudaの答えに印をつけたと思いますか? (それは緑色のチェックですか?) 私はこのcodereview場所をチェックします;) あなたがminitestで何を意味するか分かりません... –