Python - взвешенное усреднение списка

Спасибо за ваши ответы. Да, я искал средневзвешенный.

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

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

Я хочу средневзвешенное значение верхнего списка на основе каждого элемента нижнего списка.

Итак, если первый элемент нижнего списка мал (например, 3058 по сравнению с общим 112,230), тогда первый элемент верхнего списка должен иметь меньшее влияние на средний показатель верхнего списка.

Вот некоторые из моих попыток. Это дает мне ответ, который выглядит правильно, но я не уверен, следует ли ему то, что я ищу.

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

EDIT: После сравнения других ответов с моим кодом я решил использовать почтовый индекс, чтобы он был как можно короче.

Ответ 1

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 в zip (тариф, сумма))/сумма (сумма)

Результат:

14.415602815646439

Ответ 2

Вы можете использовать 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

Ответ 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

Пусть используется функция 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)