Partage
  • Partager sur Facebook
  • Partager sur Twitter

Générer un graphique à partir d'un csv

Sujet résolu
    20 mars 2011 à 6:57:41

    Bonjour à tous,

    Je travaille avec quelques amis sur un projet au lycée où nous devons, entre autre, générer un graphique à partir des températures.
    Quelques amis l'avaient fait en AutoIT et PHP, mais l'une des personnes qui s'occupe du réseau du lycée préféreraient que ce soit fait en Python.

    J'ai donc essayé de faire ce "générateur de graphique", mais je suis un vrai débutant en Python (je viens tout juste de finir le chapitre sur les listes).

    Je vous mets ci-dessous les premières lignes du fichier .csv (les milliers de lignes seraient inutiles je pense) suivit du script python auquel je suis arrivé.
    Je vous exposerais ensuite les problèmes que j'ai.

    Vendor,GRAPHTEC Corporation
    Model,GL200A
    Version,Ver2.04
    Sampling,200ms
    Total data points,13898
    Start time,2010-11-29,10:28:32
    End time,2010-11-29,11:14:52
    Trigger time,2010-11-29,10:28:33
    AMP Settings
    CH,Signal name,Input,Range,Filter,Span
    CH1, "",DC,50V,Off,25.000000,-25.000000,V
    CH2, "",DC,50V,Off,25.000000,-25.000000,V
    CH3, "",DC,50V,Off,25.000000,-25.000000,V
    CH4, "",DC,50V,Off,25.000000,-25.000000,V
    CH5, "",DC,50V,Off,25.000000,-25.000000,V
    CH6, "",DC,50V,Off,25.000000,-25.000000,V
    CH7, "",DC,50V,Off,25.000000,-25.000000,V
    CH8, "",DC,50V,Off,25.000000,-25.000000,V
    CH9, "",DC,50V,Off,25.000000,-25.000000,V
    CH10, "",DC,50V,Off,25.000000,-25.000000,V
    Logic/Pulse,OFF
    Data
    Number,Date&Time,ms,CH1,CH2,CH3,CH4,CH5,CH6,CH7,CH8,CH9,CH10,Alarm
    NO.,Time,ms,V,V,V,V,V,V,V,V,V,V,A1234567890PL
    1 ,2010-11-29 10:28:33,311, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    2 ,2010-11-29 10:28:33,511, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    3 ,2010-11-29 10:28:33,711, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    4 ,2010-11-29 10:28:33,911, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    5 ,2010-11-29 10:28:34,111, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    6 ,2010-11-29 10:28:34,311, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    7 ,2010-11-29 10:28:34,511, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    8 ,2010-11-29 10:28:34,711, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    9 ,2010-11-29 10:28:34,911, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    10 ,2010-11-29 10:28:35,111, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, -0.01,LLLLLLLLLLLL
    11 ,2010-11-29 10:28:35,311, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    12 ,2010-11-29 10:28:35,511, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    13 ,2010-11-29 10:28:35,711, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    14 ,2010-11-29 10:28:35,911, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    15 ,2010-11-29 10:28:36,111, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    16 ,2010-11-29 10:28:36,311, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    17 ,2010-11-29 10:28:36,511, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, -0.01, -0.01, +0.00, +0.00,LLLLLLLLLLLL
    18 ,2010-11-29 10:28:36,711, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    19 ,2010-11-29 10:28:36,911, -0.01, -0.01, -0.01, +0.00, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    20 ,2010-11-29 10:28:37,111, -0.01, -0.01, -0.01, -0.01, +0.00, -0.01, -0.01, +0.00, +0.00, +0.00,LLLLLLLLLLLL
    21 ,2010-11-29 10:28:37,311, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, -0.01, -0.01, +0.00, -0.01,LLLLLLLLLLLL
    22 ,2010-11-29 10:28:37,511, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, -0.01, -0.01, +0.00, +0.00,LLLLLLLLLLLL
    23 ,2010-11-29 10:28:37,711, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, -0.01, -0.01, -0.01, +0.00,LLLLLLLLLLLL
    24 ,2010-11-29 10:28:37,911, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, -0.01, -0.01, +0.00,LLLLLLLLLLLL
    25 ,2010-11-29 10:28:38,111, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, -0.01, -0.01, +0.00,LLLLLLLLLLLL
    26 ,2010-11-29 10:28:38,311, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, -0.01, -0.01, -0.01, +0.00,LLLLLLLLLLLL
    27 ,2010-11-29 10:28:38,511, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, -0.01, -0.01, +0.00,LLLLLLLLLLLL
    28 ,2010-11-29 10:28:38,711, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, -0.01, +0.00,LLLLLLLLLLLL
    29 ,2010-11-29 10:28:38,911, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, -0.01, +0.00, -0.01, +0.00,LLLLLLLLLLLL
    30 ,2010-11-29 10:28:39,111, -0.01, -0.01, -0.01, -0.01, +0.00, +0.00, +0.00, +0.00, -0.01, +0.00,LLLLLLLLLLLL


    Et voici mon script Python :

    #!/usr/bin/python2.7
    # -*-coding:utf-8 -*
    
    import os
    import time
    import numpy 
    import csv
    from pylab import *
    import dateutil
    
    #Variable qui enregistre la date de modification du fichier CSV
    lastmodif=0
    
    #Démon qui tourne en boucle infini
    while 1:
        if os.stat("/home/pheel/data.csv").st_mtime != lastmodif:   #Si modification du fichier
            
            fichier = csv.reader(open("data.csv","r"), delimiter=",") #Tranfert contenue du csv dans fichier
            abscisses=[]
            ordonnees1=[]
            ordonnees2=[]
            ordonnees3=[]
            ordonnees4=[]
    
    #Importe les variables utiles dans les listes.
            for ligne in fichier:
                abscisses.append(ligne[1])
                ordonnees1.append(float(ligne[3]))
                ordonnees2.append(float(ligne[4]))
                ordonnees3.append(float(ligne[5]))
                ordonnees4.append(float(ligne[6]))
    
    #Formatage de la date pour être utilisé par plot_date
            dates = [dateutil.parser.parse(s) for s in abscisses]
    
    #Transfert dans un tableau numpy (plus rapide à traiter?)        
            n_dates=numpy.array(dates)
    	n_ordonnees1=numpy.array(ordonnees1)
    	n_ordonnees2=numpy.array(ordonnees2)
    	n_ordonnees3=numpy.array(ordonnees3)
    	n_ordonnees4=numpy.array(ordonnees4)
    
    #Tracé des courbes 
    
            g1=plot_date(n_dates, (n_ordonnees1)*18, 'r' , ls=':', tz='none', xdate=True, ydate=False)
            g2=plot_date(n_dates, (n_ordonnees2)*18, 'g' , ls=':', tz='none', xdate=True, ydate=False)
            g3=plot_date(n_dates, (n_ordonnees3)*18, 'b' , ls=':', tz='none', xdate=True, ydate=False)
            g4=plot_date(n_dates, (n_ordonnees4)*18, 'y' , ls=':', tz='none', xdate=True, ydate=False)
    
    #Création des titres et légends        
    
            plt.title('Releve des temperatures')
            plt.legend([g1, g2, g3, g4],['Temperature Capteur1','Temperature Capteur2','Temperature Capteur3','Temperature Capteur4'], loc='best') 
            plt.xlabel('Date')
    	plt.ylabel('Temperatures')
    
            plt.xticks(rotation='vertical')#On verticalise les dates pour la lisibilité
            plt.subplots_adjust(bottom=0.3)
            plt.savefig('temperature.png', dpi=100)
            lastmodif=os.stat("/home/pheel/data.csv").st_mtime
        
        time.sleep(1) #On marque une attente de x secs avant de recommencer
    


    Et aussi une image générée à partir du ficher .csv de test :

    Image utilisateur


    Voici pourquoi j'ai besoin de votre aide :


    1) Comme vous le voyez, les 23 premières lignes du .csv ne sont pas dans le même formant, ce qui bloquait mon script. Pour mes tests j'ai donc du supprimer ces lignes à la mains. Je pense que je peux continuer comme cela, mais si vous avez une manière plus élégante de faire, merci de bien vouloir la proposer.

    2) Quelque soit le paramètre que j'essaie, ma légende masque toujours une partie de mon graphique (voir image). Comment puis-je y remédier ?

    3) Le fichier de test a pour le moment une précision de 1 mesure toute les 0,2 secondes. La précision minimale du "grapheur" est de 1 mesure par secondes, mais notre "cahier des charges" nous impose un points toutes les 10 ou 15 minutes.
    Comment faire pour traiter uniquement une ligne sur 600 (ou 900) du fichier .csv ?

    Merci d'avance pour votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      20 mars 2011 à 10:13:58

      2/ Quoi que tu fasses, la légende sera "dans" le graphique.

      Visiblement, le plus important sont les "dernières" valeurs. À ce moment là, 2 solutions :
      Soit tu n'affiches pas la légende,
      Soit tu changes les noms de "Température Capteur n" en quelque-chose de plus concis (comme "T1", "T2", etc), et tu colles la légende en haut ou en bas à gauche.

      3/ N'as-tu pas moyen de paramétrer la création du fichier csv de manière à ce que les mesures s'effectuent toutes les 15 minutes ? L'idée d'avoir un énorme fichier csv dont tu n'utilises qu'une ligne sur 600 est plutôt déplaisante niveau utilisation du disque dur...
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        20 mars 2011 à 10:56:21

        Merci NoHaR.
        Et d'avance, excuse moi de ma stupidité (passagère, je l'espère).

        2)

        Puisque je ne peux pas mettre la légende hors du graphique, je pense que je vais la mettre en bas à gauche.
        C'est l'endroit où elle sera le mieux placé puisque la température ne sera pas inférieur à la température ambiante.
        Et là où je suis, surtout en ce moment, ça n'ira pas en dessous de 25°C.

        3) Eh bien en fait, je suis en vacances donc je n'avais pas l'appareil de mesure sous les yeux. La page du site montrait un tableau avec une précision minimale de 1 mesure pas seconde et je m'y suis bêtement fier. :D
        En réalité, après avoir télécharger le manuelle en anglais, il est possible de faire 1 mesure toute les 15 minutes. :euh:
        Toutes mes excuses.

        Une petite question toute de même :
        Est-il possible répartir la légende sur deux colonnes ?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          20 mars 2011 à 11:15:45

          En ce qui concerne tes 23 premières lignes, on remarque que tes mesures sont numérotées, mais pas tes 23 premières lignes, je jouerais là-dessus pour filtrer et non les supprimer.

          Si ligne commence par un nombre
              traiter ligne


          Ton programme zappera les 23 premières sans modifier ton fichier, qui aura peut-être des données importantes à consulter.

          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2011 à 13:44:08

            Merci fred1599
            Avec ta réponse et quelques recherches j'en suis arrivé à cette condition :

            for ligne in fichier:
                if ligne[0].strip().isdigit() is True:
                    #On traite la ligne
            


            Cela fonctionne parfaitement!

            La position de la légende, en bas au centre du graphique à présent, ne devrait pas poser trop de problème.

            Je crois que je peux donc passer en résolu!

            Encore merci à vous!
            • Partager sur Facebook
            • Partager sur Twitter

            Générer un graphique à partir d'un csv

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown