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

Python Discussion :

Comment faire pour réaliser un équivalent de "RechercheV" avec Pyhton


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Comment faire pour réaliser un équivalent de "RechercheV" avec Pyhton
    Bonjour,
    je dois faire des extractions de valeurs d'un fichier (cf pièce jointe) pour en faire ensuite des calculs.
    dans mon cas je dois extraire toutes les valeurs de diamètre et de température pour la position 0, puis 0.5 ... (ces valeurs ne sont pas figées, elle varient suivant ce que je mesure) à chacune des rotations (ici la liste de valeurs de rotation est a priori figée).
    ensuite je dois convertir les valeurs de daimètres de 20°C à la température T du fichier suivant un coefficient de dilatation et enfin, pour toutes les positions 0 existantes, je dois faire la moyenne des valeurs de diamètres... Suis-je claire ou c'est du charabia

    Test.txt

    j'ai commencé par extraire de mon fichier les différentes listes
    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
    Extraction du fichier .csv et mise en forme de la liste
     
    def extractioncsv(fichiercsv):
        Rotationcsv = []  # Extraction des valeurs de la protation
        Positioncsv = []  # Extraction des valeurs de la position des diamètres
        VALmincsv = []  # Extraction des valeurs du diamètre min
        VALmaxcsv = [] # Extraction des valeurs du diamètre max
        VALmediancsv = [] # Extraction des valeurs du diamètre médian
        Tcsv = []  # Extraction des valeurs de la température de la mesure du diamètre
     
        with open(fichiercsv, 'rb') as fcsv:
            lecteur = csv.reader(fcsv, delimiter=';')
            for ligne in lecteur:
                Rotationcsv.append(ligne[0])
                Positioncsv.append(ligne[1])
                VALmincsv.append(ligne[2])
                VALmaxcsv.append(ligne[3])
                VALmediancsv.append(ligne[4])
                Tcsv.append(ligne[5])
            del Rotationcsv[0:1], Positioncsv[0:1], VALmediancsv[0:1], Tcsv[0:1]
     
        return Rotationcsv, Positioncsv, VALmincsv, VALmediancsv, VALmaxcsvv, Tcsv
    je ne mets pas le code intermédiaire

    et de là je me dis que je dois créer une nouvelle liste genre bataille navale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for nz in range(0,len(VALmediancsv)) :
        NewDiam = VALmediancsv[nz]*(1+CoefDilatation*(Tcsv[nz]-20)] #conversion du diamètre à la température T
    et là je bloque...comment je peux lui dire que pour toutes les valeurs de position identique, je dois extraire les valeurs de NewDiam et en faire la moyenne.

    Vous m'avez comprise, je sais faire un calcul de moyenne... mais je ne sais pas extraire les valeurs

    je vous remercie pour votre aide.

    Cdlt

    Patricia

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    pour toutes les positions 0 existantes, je dois faire la moyenne des valeurs de diamètres
    Les positions sont celles enregistrées dans la liste Positioncsv ?

    Si oui, tu peux directement itérer sur cette liste. mais il faudra que tu stockes tes diamètres calculés dans une liste aussi, à moins que tu aies prévu autre chose.

    Un truc dans ce genre là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    newdiams = []
    for idx, value in enumerate(Positioncsv):
        if not value:
            newdiams.append(VALmediancsv[idx]*(1+CoefDilatation*(Tcsv[idx]-20)))
        else:
            newdiams.append(None)
    Une remarque au passage, dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        NewDiam = VALmediancsv[nz]*(1+CoefDilatation*(Tcsv[nz]-20)]
    le dernier crochet devrait être une parenthèse.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Merci VinsS !
    Oui tu as bien compris, c'est bien la liste que l'on voit Je me doutais de la fonction Enumerate, mais je ne voyais pas comment faire pour reprendre cet indice... oh là là... je ne suis pas prête d'être une pro de la programmation
    je teste et je te dis

    Merci encore

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Bon... ben c'est pas ça
    En fait je voudrais extraire pour chaque valeur de rotation, les valeurs des diamètres à une position donnée.
    plus clairement, d'après le fichier texte que je vous ai fourni, j'aimerai avoir plusieurs listes (1 par position) de la valeur du diamètre pour chaque rotation :
    Position = 0 :
    • Rotation = 0, mediane, température
      Rotation = 18, mediane, température
      Rotation = 36, mediane, température
      ...
      Rotation = 180, mediane, température

    Position = 0,5 :
    • Rotation = 0, mediane, température
      Rotation = 18, mediane, température
      Rotation = 36, mediane, température
      ...
      Rotation = 180, mediane, température

    Position = 1 :
    • Rotation = 0, mediane, température
      Rotation = 18, mediane, température
      Rotation = 36, mediane, température
      ...
      Rotation = 180, mediane, température

    ....

    Position = dernière (dans ce cas 102,5 mais ça varie à chaque fois):
    • Rotation = 0, mediane, température
      Rotation = 18, mediane, température
      Rotation = 36, mediane, température
      ...
      Rotation = 162, mediane, température


    Pour chacune de ces listes, faire le calcul pour chaque de la médiane en fonction de la température, puis en déduire la moyenne

    Je sais pertinemment que ce serait plus simple de changer la forme du fichier d'entrée... mais ça ne dépend pas que de moi

    Merci encore pour votre aide.

    Patricia

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    Tu peux utiliser un defaultdict de listes. Avec les positions en clef. Une façon de commencer :
    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import csv
    from collections import defaultdict
     
    def read_data(filename):
        data = list()
        with open(filename, 'r') as fobj:
            reader = csv.reader(fobj, dialect=csv.excel_tab)
            next(reader, None)
            for rota, posi, med, temp in reader:
                data.append((int(rota), float(posi), float(med), float(temp)))
        return data
     
    def group_by_column_values(data, idx):
        res = defaultdict(list)
        for items in data:
            res[items[idx]].append(items[:idx] + items[idx:])
        return res
     
     
    def main():
        data = read_data("Test.txt")
        d = group_by_column_values(data, 1)
     
    if __name__ == '__main__':
        main()
    Edit : correction erreur sur idx + fusion des fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import csv
    from collections import defaultdict
     
    def read_data(filename, idx=1):
        types = [int] + [float] * 3
        res = defaultdict(list)
        with open(filename, 'r') as fobj:
            reader = csv.reader(fobj, dialect=csv.excel_tab)
            next(reader, None)
            for items in reader:
                l = [f(x) for f, x in zip(types, items)]
                res[l[idx]].append(l[:idx] + l[idx + 1:])
        return res

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut je vais essayer
    Merci, mais je ne connais pas defaultdict donc je vais chercher avant de m'y aventurer.

    Pour l'instant j'ai essayé ça (je sais c'est pas très propre )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ListeMedian = []
    ListeTemp = []
    NbRot = 11
    NbPos = len(PositionDECC)/NbRot
     
    for Pos in range(0, NbPos):
        ListeMedian.append(medianDECC[Pos])
        ListeTemp.append(TempDECC[Pos])
        for Rot in range(0, NbRot):
            ListeMedian.append(medianDECC[Pos+NbPos+Rot])
            ListeTemp.append(TempDECC[Pos+NbPos+Rot])
        print "valeur des diamètres",ListeMedian
        ListeMedian = []
        ListeTemp = []
    ça fait presque ce que je veux, mais j'aurai aimé que pour chaque boucle Pos, les 2 listes aient un nom différent en fonction de la position, genre ListeMedian[Pos] et que ça se fasse tout seul, sans que j'ai besoin de vider la liste pour faire les calculs.

    Merci encore

    Patricia

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Bon, il y avait une petite erreur
    dans mon calcul d'indice, et j'ai trouvé ça :

    http://www.developpez.net/forums/d32...om-d-variable/

    donc en l'applicant à mon cas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for Pos in range(0, NbPos):
        for Rot in range(0, NbRot):
            exec("ListeMedian"+str(Pos)+"='"+medianDECC[Pos+NbPos*Rot]+"'")
    mais ça me retourne l'erreur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        exec("ListeMedian"+str(Pos)+"='"+medianDECC[Pos+NbPos*Rot]+"'")
    TypeError: cannot concatenate 'str' and 'float' objects
    avez-vous une idée du problème ?

    Merci pour votre aide

    Patricia

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bourgui78 Voir le message
    dans mon calcul d'indice, et j'ai trouvé ça :

    http://www.developpez.net/forums/d32...om-d-variable/

    donc en l'applicant à mon cas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for Pos in range(0, NbPos):
        for Rot in range(0, NbRot):
            exec("ListeMedian"+str(Pos)+"='"+medianDECC[Pos+NbPos*Rot]+"'")
    mais ça me retourne l'erreur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        exec("ListeMedian"+str(Pos)+"='"+medianDECC[Pos+NbPos*Rot]+"'")
    TypeError: cannot concatenate 'str' and 'float' objects
    avez-vous une idée du problème ?

    Merci pour votre aide

    Patricia
    Bonjour,

    "... et ils souffraient des maux indicibles ne voyant rien venir et puis, ce jour-là, il y eut..." str().format()

    https://docs.python.org/3/library/st...tml#str.format

    Et depuis ce jour, ils vécurent heureux et tout et tout.

    @+.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut Super merci !
    Maintenant j'ai le nom de ma liste variable....
    mais comment je peux utiliser la fonction append ?


    y a pas à dire je galère avec Python

    Patricia

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bourgui78 Voir le message
    Maintenant j'ai le nom de ma liste variable....
    mais comment je peux utiliser la fonction append ?


    y a pas à dire je galère avec Python

    Patricia
    Avez-vous seulement pris le temps de lire le début de l'histoire avant d'aller chercher vos rames pour la Réale ?

    https://docs.python.org/3/library/index.html

    @+.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 125
    Points : 55
    Points
    55
    Par défaut ne comprenant pas comment faire...
    Et pourtant j'ai lu !
    je me suis résolue à faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DECCcsv = extractioncsv(fileDECC)
    v = array(DECCcsv)
     
    for i in range(0, NbPos):
        for j in range(0, NbRot):
            t = v[-1, i+NbPos*j]
            DECC = v[-3, i+NbPos*j]
            DECC23 = float(DECC)*(1+CoefDil*(float(t)-20))
            ListeDECC23.append(DECC23)
    Pour les puristes, ça ne plaira pas, mais au moins ça fait ce que je veux.

    Merci encore

    Patricia

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/03/2013, 09h20
  2. Réponses: 1
    Dernier message: 10/06/2007, 07h22
  3. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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