无法计算不包括 sqlite3 中的 .each 块中的当前观察值的平均值
unable to calculate a mean excluding current observation in a .each block in sqlite3
我有以下方法。我的代码在我的 .each
块中的 if statement
遇到错误:nil can't be coerced into Float (TypeError)
.
我已经尝试了许多变体,都在.each
块中遇到了障碍。
代码应计算 所有 项的平均值,按 Type
、 分组,不包括当前观察值 。例如,Type foo
下有 10 个不同值的 10 个项目。项目 1 有一个单元格计算 9 个项目的平均值 - 不包括 本身。请指教。我束手无策。
下面的代码是我IDE中存在的方法。 Ruby 2.3.7
specific_row[0]
应该属于 Id
和
specific_row[1]
应该属于 Amount
。
注意:我已经选择使用 .execute
而不是 .execute2
来避免 header 数据的行程。
def billavgx(info_hash)
begin
db = SQLite3::Database.open('billinfo.db')
db.results_as_hash = true
db.transaction
specific_amt = db.prepare "SELECT Amount AND Id FROM bills WHERE Type = :Type"
specific_amt.execute info_hash[:category]
specific_amt.each do |specific_row|
if @total_rows == 1
@avgx = (@total_amt - specific_row[1]) / @total_rows
elsif @total_rows > 1
@avgx = (@total_amt - specific_row[1]) / (@total_rows - 1)
else
return "insufficient entries"
end
db.execute2 "UPDATE bills SET AvgX = :AvgX WHERE Id = :Id AND Type = :Type", @avgx, specific_row[0], info_hash[:category]
end
puts db.changes.to_s + " changes made"
db.commit
rescue SQLite3::Exception => e
puts "error here " , e
ensure
specific_amt.close if specific_amt
db.close if db
end
end
上述 .each
块的一个主要问题是 instance variable
的使用。将 @avgx
换成 local variable avgx
可以解决这个问题。 avgx
然后可以在 SQL UPDATE
语句中使用。
第二个 specific_row array
需要指定正确的值。在这种情况下,所需的值为 Amount
。因为 arrays
是从 0 开始索引的,所以 Amount
的值存储在“specific_row[0]”中。
specific_amt.each do |specific_row|
if @total_rows == 1
avgx = @total_amt / @total_rows
elsif @total_rows > 1
avgx = (@total_amt - specific_row[0]) / (@total_rows - 1)
else
puts "insufficient entries"
return "insufficient entries"
end
db.execute2 "UPDATE bills SET AvgX = :AvgX WHERE Amount = :Amount AND Type = :Type AND Year = :Year", avgx, specific_row[0], info_hash[:category], info_hash[:year]
end
我有以下方法。我的代码在我的 .each
块中的 if statement
遇到错误:nil can't be coerced into Float (TypeError)
.
我已经尝试了许多变体,都在.each
块中遇到了障碍。
代码应计算 所有 项的平均值,按 Type
、 分组,不包括当前观察值 。例如,Type foo
下有 10 个不同值的 10 个项目。项目 1 有一个单元格计算 9 个项目的平均值 - 不包括 本身。请指教。我束手无策。
下面的代码是我IDE中存在的方法。 Ruby 2.3.7
specific_row[0]
应该属于 Id
和
specific_row[1]
应该属于 Amount
。
注意:我已经选择使用 .execute
而不是 .execute2
来避免 header 数据的行程。
def billavgx(info_hash)
begin
db = SQLite3::Database.open('billinfo.db')
db.results_as_hash = true
db.transaction
specific_amt = db.prepare "SELECT Amount AND Id FROM bills WHERE Type = :Type"
specific_amt.execute info_hash[:category]
specific_amt.each do |specific_row|
if @total_rows == 1
@avgx = (@total_amt - specific_row[1]) / @total_rows
elsif @total_rows > 1
@avgx = (@total_amt - specific_row[1]) / (@total_rows - 1)
else
return "insufficient entries"
end
db.execute2 "UPDATE bills SET AvgX = :AvgX WHERE Id = :Id AND Type = :Type", @avgx, specific_row[0], info_hash[:category]
end
puts db.changes.to_s + " changes made"
db.commit
rescue SQLite3::Exception => e
puts "error here " , e
ensure
specific_amt.close if specific_amt
db.close if db
end
end
上述 .each
块的一个主要问题是 instance variable
的使用。将 @avgx
换成 local variable avgx
可以解决这个问题。 avgx
然后可以在 SQL UPDATE
语句中使用。
第二个 specific_row array
需要指定正确的值。在这种情况下,所需的值为 Amount
。因为 arrays
是从 0 开始索引的,所以 Amount
的值存储在“specific_row[0]”中。
specific_amt.each do |specific_row|
if @total_rows == 1
avgx = @total_amt / @total_rows
elsif @total_rows > 1
avgx = (@total_amt - specific_row[0]) / (@total_rows - 1)
else
puts "insufficient entries"
return "insufficient entries"
end
db.execute2 "UPDATE bills SET AvgX = :AvgX WHERE Amount = :Amount AND Type = :Type AND Year = :Year", avgx, specific_row[0], info_hash[:category], info_hash[:year]
end