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)