计算每日延迟

时间:2016-06-07 00:29:22

标签: ruby

有没有更好的方法来计算红宝石中的滞后(值 - 前值)?这就是我提出的。如果滞后大于0,我返回1,如果小于,我返回-1

(我的代码不起作用。使用ruby 2.3.5)

def lagChange(arr,k=1)
  prev=nil
  ret=[]
  arr.each{|x|
    if(x.to_i>-9999)
      ret<<if(x-prev>0){1}else{-1}end
    else
      ret<<"NA"
    end
    prev=x.to_i
  }
  return ret
end

lagChange([1,2,3,5]) #NA 1 1 -1

2 个答案:

答案 0 :(得分:5)

if(x-prev>0){1}else{-1}end无效Ruby。

def lagChange(arr,k=1)
  prev = nil
  ret = []
  arr.each{|x|
    if prev == nil
      ret << "NA"
    elsif(x.to_i>-9999)
      ret << (x-prev > 0 ? 1 : -1)
    end
    prev=x.to_i
  }
  return ret
end

lagChange([1,2,3,1])
=> ["NA", 1, 1, -1]

较短的版本可能是

def lag_change(arr)
  arr.each_cons(2).map {|x,y| y-x > 0 ? 1 : -1}.unshift('NA')
end

> lag_change([1,2,3,1])
=> ["NA", 1, 1, -1]

答案 1 :(得分:4)

看起来太空船运营商可能派上用场了:

def lagChange(arr)
  arr.map.with_index do |x, idx|
    idx == 0 ? "NA" : x <=> arr[idx - 1]
  end
end

lagChange([1,2,2,1])
 => ["NA", 1, 0, -1] 

请注意,如果它们相等(无滞后),它也会返回0。