web-dev-qa-db-fra.com

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

Merci pour vos réponses. Oui, je cherchais la moyenne pondérée.

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 du haut en fonction de chaque élément de la liste du bas.

Ainsi, si le premier élément de la liste inférieure est petit (comme 3 058 par rapport au total de 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 une partie de ce que j'ai essayé. Cela me donne une réponse qui a l'air correcte, mais je ne suis pas sûr qu'elle suive ce que je recherche.

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

EDIT: Après avoir comparé d'autres réponses avec mon code, j'ai décidé d'utiliser le code postal pour le garder aussi court que possible.

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

est le même que:

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

ce qui équivaut à:

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

ce qui équivaut à:

somme (x * y pour x, y en Zip (taux, montant))/somme (montant)

Résultat:

14.415602815646439
16
JuniorCompressor

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
20
Akavall

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

Cela génère 3.38, qui tend en effet davantage vers les valeurs avec les poids les plus élevés.

7
maahl

Utilisons la fonction python Zip

Zip([iterable, ...])

Cette fonction renvoie une liste de tuples, où le i-ème Tuple contient le i-ème élément de chacune des séquences d'arguments ou des itérables. La liste renvoyée est tronquée en longueur à la longueur de la séquence d'arguments la plus courte. Lorsqu'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 de séquence, il renvoie une liste de 1-tuples. Sans argument, il renvoie 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
Łukasz Rogalski