Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何为温度数据集创建平均值?_Ruby On Rails_Ruby_Arrays_Ruby On Rails 3_Split - Fatal编程技术网

Ruby on rails 如何为温度数据集创建平均值?

Ruby on rails 如何为温度数据集创建平均值?,ruby-on-rails,ruby,arrays,ruby-on-rails-3,split,Ruby On Rails,Ruby,Arrays,Ruby On Rails 3,Split,我正在写一个程序,它取一组数据,然后求平均值。该数据集是拉瓜迪亚机场每月的平均温度,与温度相对应 以下是一个示例,其中包括一个数据点: 2009-07,23.6 这是一年一个月,临时工 我有163个数据点。所有的数据点都在一个.txt文件中,每一个都在一个新行上 我将数据做成一个数组,并将其拆分。出于某种原因,我的程序说我每次尝试运行它的平均值是0 这是我的密码: data = File.open("avg_temp.txt", "r+") contents = data.read

我正在写一个程序,它取一组数据,然后求平均值。该数据集是拉瓜迪亚机场每月的平均温度,与温度相对应

以下是一个示例,其中包括一个数据点:

    2009-07,23.6
这是一年一个月,临时工

我有163个数据点。所有的数据点都在一个.txt文件中,每一个都在一个新行上

我将数据做成一个数组,并将其拆分。出于某种原因,我的程序说我每次尝试运行它的平均值是0

这是我的密码:

data = File.open("avg_temp.txt", "r+")

contents = data.read

contents = contents.split("\r\n")

contents.collect! do |x|
        x.split(',')
end


sum = 0

data.each do |x|

sum = sum  + x[1].to_f

end

avg = sum / contents.length

puts avg

分配
avg=sum/contents.length
在循环结束后的外部。在循环中定义的变量的作用域仅限于该循环。此外,您正在循环使用
数据
,应该是
内容

contents.each do |x|

    puts x[1] # to check if the right value is being evaluated
    sum = sum  + x[1].to_f     

end

avg = sum/contents.length

分配
avg=sum/contents.length
在循环结束后的外部。在循环中定义的变量的作用域仅限于该循环。此外,您正在循环使用
数据
,应该是
内容

contents.each do |x|

    puts x[1] # to check if the right value is being evaluated
    sum = sum  + x[1].to_f     

end

avg = sum/contents.length

您的
avg
不是顶级局部变量。因此,您无法从顶层访问它<代码>平均值仅适用于块。您可以执行以下操作:-

avg = 0

data.each do |x|
  sum = sum  + temp[1].to_f
  avg = sum / contents.length
end

puts avg

您的
avg
不是顶级局部变量。因此,您无法从顶层访问它<代码>平均值仅适用于块。您可以执行以下操作:-

avg = 0

data.each do |x|
  sum = sum  + temp[1].to_f
  avg = sum / contents.length
end

puts avg
avg
变量不再在范围内,因为它位于每个块之外。要打印平均值,只需像这样将其移动到块内部

sum = 0
data.each do |x|
    sum = sum  + temp[1].to_f
    avg = sum / contents.length
    puts avg
end
或者将avg变量移到循环外部(在循环退出后执行一次操作)

更多信息请访问

avg
变量不再在范围内,因为它位于每个块之外。要打印平均值,只需像这样将其移动到块内部

sum = 0
data.each do |x|
    sum = sum  + temp[1].to_f
    avg = sum / contents.length
    puts avg
end
或者将avg变量移到循环外部(在循环退出后执行一次操作)


更多信息请访问

我想写得更简单一些:

lines = 0
sum = 0

File.foreach("avg_temp.txt") do |data|
  sum += data.split(',').last.to_f
  lines = $.
end

puts 'Average: %f over %d datapoints' % [sum / lines.to_i, lines]
# >> Average: 23.375000 over 4 datapoints
哪些产出:

Average: 23.375000 over 4 datapoints
以“avg_temp.txt”开头,如下所示:

