Club Power BI

Please login or click SIGN UP FOR FREE to create your PowerBIUG account to join this user group.
Expand all | Collapse all

compter le nombre d'occurrences consécutives d'une valeur

Jump to Best Answer
  • 1.  compter le nombre d'occurrences consécutives d'une valeur

    Posted 7 days ago
    Bonjour à tous,

    Cela fais un moment que je suis embêté car je recherche un moyen de réaliser un comptage permettant de discriminer le nombre de participation consécutives à des événements par exemple :

    01/01/2021 Albert       1
    01/01/2021 Bernard       1
    01/01/2021 Clément       1
    01/01/2021 Didier       1
    01/01/2021 Eric       1
    01/01/2021 Frédéric       1
    01/01/2021 Gaston       1
    01/01/2021 Henri       1

    03/01/2021 Albert       2
    03/01/2021 Clément       2
    03/01/2021 Didier       2
    03/01/2021 Frédéric       2
    03/01/2021 Henri       2
    03/01/2021 Isidor       1
    03/01/2021 Jocelyn       1
    03/01/2021 Kévin       1

    10/01/2021 Albert       3
    10/01/2021 Bernard       1
    10/01/2021 Clément       3
    10/01/2021 Didier       3
    10/01/2021 Eric       1
    10/01/2021 Frédéric       3
    10/01/2021 Isidor       2
    10/01/2021 Jocelyn       2
    10/01/2021 Kévin       2

    J'hésite à créer un index pour chaque date (exemple : 01/01/2021 = 1 ; 03/01/2021 = 2 ; 10/01/2021 = 3 ; ...) si c'est le cas, je n'arrive plus à le faire en ce moment.
    Merci de votre aide.
    Maxime

    ------------------------------
    Maxime
    ------------------------------


  • 2.  RE: compter le nombre d'occurrences consécutives d'une valeur
    Best Answer

    Bronze Contributor
    Posted 4 days ago
    Edited by Maxime __ 3 days ago
      |   view attached
    Bonjour

    Je vous propose une solution utilisant la fonction Table.Group de Power Query avec les paramètres 4 et 5 de cette fonction : GroupKind et Fonction de "regroupement"

    1ere requête : lister les réunions (via suppression des doublons de la 1ere colonne) + ajout d'un Index_Réunion

    2eme requête :
    - faire référence à la table initiale
    - ajouter un Index_Init pour pouvoir trier dans l'ordre initial à la fin de la requête
    - fusionner avec la table des réunions pour récupérer le n° de la réunion 1, 2, 3...
    - trier les lignes suivant le nom du participant + le n° d'ordre  : on obtient Albert 1 puis 2 puis 3, Bernard 1 puis 3 (il n'était pas là à la 2eme réunion)
    - ajouter de nouveau un Index_Comparaison sur ces lignes triées
    - regrouper les lignes

    = Table.Group(
    #"Index ajouté1",
    {"Nom", "Index_Réunion", "Index_Comparaison"},
    {{"Table", each Table.AddIndexColumn(_,"Index_Participation",1)}},
    GroupKind.Local,
    (x,y)=>Number.From(x[Nom]<>y[Nom] or (y[Index_Réunion]-x[Index_Réunion])<>(y[Index_Comparaison]-x[Index_Comparaison])))

    1ere argument : l'étape précédente
    2eme argument : je regroupe par Nom, Index_Réunion et Index_Comparaison
    3eme argument : pour chaque regroupement je récupère la table (avec _) et j'ajoute votre Index_Participation que vous cherchez avec Table.AddIndexColumn
    4eme argument : GroupKind.Local car je veux regrouper les éléments de la table successivement et non pas globalement
    5eme argument : x désigne le premier enregistrement de mon regroupement, y désigne l'enregistrement actuel et tant que la fonction me renvoie 0, cet enregistrement sera regroupé. En l'occurrence, il faut créer un nouveau regroupement dès que l'on change de nom x[Nom]<>y[Nom] ou dès que l'écart entre les deux index de réunion (l'actuel - l'initial) et différent de l'écart entre les index de comparaison.

    Explications :
    en ligne 2 soit l'index_comparaison = 2, Albert a participé à la 2eme réunion comme 2-1 = 2-1  on regroupe avec la ligne précédente
    en ligne 3 soit l'index_comparaison = 3, Albert a également participé à la 3eme réunion comme 3-1 = 3-1  on regroupe avec la ligne précédente
    en ligne 4 soit l'index_comparaison = 4, Bernard a participé à la 1ere réunion mais comme Bernard<>Albert on crée un nouveau regroupement
    en ligne 5 soit l'index_comparaison = 5, Bernard a participé à la 3eme réunion mais comme 3-1 <> 5-4 on ne regroupe pas avec la ligne précédent et on crée un nouveau regroupement

    - le reste des étapes est facile : on développe les champs, on trie suivant l'ordre initial, en termine avec de la mise en forme et le choix des colonnes

    il y a peut-être plus simple mais cette possibilité de regroupement avec les arguments 4 et 5 de Table.Group me paraissait intéressante à partager.
    J'ai moi-même découvert cet usage sur le blog d'Imke Feldmann
    https://www.thebiccountant.com/2018/01/21/table-group-exploring-the-5th-element-in-power-bi-and-power-query/

    Voir la pièce jointe

    Cordialement





    ------------------------------
    S LORIN
    ------------------------------

    Attachment(s)



  • 3.  RE: compter le nombre d'occurrences consécutives d'une valeur

    Posted 3 days ago
    Bonjour à tous.

    Merci à toi S Lorin ;) et aussi à Jonathan pour la réactivité.
    La solution en M est la bonne pour mon cas en effet, la complexité été de faire une remise à zéro en cas d'absence et ça me rassure (ainsi que mon petit égo) qu'en DAX, je ne sois pas le seul à sécher ;)
    J'ai du faire une modification dans le code car ma table est plus vaste que les 3 informations de l'exemple.
    Lors du développement de la table, je ne fais pas de réduction à 4 colonnes comme dans le code.
    Si je le fais j'ai null comme résultat pour Index_Init et Index_Participation, mais c'est clairement un détail.

    Par la suite en effet, il ne reste que la mise en forme.
    Je colle la fin du code que j'ai supprimé qui est dans le fichier d'exemple.
    Encore un grand merci.
    Maxime

    Code:

    #"Table développé" = Table.ExpandTableColumn(#"Lignes groupées", "Table", {"Date", "Ordre", "Index_Init", "Index_Participation"}, {"Date", "Ordre", "Index_Init", "Index_Participation"}),
    #"Lignes triées1" = Table.Sort(#"Table développé",{{"Index_Init", Order.Ascending}}),
    #"Autres colonnes supprimées" = Table.SelectColumns(#"Lignes triées1",{"Date", "Nom", "Index_Participation"}),
    #"Type modifié" = Table.TransformColumnTypes(#"Autres colonnes supprimées",{{"Date", type date}})
    in
    #"Type modifié"

    ------------------------------
    Maxime
    ------------------------------



  • 4.  RE: compter le nombre d'occurrences consécutives d'une valeur

    Bronze Contributor
    Posted 3 days ago
    Merci Maxime pour ce retour
    Bon courage pour la suite de ton projet
    Stéphane

    ------------------------------
    S LORIN
    ------------------------------



  • 5.  RE: compter le nombre d'occurrences consécutives d'une valeur

    Top Contributor
    Posted 3 days ago
    Salut,

    J'ai fait le test avec les colonnes suivantes dans une table "Donnees" :
    • Date,
    • Prenom
    J'ai fait les mesures suivantes :
    • NB User = COUNT(Donnees[Prenom])
    • Cumul = CALCULATE ([NB User], FILTER (ALLEXCEPT(Donnees, Donnees[Prenom] ), Donnees[Date] <= MAX ( Donnees[Date])))
    Cela fonctionne correctement chez moi.

    J'espère que ça t'aidera, à plus tard sur le forum.


    ------------------------------
    Jonathan CHANAL
    Chef de Projet Digital / Data Analyst
    MCSA Power BI & Excel
    ------------------------------



  • 6.  RE: compter le nombre d'occurrences consécutives d'une valeur

    Bronze Contributor
    Posted 3 days ago
    Bonjour Jonathan
    J'avais bien pensé une solution de ce type en utilisant RANKX

    Var Nom=Données[Nom]
    RETURN RANKX(FILTER(Données,Données[Nom]=Nom),Données[Date],Données[Date],ASC)

    Sauf que la demande initiale est de compter les participations consécutives. Bernard le 10/01 il revient à 1 et non pas 2
    Et là en DAX je sèche, comment ne pas tenir compte de la réunion du 01/01 pour Bernard du fait qu'il n'était pas présent le 03/01 ?

    d'où ma proposition avec Query et Table.Group

    Cordialement



    ------------------------------
    S LORIN
    ------------------------------



  • 7.  RE: compter le nombre d'occurrences consécutives d'une valeur

    Top Contributor
    Posted 3 days ago
    Hello,

    J'ai beau relire, la demande correspond bien à ce que j'ai fait, il veut faire un cumul par personne au fil de l'eau. Mais on va le laisser répondre plutôt ;)

    A plus tard,

    ------------------------------
    Jonathan CHANAL
    Chef de Projet Digital / Data Analyst
    MCSA Power BI & Excel
    ------------------------------



  • 8.  RE: compter le nombre d'occurrences consécutives d'une valeur

    Top Contributor
    Posted 3 days ago
    Edited by Jonathan CHANAL 19 hours ago
    Hello,

    Chez moi ça fonctionne pourtant... Ci-joint le fichier de test.

    Bon courage et bonne continuation

    ------------------------------
    Jonathan CHANAL
    Chef de Projet Digital / Data Analyst
    MCSA Power BI & Excel
    ------------------------------

    Attachment(s)



  • 9.  RE: compter le nombre d'occurrences consécutives d'une valeur

    Posted 3 days ago
    Bonjour Jonathan,
    Merci de ta réponse et du temps que tu as pris pour me répondre.
    Dans mon cas cela ne fonctionne pas malheureusement.
    Bonne journée.
    Maxime

    ------------------------------
    Maxime
    ------------------------------



  • 10.  RE: compter le nombre d'occurrences consécutives d'une valeur

    Bronze Contributor
    Posted 3 days ago
    Re-bonjour

    Avec des formules DAX + l'ajout d'une table des Réunions nécessaire pour déterminer si 2 réunions sont consécutives ou non

    Date | Index_Réunion
    01/01/2021 | 1
    03/01/2021 | 2
    10/01/2021 | 3

    Dans la table de départ, ajout d'une colonne "Groupe_Réunion"

    =VAR Nom=Tableau1[Nom]
    RETURN RELATED('Liste_Réunion'[Index_Réunion])-RANKX(FILTER(Tableau1;Tableau1[Nom]=Nom);Tableau1[Date];Tableau1[Date];ASC)

    renvoie 0 pour le premier groupe de réunions consécutives de chaque participant
    puis 1, 2 3... pour chaque groupe de réunions consécutives

    ajout d'une deuxième colonne RANKX qui donne le rang sur à la fois le nom et ce groupe de réunion renvoie l'ordre souhaité

    =VAR Nom=Tableau1[Nom]
    VAR Groupe_Reunion= Tableau1[Groupe_Réunion]
    RETURN RANKX(FILTER(Tableau1;Tableau1[Nom]=Nom&&Tableau1[Groupe_Réunion]=Groupe_Reunion);Tableau1[Date];Tableau1[Date];ASC)

    A adapter sous PBI

    C'est possible aussi sous Power Query et c'est plus simple que ma solution initiale
    - récupération de l'index de la réunion
    - Table.Group sur le nom avec ajout d'index
    - Calcul d'écart entre cet index et celui de la réunion
    - deuxième Table.Group sur le nom + l'écart avec également ajout d'index (celui cherché)

    Cordialement



    ------------------------------
    S LORIN
    ------------------------------