Moyenne pondérée en Python d'une liste

Merci pour vos réponses. Oui, je cherchais le moyen pondéré.

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

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

je veux la moyenne pondérée de la liste supérieure basée sur chaque élément de la liste inférieure.

donc, si le premier élément de la liste inférieure est petit (par exemple 3 058 par rapport au total 112 230), alors le premier élément de la liste supérieure devrait avoir moins d'effet sur la moyenne de la liste supérieure.

Voici ce que j'ai essayé. Il me donne une réponse qui semble juste, mais je ne suis pas sûr si elle suit ce que je suis à la recherche d'.

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

modifier: Après la comparaison d'autres réponses à mon code, j'ai décidé d'utiliser le code postal de le garder aussi court que possible.

12
demandé sur GShocked 2015-03-29 18:09:21

4 réponses

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

est la même chose que:

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

qui est le même que:

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

qui est le même que:

sum(x * y pour x, y dans le zip(taux, montant)) / sum(montant)

Résultat:

14.415602815646439
9
répondu JuniorCompressor 2015-03-29 15:25:08

Vous pouvez utiliser numpy.average pour calculer la moyenne pondérée.

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
15
répondu Akavall 2015-03-29 15:28:57

Cela ressemble à une moyenne pondérée.

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

sorties 3.38, qui tend en effet davantage vers les valeurs ayant les poids les plus élevés.

6
répondu maahl 2015-12-07 05:05:43

utilisons python zip function

zip([iterable, ...])

cette fonction renvoie une liste de tuples, où le tuple i-th contient l'élément i-th de chacune des séquences d'arguments ou itérables. La liste retournée est tronquée en longueur à la longueur de la séquence d'arguments la plus courte. Quand il y a plusieurs arguments qui sont tous de la même longueur, zip() est similaire à map() avec un argument initial de None. Avec un seul argument sequence, il retourne une liste de 1-tuples. Sans arguments, elle retourne une liste vide.

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)
1
répondu Łukasz Rogalski 2015-03-29 15:25:46