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.
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
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
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.
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)