2016-09-05 2 views
0

개인 재무 관리를위한 시스템을 구축하려고합니다. Ruby를 배우기를 바랍니다.해시 내부의 데이터 작업

나는 < 자산을 만들었습니다. 여기에는 자산과 관련된 모든 정보 (현재 현물 가격 등)가 있습니다. 그리고 나는 내 밸런스에 purchase_price, 수량, 날짜 등을 사용하여 자산을 추가 할 수있는 내 프로필이 있습니다.

이 방법을 실행할 때 시스템을 원한다면 여물통 가서 내 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] 

모든 힌트 :

나는 출력을 원하는? 내가 바로 가지고, 고려 추가 비용 파블 Duda 보낸에

답변

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 

이 당신이 편집을 위해 작동하는지 알려주세요!

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

거의 평균 _ 여야가 !! 이 작업을 수행 할 수없는 방법 –

+0

'assets_by_group = balance.assets.group_by {| 자산 | 자산 [: 코드]}!? \t \t \t assets_by_group.map가 할 | 자산 가치 | \t \t \t 수량 = values.map { | 엔트리 [: 수량]}. 감소 (: +) \t \t \t total_spent = values.map {| entry | entry [: buyi to_f} .reduce (: +). to_f \t \t \t average_price = total_spent/quantity' 그러나 내가 팔면 작동하지 않습니다. .. 수학은 변할거야.하지만 도움을 주셔서 감사합니다 !! –

0

감사 :

+0

해결책을 찾았 으면 좋을 것입니다. 이제 질문 하나가 "답변 됨"으로 표시됩니다. 그러나 코드 리뷰 (https://codereview.stackexchange.com/?)에 대한 다른 장소를 사용하십시오. 그리고 당신과 같은 문제는'minitest'와 같은 테스트 프레임 워크에 대한 사랑에 빠지게하는 초대입니다. – Felix

+0

@ Felix 나는 Pawel Duda의 답변에 점수를 매겼다 고 생각 하나? (녹색 체크일까요?) 이 codereview 장소를 확인합니다;) minitest의 의미가 확실하지 않은 경우 ... –