要按公司的市场容量计算加权平均值,我有这样的方法:
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/