2012-11-19 36 views
0

我有一个有很多记录的JSON,对于这个问题,我们假设100.有两个键,Change和Sign。更改类似0.14,Sign是两个符号“+”或“ - ”中的一个。计算Ruby中值的相对强度

对于每一条记录,我想添加两个“20记录总数”和“20记录总数”键。如果这些值分别等于标志为“+”和“ - ”的最后20条记录的总和。

所以,对于 “20记录了总” 是这样的:

array.collect {|array| array['change']} 
array.collect {|array| array['sign']} 
if sign = "+" then 
#store change in uparray 
#when uparray has 20 records add it up and create variable 20recorduptotal 

任何帮助表示赞赏。非常感谢

我相信我需要使用.each_cons(20),但只有使用适用符号的记录。

+2

'变化是一个整数(0.14)' - 这不可能是真的。 – sawa

+0

我不确定我是否正确描述了它。在JSON中,更改将是一个0.14的数字,Sign可以是正数或负数。对困惑感到抱歉。谢谢 – gcubed

+0

列表开头的40个或更多记录会发生什么情况,哪些记录没有20个以前的上/下记录? –

回答

0

更新:这里的东西,可能实际工作:)

我定义计算添加到它的最后20个项目的总和“总结队列”。其sum返回nil,如果它少于20个项目。

class SummingQueue 
    def initialize(length = 20) 
    @values = [] 
    @sum = 0 
    @length = length 
    end 

    def <<(value) 
    @values << value 
    @sum += value 
    @sum -= @values.shift if @values.length > @length 
    end 

    def sum 
    return nil if @values.length < @length 
    @sum 
    end 
end 

queues = Hash.new {|hash, key| hash[key] = SummingQueue.new } 

array.each do |item| 
    queues[item["sign"]] << item["change"] 
    item["last_20_ups"] = queues["+"].sum 
    item["last_20_downs"] = queues["-"].sum 
end 

注意,last_20_ups将包括当前值(如适用) - 如果你希望它是最后20个值包括当前,然后将queues[...] << item[...]线到each结束块。

+0

当你评论时,我仍然在看它。 – gcubed

+0

试试这个新版本! –

+0

再次感谢@Andy H.我将不得不盯着这一段时间,但现在,我一直在'code'@'code'NilClass不能强制进入Fixnum'code' sum + = value'code'。之前我说过我认为它会返回零,所以也许这是我的错。但是真的,我希望它返回“0”,如果没有足够的记录来计算总涨跌数,那么我最终会回写JSON。 (以及在其相关情况下,这是我在每条记录上重复变量的方式:'code'list.each_with_index do | day,i | day ['ups'] = last_20_ups(list,i) end 'code' – gcubed