ruby-on-rails - 有没有办法使用 postgresql 函数来计算 Rails 中的加权平均值?

标签 ruby-on-rails postgresql

要按公司的市场容量计算加权平均值,我有这样的方法:

class Company < ActiveRecord::Base
  def self.weighted_average(column)
    market_cap_sum = sum(:market_cap)
    array = []
    find_each do |company|
      next if company.send(column).nil?
      next if company.market_cap.nil?
      array << (company.market_cap.to_d/market_cap_sum) * company.send(column)
    end
    array.sum
  end
end

此代码运行良好,但计算速度较慢。如果有一种方法可以通过 postgresql 函数计算,我想使用它。

要计算标准偏差,有一个这样的函数,但我找不到如何用加权平均值计算标准偏差。

Company.select('stddev_pop(price) as stddev')

有没有可能做我想做的事?

最佳答案

这种方法中的数学似乎并不为人所知。享受这个老程序员的把戏吧。

CREATE TABLE data (
    w real,   /* Weight. May be an integer count or other weight. */
    v real);  /* Value. The value v is to be weighted by w. */

用一个值“1”的副本和十个值“10”的副本填充表:

insert into data values(1, 1);
insert into data values(10, 2);

然后运行以下查询以获得加权统计值:

SELECT
  min(v),
  sum(w*v)/sum(w) AS wavg,
  max(v),
  sqrt((sum(w*v^2)-(sum(w*v)^2)/sum(w))/(sum(w)-1)) AS wstdev
    FROM data;

结果是:

 min |  wavg   | max |      wstdev       
-----+---------+-----+-------------------
   1 | 1.90909 |   2 | 0.301511344577763
(1 row)

关于ruby-on-rails - 有没有办法使用 postgresql 函数来计算 Rails 中的加权平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31021895/

相关文章:

ruby-on-rails - 可排序的 UUID 和覆盖 ActiveRecord::Base

sql - Postgres 将字符串转换为时间

sql - 如何在查询结果上运行函数?

postgresql - 在安装 libpqxx 的 ./configure 步骤中出错

ruby-on-rails - 是否可以在 Rails 中获取原始参数字符串?

ruby-on-rails - Spree 应用和 main rails 应用 CSS 加载

sql - 选择在 Rails 中创建的最后一个唯一多态对象

python - psycopg2.编程错误: column of relation does not exist

ruby-on-rails - 定义has_rich_text方法时__FILE__和__LINE__+1的作用是什么?

ruby-on-rails - Rails where, sort and combining 同一张表