J'essayais de faire une moyenne pondérée et je suis tombé sur un doute:
Je voulais créer une nouvelle colonne nommée réponse qui calcule le résultat entre chaque ligne et une liste de valeurs nommées dans ce cas mois . Si j'utilise df.mean () , j'obtiendrais une moyenne simple par mois et ce n'est pas ce que je veux. L'idée est de donner plus d'importance à la fin d'année et moins d'importance à la demande dans la mendicité de l'année. C'est pourquoi j'aimerais utiliser le calcul de la moyenne pondérée.
Dans excel , j'utiliserais la formule ci-dessous. J'ai du mal à convertir ce calcul en trame de données pandas.
= SUMPRODUCT (demandes [@ [1]: [12]]; mois) / SUM (mois)
Je n'ai pas trouvé de solution à ce problème et j'apprécie vraiment l'aide sur ce sujet.
Merci d'avance.
Voici un dataframe factice qui sert d'exemple:
demand = pd.DataFrame({'1': [360, 40, 100, 20, 55],
'2': [500, 180, 450, 60, 50],
'3': [64, 30, 60, 10, 0],
'4': [50, 40, 30, 60, 50],
'5': [40, 24, 45, 34, 60],
'6': [30, 34, 65, 80, 78],
'7': [56, 45, 34, 90, 58],
'8': [32, 12, 45, 55, 66],
'9': [32, 56, 89, 67, 56],
'10': [57, 35, 75, 48, 9],
'11': [56, 33, 11, 6, 78],
'12': [23, 65, 34, 8, 67]
})
months = [i for i in range(1,13)]
3 Réponses :
Vous pouvez essayer ce code:
1 2 3 4 5 6 7 8 9 10 11 12 average 0 360 500 64 50 40 30 56 32 32 57 56 23 58.076923 1 40 180 30 40 24 34 45 12 56 35 33 65 43.358974 2 100 450 60 30 45 65 34 45 89 75 11 34 58.884615 3 20 60 10 60 34 80 90 55 67 48 6 8 43.269231 4 55 50 0 50 60 78 58 66 56 9 78 67 55.294872
Le résultat:
den = np.sum(a) demand['average']=demand['1'].mul(1/den).add(demand['2'].mul(2/den)).add(demand['3'].mul(3/den)).add(demand['4'].mul(4/den)).add(demand['5'].mul(5/den)).add(demand['6'].mul(6/den)).add(demand['7'].mul(7/den)).add(demand['8'].mul(8/den)).add(demand['9'].mul(9/den)).add(demand['10'].mul(10/den)).add(demand['11'].mul(11/den)).add(demand['12'].mul(12/den))
Cela peut être fait de la manière suivante:
demand['result'] = (demand * months).sum(axis=1)/sum(months)
Utilisez simplement numpy.average , en spécifiant weights:
1 2 3 4 5 6 ... 8 9 10 11 12 result 0 360 500 64 50 40 30 ... 32 32 57 56 23 58.076923 1 40 180 30 40 24 34 ... 12 56 35 33 65 43.358974 2 100 450 60 30 45 65 ... 45 89 75 11 34 58.884615 3 20 60 10 60 34 80 ... 55 67 48 6 8 43.269231 4 55 50 0 50 60 78 ... 66 56 9 78 67 55.294872
https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy .average.html
Outputs:
demand["result"]=np.average(demand, weights=months, axis=1)
belle solution: +1
C'est vraiment génial. Merci pour cette solution.