web-dev-qa-db-ja.com

Python-リストの加重平均

ご回答ありがとうございます。はい、加重平均を探していました。

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

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

下部リストの各項目に基づいて上部リストの加重平均が必要です。

したがって、最初の下位リスト項目が小さい場合(合計112,230と比較して3,058など)、最初の上位リスト項目は上位リストの平均にほとんど影響しません。

ここに私が試したもののいくつかがあります。それは私に正しいように見える答えを与えますが、私が探しているものに従っているかどうかはわかりません。

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

編集:他の応答とコードを比較した後、Zipコードを使用してできるだけ短くすることにしました。

16
GShocked
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)

次と同じです:

sum(x * y for x、y in Zip(rate、amount))/ sum(amount)

結果:

14.415602815646439
16

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

これは加重平均のように見えます。

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を出力します。これは実際、最も高い重みを持つ値に向かって傾向があります。

7
maahl

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