2009-07,23.6
2009-08,23.7
2009-09,23.6
2009-10,22.6
要“挥霍”它:

  • $。
    是当前行号。每次通过循环,它都会将上次读取的行号重新分配给
    ,这样我们就知道要除以多少
  • foreach
    逐行读取,因此无需拆分文件。这也解释了为什么我使用
    $。
    来跟踪元素的数量。这也意味着它可以毫无问题地读取一个包含数百万或数十亿个值的文件,而
    read
    则会陷入困境

    • 我要写得更简单一些:

      lines = 0
      sum = 0
      
      File.foreach("avg_temp.txt") do |data|
        sum += data.split(',').last.to_f
        lines = $.
      end
      
      puts 'Average: %f over %d datapoints' % [sum / lines.to_i, lines]
      # >> Average: 23.375000 over 4 datapoints
      
      哪些产出:

      Average: 23.375000 over 4 datapoints
      
      以“avg_temp.txt”开头,如下所示:

      2009-07,23.6
      2009-08,23.7
      2009-09,23.6
      2009-10,22.6
      
      要“挥霍”它:

      • $。
        是当前行号。每次通过循环,它都会将上次读取的行号重新分配给
        ,这样我们就知道要除以多少
      • foreach
        逐行读取,因此无需拆分文件。这也解释了为什么我使用
        $。
        来跟踪元素的数量。这也意味着它可以毫无问题地读取一个包含数百万或数十亿个值的文件,而
        read
        则会陷入困境


      这将重新计算
      平均值
      ,作为一种未使用的“运行平均值”,在循环内部没有实际用途。对于OP,它只需要在求和完成时进行计算。@NeilSlater你说得对!我只是想显示一下他可以做什么来消除错误。我将avg=sum/contents.length切换到循环之外。它修复了错误,但现在它说我的平均值是0。??这会重新计算
      avg
      ,作为一种未使用的“运行平均值”,在循环中没有实际用途。对于OP,它只需要在求和完成时进行计算。@NeilSlater你说得对!我只是想显示一下他可以做什么来消除错误。我将avg=sum/contents.length切换到循环之外。它修复了错误,但现在它表示我的平均值为0。进行了更改,但表示我的平均值为0。不确定变量
      temp
      的定义位置,但请参见此示例:
      contents=(1..90);总和=0
      contents.each{x|sum+=x}}>4095
      这表明现在的总和是==4095
      avg=sum/contents.length}>45
      ,因此我们的平均值是45。但我的程序的全部要点是不要手动计算所有的温度。我有数百个数据点,我没有手动将这些数字相加-我只创建了
      contents
      变量来向您展示如何在代码中实现这一点,并且上面的方法是有效的。当然,如果您的
      temp[1].to\f
      结果为零或0,那么总和将永远不会增加。我将该方法放在我的程序中的何处?进行了更改,但表示我的平均值为0不确定变量
      temp
      的定义位置,但请参见此示例:
      contents=(1..90)。to\u a;总和=0
      contents.each{x|sum+=x}}>4095
      这表明现在的总和是==4095
      avg=sum/contents.length}>45
      ,因此我们的平均值是45。但我的程序的全部要点是不要手动计算所有的温度。我有数百个数据点,我没有手动将这些数字相加-我只创建了
      contents
      变量来向您展示如何在代码中实现这一点,并且上面的方法是有效的。当然,如果你的
      temp[1].\u f
      的结果是一个零或0值,那么总和将永远不会增加。我应该把这个方法放在我的程序中的什么地方?你在循环中有
      temp[1]
      ,但它没有在任何地方定义。它应该是
      x[1]
      ?我这样做了,但仍然说0更新了答案,它会将循环中的值打印到控制台,这样您就可以看到发生了什么。循环中有
      temp[1]
      ,但它没有在任何地方定义。如果是
      x[1]
      ?我这样做了,但仍然显示0更新了答案,它会将循环中的值打印到控制台,这样您就可以看到发生了什么。