【问题标题】:Weighted averaging a list加权平均列表
【发布时间】:2015-06-02 13:24:07
【问题描述】:

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

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)

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

【问题讨论】:

  • 你的意思是weighted average
  • @Pyson 这些列表似乎都没有 100% 的总和,所以我不确定。
  • 如果您正在寻找@Pyson 提到的加权平均值,一个好主意是标准化第二个向量,并应用 w.a 算法
  • 我知道加权平均,我只是放了个屁。谢谢

标签: python list average


【解决方案1】:

作为一个记录和测试的功能:

def weighted_average(values, weights=None):
    """
    Returns the weighted average of `values` with weights `weights`
    Returns the simple aritmhmetic average if `weights` is None.
    >>> weighted_average([3, 9], [1, 2])
    7.0
    >>> 7 == (3*1 + 9*2) / (1 + 2)
    True
    """
    if weights == None:
        weights = [1 for _ in range(len(values))]
    normalization = 0
    val = 0
    for value, weight in zip(values, weights):
        val += value * weight
        normalization += weight
    return val / normalization

为了完整起见,另一个版本将值和权重存储在元组中:

def weighted_average(values_and_weights):
    """
    The input is expected in the form:
        [(value_1, weight_1), (value_2, weight_2), ...(value_n, weight_n)]
    >>> weighted_average([(3,1), (9,2)])
    7.0
    >>> 7 == (3*1 + 9*2) / (1 + 2)
    True

    """
    normalization = 0
    val = 0
    for value, weight in values_and_weights:
        val += value * weight
        normalization += weight
    return val / normalization

【讨论】:

    【解决方案2】:
    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)
    

    等同于:

    sum(x * y for x, y in zip(rate, amount)) / sum(amount)

    结果:

    14.415602815646439
    

    【讨论】:

    • 谢谢,这行得通。但是,以黄色突出显示的那个给了我一个语法错误。
    • 我又试了一次,这次成功了。我可能不小心在页面上复制了一些额外的内容。我将使用您的黄色突出显示的代码。谢谢!
    • 我强烈反对这个答案,而支持另一个提议的np.average:numpy 实际上属于标准库。然后,如果我们已经有了实现,我们就不要重新发明轮子(甚至不谈论速度)
    【解决方案3】:

    这看起来像是加权平均值。

    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,确实更倾向于权重最高的值。

    【讨论】:

      【解决方案4】:

      您可以使用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
      

      【讨论】:

      • 谢谢,但我正在尝试使用包含的 2.7.9 库。
      • Numpy 是事实上的标准库
      【解决方案5】:

      让我们使用pythonzip函数

      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)
      

      【讨论】:

      • 你已经交换了权重和值。我希望根据千值对 14.000 个值进行加权。
      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2021-09-03
      • 2010-09-21
      • 1970-01-01
      • 2012-12-18
      • 2018-07-28
      • 2017-09-22
      • 1970-01-01
      相关资源
      最近更新 更多