Python - 加权平均列表

时间:2015-03-29 15:09:22

标签: python list average

感谢您的回复。是的,我一直在寻找加权平均值。

rate = [14.424, 14.421, 14.417, 14.413, 14.41]

amount = [3058.0, 8826.0, 56705.0, 30657.0, 12984.0]

我希望根据底部列表的每个项目对顶部列表进行加权平均。

因此,如果第一个底部列表项较小(例如3,058与总数112,230相比),那么第一个顶部列表项应该对顶级列表平均值的影响较小。

以下是我尝试过的一些内容。它给了我一个看起来正确的答案,但我不确定它是否符合我的要求。

for g in range(len(rate)):
    rate[g] = rate[g] * (amount[g] / sum(amount))
rate = sum(rate)

编辑: 在将其他回复与我的代码进行比较后,我决定使用邮政编码使其尽可能短。

4 个答案:

答案 0 :(得分:19)

您可以使用numpy.average来计算加权平均值。

In [13]: import numpy as np

In [14]: rate = [14.424, 14.421, 14.417, 14.413, 14.41]

In [15]: amount = [3058.0, 8826.0, 56705.0, 30657.0, 12984.0]

In [17]: weighted_avg = np.average(rate, weights=amount)

In [19]: weighted_avg
Out[19]: 14.415602815646439

答案 1 :(得分:13)

for g in range(len(rate)):
   rate[g] = rate[g] * amount[g] / sum(amount)
rate = sum(rate)

与:

相同
sum(rate[g] * amount[g] / sum(amount) for g in range(len(rate)))

与:

相同
sum(rate[g] * amount[g] for g in range(len(rate))) / sum(amount)

与:

相同
  

总和(x * y表示x,y表示拉链(费率,金额))/总和(金额)

结果:

14.415602815646439

答案 2 :(得分:7)

这看起来像加权平均值。

values = [1, 2, 3, 4, 5]
weights = [2, 8, 50, 30, 10]

s = 0
for x, y in zip(values, weights):
    s += x * y

average = s / sum(weights)
print(average) # 3.38

这会输出3.38,这确实更倾向于具有最高权重的值。

答案 3 :(得分:1)

让我们使用python zip函数

zip([iterable, ...])

此函数返回元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素。返回的列表的长度被截断为最短参数序列的长度。当有多个参数长度相同时,zip()类似于map(),初始参数为None。使用单个序列参数,它返回一个1元组的列表。没有参数,它返回一个空列表。

weights = [14.424, 14.421, 14.417, 14.413, 14.41]
values = [3058.0, 8826.0, 56705.0, 30657.0, 12984.0]
weighted_average = sum(weight * value for weight, value in zip(weights, values)) / sum(weights)