2015-03-29 11 views
10

Dzięki za odpowiedzi. Tak, szukałem średniej ważonej.Python - ważony uśrednianie listy

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

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

Chcę średniej ważonej najwyższej listy na podstawie każdego elementu z dolnej listy.

Tak więc, jeśli pierwsza pozycja na dolnej liście jest mała (na przykład 3 058 w porównaniu do całkowitej liczby 112,230), pierwsza pozycja z górnej listy powinna mieć mniejszy wpływ na średnią wartość z góry.

Oto niektóre z tego, co próbowałem. Daje mi odpowiedź, która wygląda dobrze, ale nie jestem pewien, czy podąża za tym, czego szukam.

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

EDIT: Po porównując inne reakcje z mojego kodu, postanowiłem wykorzystać kod pocztowy, aby zachować możliwie jak najkrótszy.

+3

Czy to znaczy [średni ważony] (http://en.wikipedia.org/wiki/Weighted_arithmetic_mean) –

+0

@Pyson Żaden z tych list wydają się mieć pewną sumę 100 procent, więc nie jestem pewien, o tym. –

+0

Jeśli szukasz średniej ważonej jak wspomniano @Pyson, dobrym pomysłem jest znormalizowanie drugiego wektora i zastosowanie algorytmu w.a – srj

Odpowiedz

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

jest jak poniżej:

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

który jest taki sam jak:

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

która jest taka sama jak:

suma (x * Y x, y w zip (stawka, kwota))/suma (kwota)

Wynik:

14.415602815646439 
+0

Dzięki, to działało. Ten podświetlony na żółto dał mi błąd składni. – GShocked

+1

Czy na pewno skopiowałeś go poprawnie? – JuniorCompressor

+0

Próbowałem jeszcze raz, zadziałało tym razem. Prawdopodobnie skopiowałem coś na stronie przypadkowo. Będę używał twojego podświetlonego na żółto kodu. Dzięki! – GShocked

6

Wygląda to na średnią ważoną.

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 

Urządzenie wysyła 3.38, który faktycznie ma tendencję raczej na wartości, przy czym najwyższe wag.

1

użyjmy pyton zip funkcja

zip([iterable, ...]) 

Funkcja ta zwraca listę krotek, gdzie i-krotka zawiera element i-tego z każdego argumentu sekwencje lub iterables. Zwrócona lista jest skrócona do długości najkrótszej sekwencji argumentów. Gdy istnieje wiele argumentów, które są tej samej długości, zip() jest podobny do map() z początkowym argumentem None. Za pomocą argumentu pojedynczej sekwencji zwraca listę 1-krotnych. Bez argumentów zwraca pustą listę.

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) 
+0

Masz zamienione wagi i wartości. Chcę, aby 14000 wartości było ważonych na podstawie tysięcy wartości. – GShocked

10

Do obliczenia średniej ważonej można użyć 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 
+0

Dzięki, ale staram się korzystać z dołączonych bibliotek 2.7.9. – GShocked