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
这表明现在的总和是==4095avg=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
这表明现在的总和是==4095avg=sum/contents.length}>45
,因此我们的平均值是45。但我的程序的全部要点是不要手动计算所有的温度。我有数百个数据点,我没有手动将这些数字相加-我只创建了contents
变量来向您展示如何在代码中实现这一点,并且上面的方法是有效的。当然,如果你的temp[1].\u f
的结果是一个零或0值,那么总和将永远不会增加。我应该把这个方法放在我的程序中的什么地方?你在循环中有temp[1]
,但它没有在任何地方定义。它应该是x[1]
?我这样做了,但仍然说0更新了答案,它会将循环中的值打印到控制台,这样您就可以看到发生了什么。循环中有temp[1]
,但它没有在任何地方定义。如果是x[1]
?我这样做了,但仍然显示0更新了答案,它会将循环中的值打印到控制台,这样您就可以看到发生了什么。