IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

[Panda] dataframe et hierarchical tree [Python 3.X]


Sujet :

Calcul scientifique Python

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut [Panda] dataframe et hierarchical tree
    Bonjour à tous,

    Je rencontre un petit problème car je n'ai aucune idée de comment procéder à une tâche.

    J'ai un dataframe qui se compose de ce type de colonne :
    CodeGroupe; [200 colonnes avec un nom de 0 à 199]

    Dans ces 200 colonnes, il s'agit en fait de composants de mon groupe, certaines lignes vont avoir que 1 ou 2 colonnes de remplis, d'autres peuvent les avoir toutes. (toutes les données sont numériques)
    Par exemple, je peux avoir :

    CodeArticle;0;1;2;3
    1;200;300;400

    Le groupe fini 1 est donc composé des identifiants 200;300 et 400.

    Si j'ai, plus loin dans mon dataframe, une ligne du style :

    CodeArticle;0;1;2
    200;3999;4000

    Mon sous-groupe 200 n'est pas un groupe "final", il est lui même composé de 3999 et de 4000.
    4000 est donc un composant de 200 qui est lui même un composant de 1

    J'aimerais deux choses :
    Un arbre avec ceci :
    1
    200
    3999
    4000
    300
    400

    Mon problème ici est que je ne sais pas comment dire à mon framework de creation d'arbre (quel qu'il soit) qu'il doit gérer les 200 colonnes comme les enfants de "CodeGroupe" et que des fois, un code "enfant" peut être lui même parent.
    Je me suis dit que je pourrais peut-être concaténer mes 200 colonnes en une seule mais pour gérer les sous-sous niveaux je ne sais pas comment faire.

    J'ai tenté de voir, si je pouvais avoir une option pour générer une nouvelle colonne m'indiquant le niveau (par exemple, ma ligne 1;200;300;400 serait le niveau 1 car aucun groupe n'est composé de 1) mais je ne sais pas non plus comment faire, là, je sèche totalement sur quel style d'algo je dois mettre en place...

    J'espère avoir été clair

    Bisous bisous

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Si on prend chaque ligne du dataframe, comment la placer dans un arbre?
    Par exemple, la ligne 1;200;300;400 crée 4 nœuds où 200, 300, 400 sont "fils de" 1 (et/ou ont 1 pour parent).
    A la vue de la ligne 200;3999;4000, le nœud 200 existe déjà, on lui ajoute les fils 3999 et 4000.

    Chaque nœud a donc un parent et peut un ou plusieurs descendants.

    Après coder ça dépend de ce que vous connaissez côté Python: classes, listes, dictionnaires,...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Bonjour,

    Oui dans l'idée c'est ça, mes connaissances sont vastes et limitées en même temps. Je fais du dev mais python n'est clairement pas mon langage de prédilection, là je passe par jupyter notebook car il permet de traiter très rapidement des csv et de faire diverses graphs dont j'ai besoin.

    Là, dans l'idée, j'ai aussi besoin de ce graphe de hiérarchie car une fois qu'il sera ok, ça voudra aussi dire que mon dataframe/csv sera suffisament propre pour être utilisé dans de diverses cas

    Donc le dev pour y aller, à la rigueur, je peux m'en accommoder, là mon vrai problème à l'heure actuelle c'est, avec ce que j'ai, quel type de format de dataframe je dois viser

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par JeanYvette Voir le message
    Donc le dev pour y aller, à la rigueur, je peux m'en accommoder, là mon vrai problème à l'heure actuelle c'est, avec ce que j'ai, quel type de format de dataframe je dois viser
    Personnellement, je ne vois pas trop l'intérêt d'utiliser pandas ici: lire un fichier CSV, ligne à ligne pour insérer des informations dans un arbre...

    Ceci dit, comment utiliser pandas pour représenter une structure hiérarchique se trouve sur Internet mais pas facile d'aller trier pour vous ce qui pourrait répondre à vos besoins.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    J'utilise pandas ici simplement parce que je m'en sers pour tous les csv que j'ouvre dans le notebook car il y en a besoin, donc dans le but de rester tout le temps "pandas pour les csv", voila tout

    Après là je ne sais pas exactement où aller. Parce que si je rajoute une colonne avec la notion de "niveau", ca ne suffira pas. Est-ce qu'au lieu d'avoir un csv style :
    Code, 0, 1, 2, 3 ...

    Avoir
    Code, 0, rien ou niveau
    En ayant transformé les colonne 1 et plus en une nouvelle ligne dans la colonne 0 ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par JeanYvette Voir le message
    Après là je ne sais pas exactement où aller. Parce que si je rajoute une colonne avec la notion de "niveau", ca ne suffira pas. Est-ce qu'au lieu d'avoir un csv style :
    Code, 0, 1, 2, 3 ...
    Les informations à stocker dans chaque nœud/ligne de l'arbre dépendent de ce qu'on va en faire ensuite. Si on a besoin de descendre, les fils suffisent, pour remonter à la racine, le parent suffira. Tout dépendra des besoins.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Pour le coup mon but final serait de construire un diagramme de ce style :

    Nom : cible.PNG
Affichages : 72
Taille : 7,2 Ko

    Sachant que je peux avoir jusqu'à 200 enfants sur un Code données
    Mais quand je lis la doc qui donne accès à ce graphique, je n'arrive pas à voir à quoi mes données doivent ressembler pour y arriver. Dans le sens où dans la doc (lien ici : https://gist.github.com/psychemedia/...4e7a29d8621623 ) la notion d'héritage est simple car dans des colonnes différentes. Là où mois, une donnée de ma colonne 56, par exemple, pourrait se retrouver dans ma colonne CodeArticle (donc identifiante) créant donc un nouveau niveau dans mon arbre

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par JeanYvette Voir le message
    Dans le sens où dans la doc (lien ici : https://gist.github.com/psychemedia/...4e7a29d8621623 ) la notion d'héritage est simple car dans des colonnes différentes.
    Si vous voulez créer un arbre avec treelib à partir d'un fichier CSV, il faudrait peut être ouvrir la documentation de treelib et jouer avec pour apprendre à l'utiliser.
    Ajouter pandas là dedans ajoute des complications (une couche en plus à gérer dont on ne voit pas l'intérêt sinon lire le CSV qu'on peut faire autrement).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Oui j'ai regardé la doc, j'avais dans l'idée de créer des dataframes (ou tableau ou liste, qu'importe sur la théorie) avec par exemple :

    dfParents : Tous les "CodeArticle" où la donnée n'apparait jamais dans les les 200 colonnes de composants => Ca veut donc dire que ce sont des code Parents de niveau 0.
    df enfants de niveau 1 : Tous les codes qui sont dans les 200 colonnes associées au codearticle de dfParents. Rajouté à cela une colonne précisant du coup que parent=dfparents.codeArticle
    df enfants de niveau 2 : Tous les codes qui sont dans les 200 colonnes associées au codearticle de df enfants de niveau 1 et rajouté une colonne précisant du coup que parent = dfenfant2.codearticle
    et ainsi de suite

    Là par contre, je ne connais pas assez python pour savoir comment procéder. Dans le sens où, par exemple, comment dans python je peux voir que df[CodeArticle] n'existe pas dans df[0] ni quand df[1] .... ni dans df [200]. Là je ne sais pas. J'ai pensé à concaténer mes 200 champs composants, pour faire avec str.countains le problème c'est que je peux avoir un codeArticle style '099999' et un code différent '99999' donc le '99999' est "contains" dans '099999' donc là, ça foire à cause de la casse.

    Je sais globalement (en tout cas en théorie) comment voir l'idée, (enfin, si ce que j'ai énoncé plus haut est bon) mais par contre, là, je ne vois pas en python comment constituer mes dataframes de niveau

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par JeanYvette Voir le message
    Oui j'ai regardé la doc, j'avais dans l'idée de créer des dataframes (ou tableau ou liste, qu'importe sur la théorie) avec par exemple
    La documentation de treelib ne parle pas de dataframe (car il n'y en a pas besoin).

    On peut jouer avec et faire pas à pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    >>> from treelib import Tree
    >>> tree = Tree()
    >>> line = 1, 200, 300, 400
    >>> parent = line[0]
    >>> tree.create_node(parent, parent)
    Node(tag=1, identifier=1, data=None)
    >>> for z in line[1:]: tree.create_node(z, z, parent=parent)
    ...
    Node(tag=200, identifier=200, data=None)
    Node(tag=300, identifier=300, data=None)
    Node(tag=400, identifier=400, data=None)
    >>> line = 200, 3999, 4000
    >>> parent = line[0]
    >>> for z in line[1:]: tree.create_node(z, z, parent=parent)
    ...
    Node(tag=3999, identifier=3999, data=None)
    Node(tag=4000, identifier=4000, data=None)
    >>> tree.show()
    1
    ├── 200
    │   ├── 3999
    │   └── 4000
    ├── 300
    └── 400
     
    >>>
    Et pour faire ça lire le CSV ligne à ligne sans utiliser pandas suffit largement.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Un exemple qu'il faudra peut-être adapter à ton besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    from treelib import Tree
     
    # Ceci représente les lignes de ton csv
    content = [
        "1;200;300;400",
        "200;2000;2999",
        "300;3000;3999",
        "2000;20000",
        "2;500;600;700",
        "500;5000;5999",
        "5000;50000"
    ]
     
    # Ceci va crée un tableau de tableau de valeurs
    # [['1', '200, '300', '400'], ['200', '2000', '2999'], ...]
    data = [value.split(";") for value in content]
     
    tree = Tree()
     
    # Ceci crée la racine
    tree.create_node("0", "0")
     
    for line in data:
     
        parent = line[0]
     
        # Ceci car dans la structure 1 et 2 n'ont pas de parent
        # Donc on les ajoute à la racine si nécessaire
        if not tree.contains(parent):
            tree.create_node(parent, parent, parent="0")
     
        # Ceci va remplir le reste de l'arbre
        for value in line[1:]:
            tree.create_node(value, value, parent=parent)
     
     
    tree.show()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    0
    ├── 1
    │   ├── 200
    │   │   ├── 2000
    │   │   │   └── 20000
    │   │   └── 2999
    │   ├── 300
    │   │   ├── 3000
    │   │   └── 3999
    │   └── 400
    └── 2
        ├── 500
        │   ├── 5000
        │   │   └── 50000
        │   └── 5999
        ├── 600
        └── 700

  12. #12
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Ah oui, je vois où tu veux en venir, il va falloir que j'essaye cela. J'était parti sur quelque chose de totalement différents qui consistait à transformer mon csv en un tableau de deux colonnes avec parents|composants (ou du coup on avait autant de lignes parents que celui-ci a de composants) et un composant pouvait apparaitre dans parents montrant qu'il y avait un niveau en dessous. J'ai créé mon arbre avec les données de code parents qui n'apparaissent pas dans composants et leurs composants direct (me permettant d'avoir deux niveaux directement)
    Ensuite, je bouclais sur le reste de mes données et, si un composants avait son code parent associé dans l'arbre, alors je créé un nouveau noeud et je flag une colonne virtuelle. Je parcours mon tableau jusqu'à ce que toute les lignes de ma colonne virtuelle soient flaguées me permettant ainsi de gérer tous les niveaux.
    Mais j'ai eu plusieurs problème :
    Tout d'abord, un composant pouvant avoir plusieurs parents différent, treelib n'aime pas ça et j'ai donc rajouté un compteur du style : (lettreAlphabet compteurboucle) où lettre alphabet change pour chaque niveau de noeud et compteurboucle s'incrémente pour chaque création de nœud (ainsi, j'ai du (a0) (a1) (b0).. dans mes index)
    C'est pas dingo, mais à l'heure actuelle je n'ai pas trouvé d'alternative.
    La première partie, celle où je fais mon arbre avec tous les parents et leurs composants directs fonctionne très bien. La deuxième partie me semble rentrer dans une boucle soit infinie, soit beaucoup trop longue pour être acceptable...


    edit, j'avais un soucis dans mon code directement, là globalement tout est ok en passant par ce fonctionnement de double colonne et d'indice. Ca a mis en exergue un petit souci dans le nettoyage des données mais sinon c'est ok

    Merci pour le soutien en tout cas

    Bisous bisous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/11/2019, 19h06
  2. Pandas - DataFrame - Problème de resampling
    Par Gabriel_1234 dans le forum Général Python
    Réponses: 2
    Dernier message: 22/08/2019, 14h57
  3. [pandas] pandas.DataFrame : Comment ajouter une ligne ?
    Par Oblinky dans le forum Bibliothèques tierces
    Réponses: 2
    Dernier message: 23/07/2018, 09h52
  4. [Python 3.x] Pandas Dataframe selection
    Par thais781 dans le forum Général Python
    Réponses: 3
    Dernier message: 12/03/2018, 18h04
  5. Import .txt vers Panda Dataframe, problème header
    Par pwetzou dans le forum Général Python
    Réponses: 12
    Dernier message: 03/02/2017, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo