0
votes

Pandas: calculez la moyenne pondérée par ligne à l'aide d'un dataframe et d'une série

J'essayais de faire une moyenne pondérée et je suis tombé sur un doute:

Problème

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:

Exemple de code

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

Visualisation du problème

 problem


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

1
votes

Cela peut être fait de la manière suivante:

demand['result'] = (demand * months).sum(axis=1)/sum(months)


0 commentaires

2
votes

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)


2 commentaires

belle solution: +1


C'est vraiment génial. Merci pour cette solution.