XL 2016 Power Query - Moyenne glissante

danielco

XLDnaute Accro
Bonjour,

J'ai une colonne de dates et une colonne de valeurs. Est-il possible de créer une colonne de valeurs moyennes entre deux dates ? Je cherche à avoir une moyenne glissante.

Cordialement.

Daniel
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Voici une fonction en M qui vous donnera la moyenne des ventes entre deux dates (début et fin) pour une table 'T_Ventes' ayant une colonne 'Date' et une colonne 'Vente'

Code:
let MoyenneGlissante = (début as date,fin as date) => let       
        Lignes = Table.SelectRows(T_Ventes,  each [Date]>=début and [Date]<=fin),
        Resultat = List.Average(Lignes[Vente])
        in Resultat
in MoyenneGlissante

Sans plus d'explication sur le pourquoi du comment du pataquès difficile de faire plus.

bonne journée
 

danielco

XLDnaute Accro
Bonjour,

Voici une piste sur le lien ci-dessous :

Cordialement
Bonjour et merci.

C'est peut-être la solution mais j'avoue que je ne sais pas manipuler directement M. Je sais juste faire des colonnes perso ;-(
Bonjour,

Voici une fonction en M qui vous donnera la moyenne des ventes entre deux dates (début et fin) pour une table 'T_Ventes' ayant une colonne 'Date' et une colonne 'Vente'

Code:
let MoyenneGlissante = (début as date,fin as date) => let      
        Lignes = Table.SelectRows(T_Ventes,  each [Date]>=début and [Date]<=fin),
        Resultat = List.Average(Lignes[Vente])
        in Resultat
in MoyenneGlissante

Sans plus d'explication sur le pourquoi du comment du pataquès difficile de faire plus.

bonne journée
Bonjour @Roblochon ,
Je joins une copie d'écran de ce que je voudrais avec PQ : une moyenne glissant sur 7 jours :
Capture d’écran 2020-11-16 183442.png


Daniel
 

job75

XLDnaute Barbatruc
Bonsoir danielco, le fil,

Votre formule en C7 va bien sauf quand on ajoute ou supprime des lignes.

Dans ce cas il faut utiliser :
Code:
=SIERREUR(MOYENNE(DECALER(B7;;;-7));"")
Ce devrait maintenant être simple sur Power Query.

A+
 

R@chid

XLDnaute Barbatruc
Bonsoir @ tous,
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Valeur", Int64.Type}}),
    #"Index ajouté" = Table.AddIndexColumn(#"Type modifié", "Index", 1, 1, Int64.Type),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Index ajouté", "Moyenne Semaine", each List.Average(List.Range(Source[Valeur],[Index]-7,7))),
    #"Autres colonnes supprimées" = Table.SelectColumns(#"Personnalisée ajoutée",{"Moyenne Semaine"}),
    #"Type modifié1" = Table.TransformColumnTypes(#"Autres colonnes supprimées",{{"Moyenne Semaine", type number}}),
    #"Erreurs remplacées" = Table.ReplaceErrorValues(#"Type modifié1", {{"Moyenne Semaine", null}})
in
    #"Erreurs remplacées"
Voir PJ


Cordialement
 

Pièces jointes

  • danielco_MoyenneGlissante_PQ_V1.xlsx
    17.8 KB · Affichages: 15

danielco

XLDnaute Accro
Bonsoir danielco, le fil,

Votre formule en C7 va bien sauf quand on ajoute ou supprime des lignes.

Dans ce cas il faut utiliser :
Code:
=SIERREUR(MOYENNE(DECALER(B7;;;-7));"")
Ce devrait maintenant être simple sur Power Query.

A+
Bonjour @job75 ,
Merci de ta réponse. Effectivement (dans mon cas, il n'y a ni ajout ni suppression. Ces dates représentent le passé).

Daniel
 

danielco

XLDnaute Accro
Bonsoir @ tous,
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Valeur", Int64.Type}}),
    #"Index ajouté" = Table.AddIndexColumn(#"Type modifié", "Index", 1, 1, Int64.Type),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Index ajouté", "Moyenne Semaine", each List.Average(List.Range(Source[Valeur],[Index]-7,7))),
    #"Autres colonnes supprimées" = Table.SelectColumns(#"Personnalisée ajoutée",{"Moyenne Semaine"}),
    #"Type modifié1" = Table.TransformColumnTypes(#"Autres colonnes supprimées",{{"Moyenne Semaine", type number}}),
    #"Erreurs remplacées" = Table.ReplaceErrorValues(#"Type modifié1", {{"Moyenne Semaine", null}})
in
    #"Erreurs remplacées"
Voir PJ


Cordialement
Oui ! Merci ! Si j'ai bien compris, "List.Range" est l'équivalent de DECALER d'Excel ? (cf. Job75).

Daniel
 

R@chid

XLDnaute Barbatruc
Re,
Oui ! Merci ! Si j'ai bien compris, "List.Range" est l'équivalent de DECALER d'Excel ? (cf. Job75).
Oui c'est bien cela

Merci à toi aussi. Je n'ai pas vu de différence avec la solution de R@chid.
Oui il y quelques différences,
= Table.AddIndexColumn(#"Type modifié", "Index", 1, 1, Int64.Type) au lieu de 0 afin de ne pas se mélanger les pinceaux lors de = Table.AddColumn(#"Index ajouté", "Moyenne Semaine", each List.Average(List.Range(Source[Valeur],[Index]-7,7))) tu n'as pas besoin à écrire -6, comme ça tu sais très bien que tu vas utiliser le nombre de lignes que tu as besoin de prendre en compte dans les deux cotés 7 et -7 et pas 7 et -6.
En plus, avec List.Average() tu évites de faire la somme avec List.Accumulate() et diviser par le nombre de lignes.

Cordialement
 

Amilo

XLDnaute Accro
Merci à toi aussi. Je n'ai pas vu de différence avec la solution de R@chid.
Re,
R@chid a bien compris et expliqué la différence entre les 2 solutions, il y a sinon effectivement une petite ressemblance.
Sinon, je n'ai fait que reprendre 1 pour 1 la solution présentée dans la vidéo de mon lien du poste #3 sans chercher à modifier ce code.
La proposition à R@chid est effectivement celle à retenir car plus simple dans la compréhension notamment par la colonne d'indexation à partir de 1 et de la fonction List.Average

Cordialement
 

Discussions similaires

Réponses
7
Affichages
272

Statistiques des forums

Discussions
312 069
Messages
2 085 037
Membres
102 763
dernier inscrit
NICO26