Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/05/2007, à 19:16

Rodriguez

Créer des graphes à partir de stats

Salut,

je suis actuellement en stage dans une entreprise qui me demande de générer des graphes à partir de stats qui sont produites par elle.
Actuellement, pour générer les graphes, l'entreprise fait ceci :
-exporte les données au format CSV
-puis convertit ces données au format excel
-genere les graphes
Toutes ça est fait en cliquant, donnant le fichier csv , ...

L'entreprise me demande de faire en sorte qu'ait est le moins de clic à faire c'est à dire générer les graphes directement (si possible)...
Je dois faire ça sous un environnement Windows.
Les questions que je me pose c'est :
-en quel langage faire ça ?
-comment m'y prendre ?

PS : si vous avez aussi des liens qui m'aideraient dans ce que je dois faire, je suis preneur.

Merci

Hors ligne

#2 Le 02/05/2007, à 19:54

obiwankennedy

Re : Créer des graphes à partir de stats

Java avec la libriairie JfreeChart et peut etre une export en PDF si tu veux avec JText.

Moi j'utiliserais ça.


Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam

Hors ligne

#3 Le 02/05/2007, à 21:00

Rodriguez

Re : Créer des graphes à partir de stats

obiwankennedy a écrit :

Java avec la libriairie JfreeChart et peut etre une export en PDF si tu veux avec JText.

Moi j'utiliserais ça.

Salut,

ça m'a l'air d'être pas mal ...
Est-ce que tu aurais un lien à m'indiquer pour que je comprenne bien comment ça marche car sur le net, je ne trouve pas gros tutos ou de cours sur cette librairie.

J'ai une question :
Les données, pour générées les graphes avec cette bibliotheques, doivent être indiquées de quelles manières ?

Merci

Hors ligne

#4 Le 02/05/2007, à 21:29

obiwankennedy

Re : Créer des graphes à partir de stats

hélas la libriairie est libre mais le manuel d'utilisation est payant. Tu peux te débrouillé pour le trouver ailleur... (si tu vois ce que je veux dire) sinon moi j'ai réalisé des camemberts effet 3D assez facilement.
Enfin tu as la documentation des classes et tout sur le site officiel mais aucun (ou peu et bien caché) code d'exemple ce n'est pas super pratique.
la doc des classes:http://www.jfree.org/jfreechart/api/gjdoc/index.html

le site officiel: http://www.jfree.org/jfreechart/

un tutorial :
http://labo-sun.com/resource-fr-article … n-java.htm

j'ai un logiciel de gestion de cd/DVD qui utilise cette libriairie. Si tu veux que je te donne le code que tu puisses l'étudier. Tu verras que c'est pas sorcier.

Dernière modification par obiwankennedy (Le 03/05/2007, à 09:54)


Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam

Hors ligne

#5 Le 02/05/2007, à 23:13

Rodriguez

Re : Créer des graphes à partir de stats

obiwankennedy a écrit :

hélas la libriairie est libre mais le manuel d'utilisation est payant. Tu peux te débrouillé pour le trouver ailleur... (si tu vois ce que je veux dire) sinon moi j'ai réalisé des camemberts effet 3D assez facilement.
Enfin tu as la documentation des classes et tout sur le site officiel mais aucun (ou peu et bien caché) code d'exemple ce n'est pas super pratique.
la doc des classes:http://www.jfree.org/jfreechart/api/gjdoc/index.html

le site officiel: http://www.jfree.org/jfreechart/

un tutorial :
http://labo-sun.com/resource-fr-article … n-java.htm

j'ai un logiciel de gestion de cd/DVD qui utilise cette libriairie. Si tu veux que je te donne le code que tu puisse m'étudier tu verras que c'est pas sorcier.

Je veux bien merci.

Hors ligne

#6 Le 03/05/2007, à 10:54

Rodriguez

Re : Créer des graphes à partir de stats

Je voudrais aussi savoir comment faire pour la récupération des données car il proviennent d'un serveur pour ensuite créer les graphes.
Je souhaiterais avoir à éviter de faire à la main, les ajouts comme par exemple

dataset.addValue(5.0, "series2", "category1");

Hors ligne

#7 Le 03/05/2007, à 11:35

Desintegr

Re : Créer des graphes à partir de stats

Il existe aussi Artichow qui est très complet, en PHP.

http://www.artichow.org/


Hoc Volo, Sic Jubeo !
Mon wiki : http://desintegr.free.fr

Hors ligne

#8 Le 03/05/2007, à 13:09

obiwankennedy

Re : Créer des graphes à partir de stats

voilà, le code de la classe qui affiche une fenetre java avec une liste de camembert representant l'état de ma collection de cd/dvd

sinon pour ta 2eme question je te conseille de regarder du coté socket client.


/*! \class  Stastistique 
 * \brief Classe héritant JFrame implémenté qui affiche des diagrammes
 * \author GUEZENNEC Renaud
 * \version 1.0
 * \date 5/10/2006
 * \bug nil
 * \warning nil 
 * \todo ajouter un bouton fermer un bouton export pdf avec appel de selecteur de fichier, ajouter aussi un diagramme par catégorie de films 
 */
import java.awt.Graphics2D;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.*;
import javax.swing.border.TitledBorder;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.DefaultFontMapper;
import com.lowagie.text.pdf.FontMapper;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import org.jfree.chart.*;
import org.jfree.data.general.DefaultPieDataset;



public class Stastistique extends JFrame implements Effect3D, ActionListener{


  /*!<  Attribut de la class Stastistique.java, */
	 
private static final long serialVersionUID = 3786673332388689985L;
private GridBagConstraints placement;
private divxotheque ma_divxotheque;
Vector<CDDVD> monvector;
private Vector<valeur> mesStatvectorpresence;
private Hashtable<Integer,Integer> mahashtable;
private Hashtable<Integer, Cdisponibilite> lesdispo;
private Hashtable<Integer, String> mescategories;
CMoninterface moninterface;
private int compteurdispo=0;
private JFreeChart repart;
private JFreeChart pieChart2;
private JFreeChart pieChart;
private FontMapper a;
private Hashtable<Integer, Integer> hashtable_cate;
private int compteurmedia;
private JFreeChart catrepart;
private JPanel infodiverse;
private JLabel labalnb_de_CDDVD;
private JTextField nb_de_CDDVD;
private JLabel labelnb_de_media;
private JTextField nb_de_media;

public Stastistique(divxotheque ma_divxotheque, CMoninterface moninterface)
	  {
	 		super(); 
	 		setTitle("Statistique");
	 		this.ma_divxotheque=ma_divxotheque;
	 		this.moninterface=moninterface;
	 		monvector=this.ma_divxotheque.get_vector();
	 		lesdispo=this.ma_divxotheque.getMesdispo();
	 		mescategories=this.ma_divxotheque.getHcategorie();
	 		setResizable(true);
	 		setSize(700,500);
	 		JPanel monPanneau = new JPanel(new GridBagLayout());
	 		placement = new GridBagConstraints();
	 		mesStatvectorpresence = new Vector<valeur>();
	 		calculStat();
	 		FaireGraph(monPanneau);
	 		
	 		JScrollPane mes_scrollbar = new JScrollPane(monPanneau);
	 		getContentPane().add(mes_scrollbar);
	 		
		}

	  public void FaireGraph(JPanel pnlGraph)
	  {
			placement.gridwidth=2;
			placement.gridheight=1;
			placement.weighty=1.0;
			placement.weightx=1.0;
			placement.gridx = 0;
			placement.gridy = 0;
////////////Diverses Informations/////////////////////////////
	        infodiverse = new JPanel(new GridBagLayout() );
	        GridBagConstraints diversplacement = new GridBagConstraints();
	        infodiverse.setBorder(new TitledBorder("Informations Diverses"));
	        
		        diversplacement.gridwidth=1;
		        diversplacement.gridheight=1;
		        
		        diversplacement.weighty=1.0;
		        diversplacement.weightx=1.0;
		        
		        diversplacement.gridx = 0;
		        diversplacement.gridy = 0;
	        
	        
	        labalnb_de_CDDVD = new JLabel("Nombre de CDDVD : ");
	        nb_de_CDDVD = new JTextField();
	        nb_de_CDDVD.setEditable(false);
	        nb_de_CDDVD.setText(new Integer(monvector.size()).toString());
	        
	        
	        
	        infodiverse.add(labalnb_de_CDDVD,diversplacement);
	        
	        diversplacement.gridx = 1;
	        infodiverse.add(nb_de_CDDVD,diversplacement);
	        
	        
	        
	        
	        labelnb_de_media = new JLabel("Nombre de media : ");
	        nb_de_media = new JTextField();
	        nb_de_media.setEditable(false);
	        
	        diversplacement.gridy++;
	        diversplacement.gridx = 0;
	        nb_de_media.setText(new Integer(compteurmedia).toString());
	        infodiverse.add(labelnb_de_media,diversplacement);
	        diversplacement.gridx = 1;
	        
	        infodiverse.add(nb_de_media,diversplacement);
	        placement.gridx = 0;
	        placement.fill = GridBagConstraints.HORIZONTAL;
	        pnlGraph.add(infodiverse,placement);
	        placement.fill = GridBagConstraints.NONE;
			
			//ensemble de données  sur les supports présents et absents./////////////
	        DefaultPieDataset pieDataset = new DefaultPieDataset();
	        for(int i=0;i<mesStatvectorpresence.size();i++)
	        	pieDataset.setValue(mesStatvectorpresence.elementAt(i).getLegende()+": "+Float.valueOf(mesStatvectorpresence.elementAt(i).getPourcentage())+"%", mesStatvectorpresence.elementAt(i).getPourcentage());
	        

	        pieChart = ChartFactory.createPieChart3D("Disponibilité des Supports",pieDataset, true, true, true);
	        ChartPanel cPanel = new ChartPanel(pieChart);
	        
	        placement.gridy++;
	        pnlGraph.add(cPanel,placement);
	       
///////////////////////ensemble de données sur le pourcentage des personnes qui ont des supports///////
	        DefaultPieDataset pieDataset2 = new DefaultPieDataset();
	        
	        Enumeration<Integer> enu = mahashtable.elements();
	        Enumeration<Cdisponibilite> enu2 = lesdispo.elements();
	        Integer temp;
	        Cdisponibilite tempdispo;
	        Float calcul;
			while((enu.hasMoreElements())&&(enu2.hasMoreElements()))	//init des boutons avec leurs nouvelles significations
			{
				temp=enu.nextElement();
				tempdispo=enu2.nextElement();
				calcul= new Float((float)temp*100/(monvector.size()-compteurdispo));
				if(calcul.toString().length()>=5)
					pieDataset2.setValue(tempdispo.getPrenom()+" "+tempdispo.getNom()+": "+calcul.toString().substring(0,5)+"%", Float.valueOf(calcul.toString().substring(0,5)));
				else
					pieDataset2.setValue(tempdispo.getPrenom()+" "+tempdispo.getNom()+": "+calcul.toString()+"%", Float.valueOf(calcul.toString()));
			}
	        
	        

	        pieChart2 = ChartFactory.createPieChart3D("Indisponibilité par personne",pieDataset2, true, true, true);
	        ChartPanel cPanel2 = new ChartPanel(pieChart2);
	        placement.gridy++;
	        pnlGraph.add(cPanel2,placement);
	       /////////////////////////////ensemble des données présent + les absent avec les diverses personnes////
	      
	        DefaultPieDataset union = new DefaultPieDataset();
	      
	        enu = mahashtable.elements();
	        enu2 = lesdispo.elements();
	        while((enu.hasMoreElements())&&(enu2.hasMoreElements()))	//init des boutons avec leurs nouvelles significations
			{
				temp=enu.nextElement();
				
				tempdispo=enu2.nextElement();
				calcul= new Float((float)temp*100/monvector.size());
				if(calcul.toString().length()>=5)
					union.setValue(tempdispo.getPrenom()+" "+tempdispo.getNom()+": "+calcul.toString().substring(0,5)+"%", Float.valueOf(calcul.toString().substring(0,5)));
				else
					union.setValue(tempdispo.getPrenom()+" "+tempdispo.getNom()+": "+calcul.toString()+"%", Float.valueOf(calcul.toString()));
			}
	        union.setValue(mesStatvectorpresence.elementAt(1).getLegende()+": "+mesStatvectorpresence.elementAt(1).getPourcentage()+"%", new Double(mesStatvectorpresence.elementAt(1).getPourcentage()));
	        repart = ChartFactory.createPieChart3D("Répartition par personne",union, true, true, true);
	        ChartPanel crepart = new ChartPanel(repart);
	        placement.gridy++;
	        pnlGraph.add(crepart,placement);
	        ////////////par catégorie/////////////////////////////
	   
	        DefaultPieDataset parcategorie = new DefaultPieDataset();
	        Enumeration<String> monenu;
	        Enumeration<Integer> monenuint;
	        monenu = mescategories.elements();
	        monenuint = hashtable_cate.elements();
	        String tmpcat;
	        while((monenuint.hasMoreElements())&&(monenu.hasMoreElements()))	//init des boutons avec leurs nouvelles significations
			{
	        	 tmpcat=monenu.nextElement();
				
				temp=monenuint.nextElement();
				calcul= new Float((float)temp*100/compteurmedia);
				if(calcul.toString().length()>6)
					parcategorie.setValue(tmpcat+": "+calcul.toString().substring(0,5)+"%", Float.valueOf(calcul.toString().substring(0,5)));
				else
					parcategorie.setValue(tmpcat+": "+calcul.toString()+"%", Float.valueOf(calcul));
			}
	        
	        catrepart = ChartFactory.createPieChart3D("Répartition des medias par Categorie",parcategorie, true, true, true);
	        ChartPanel ccaterepart = new ChartPanel(catrepart);
	        placement.gridy++;
	        pnlGraph.add(ccaterepart,placement);
	        
	        
	        
	        
	        
	       
	        
	               
	        
	        ///////////////bouton //////////////////////////////
	        placement.gridx = 1;
	        placement.gridwidth=1;
	        placement.gridheight=1;
	        Actionmenu ok = new Actionmenu("OK",null);
	        JButton Bok = new JButton(ok);
	        //placement.gridheight=2;
	        //placement.gridwidth=2;
	        Bok.addActionListener(this);
	        placement.gridy++;
	        placement.gridx = 0;
	        pnlGraph.add(Bok,placement);
	        
	        Actionmenu exportPDF = new Actionmenu("Exportation PDF",null);
	        JButton BexportPDF = new JButton(exportPDF);
	        
	        BexportPDF.addActionListener(this);
	        placement.gridx = 1;
	        pnlGraph.add(BexportPDF,placement);
	        
	        
	  }

	public double getXOffset() {
		
		return 10;
	}

	public double getYOffset() {
		
		return 10;
	}
	public void calculStat()
	{
		
		mahashtable=new Hashtable<Integer, Integer>();
		hashtable_cate=new Hashtable<Integer, Integer>();
		Enumeration<Cdisponibilite> enu = lesdispo.elements();
		Vector<Cdisponibilite> trieur = new Vector<Cdisponibilite>();
		while(enu.hasMoreElements())	
			trieur.addElement(enu.nextElement());
			
		trieur.removeElementAt(trieur.size()-1);
		
		for(int k=trieur.size()-1;k>=0;--k)
			mahashtable.put(new Integer(trieur.elementAt(k).getId()), new Integer(0));	
			
			
		
		Enumeration<String> strincate = mescategories.elements();
		int temp= 1;
		//System.out.println(mescategories.size());
		while(strincate.hasMoreElements())
		{			
			hashtable_cate.put(new Integer(temp), new Integer(0));
			strincate.nextElement();
			temp++;
		}
		
		strincate=null;
		Integer a;
		Integer b;
		for(int i=0;i<monvector.size();i++)
		{
			
			//% de present et d'absent
			if(monvector.elementAt(i).estDispo())
				compteurdispo++;
			//indisponibilité par personne
			else
			{
				a=mahashtable.get(new Integer(monvector.elementAt(i).getId_dispo()));
				a++;
				mahashtable.put(new Integer(monvector.elementAt(i).getId_dispo()),a);
				
			}
			//categorie
			for(int j=0;j<monvector.elementAt(i).getvector().size();j++)
			{
				
				b = hashtable_cate.get(new Integer(monvector.elementAt(i).getvector().elementAt(j).getCategorie()));
				b++;
				hashtable_cate.put(monvector.elementAt(i).getvector().elementAt(j).getCategorie(), b);
				compteurmedia++;
			}
			
			
			
			
		}
		Float calcul;
		calcul = new Float((float)(monvector.size()-compteurdispo)*100/monvector.size());
		calcul = Float.valueOf(calcul.toString().substring(0,5));
	
		mesStatvectorpresence.addElement(new valeur("Support Indisponible",calcul.floatValue()));
		
		mesStatvectorpresence.addElement(new valeur("Support Disponible",(100-calcul.floatValue())));
	}
	public class valeur
	{
		float pourcentage;
		String legende;
		public valeur()
		{
			
		}
		public valeur(String _legend,float _pourcentage)
		{
			legende=_legend;
			pourcentage=_pourcentage;
		}
		public String getLegende() {
			return legende;
		}
		public void setLegende(String legende) {
			this.legende = legende;
		}
		public float getPourcentage() {
			return pourcentage;
		}
		public void setPourcentage(float pourcentage) {
			this.pourcentage = pourcentage;
		}
		
	}
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("OK"))
		{
			this.setVisible(false); 
			
		}
		else if(e.getActionCommand().equals("Exportation PDF"))
		{
			JFileChooser chooser = new JFileChooser();
			int returnVal = chooser.showSaveDialog(this);
		    if(returnVal == JFileChooser.APPROVE_OPTION) {
		                String Path_PDF=chooser.getSelectedFile().getAbsolutePath();
		                try 
		                {
		                	
		                	a = new DefaultFontMapper();
		                	a.awtToPdf(this.getFont());
		                	   saveChartAsPDF(Path_PDF,a);
				           
				              
		                }
		               catch(Exception ee)
		               {
		            	   ee.printStackTrace();
		               }
		    	}
		}
		
	}
	public void saveChartAsPDF(String file,FontMapper mapper) throws IOException {
			OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
			
			writeChartAsPDF(out,mapper);
			out.close();
	}
	public void writeChartAsPDF(OutputStream out,FontMapper mapper) throws IOException 
	{
		  //pieChart
          //pieChart2
          //repart
          
			Rectangle pagesize = new Rectangle(800, 600*4+200);
			Document document = new Document(pagesize, 50, 50, 50, 50);
			try {
				
				PdfWriter writer = PdfWriter.getInstance(document, out);
				document.addAuthor("JFreeChart");
				document.addSubject("Demonstration");
				document.addTitle("Divxothèque Export PDF des statisques");
				document.setMargins(0,0,0,0);
				document.open();
				
				PdfContentByte cb = writer.getDirectContent();
				PdfTemplate tp = cb.createTemplate(800, 600*4+200);
				Graphics2D g2 = tp.createGraphics(800, 600*4,mapper);
				Graphics2D g3 = tp.createGraphics(800, 600*4,mapper);
				Graphics2D g4 = tp.createGraphics(800, 600*4,mapper);
				Graphics2D g5 = tp.createGraphics(800, 600*4,mapper);
				
				
				
				Rectangle2D r2D = new Rectangle2D.Double(0, 0, 800, 200);
				Graphics2D g1 = (Graphics2D) infodiverse.getGraphics();
				pieChart.draw(g1, r2D);
				
				PdfPTable table = new PdfPTable(2);//nombre de colonnes
				table.setWidthPercentage((float) 100.0);
				table.setSpacingAfter((float)0);
				table.setSpacingBefore((float)0);
				float[] largeurs = { 80,20};
				PdfPCell cell = new PdfPCell(new Paragraph(((TitledBorder)infodiverse.getBorder()).getTitle(),new Font(Font.TIMES_ROMAN, 15, Font.BOLD)));
				cell.setColspan(2);
				table.addCell(cell);
				
				table.setWidths(largeurs);
				
				cell = new PdfPCell(new Paragraph(labelnb_de_media.getText(),new Font(Font.TIMES_ROMAN, 11, Font.NORMAL)));
				table.addCell(cell);
				cell = new PdfPCell(new Paragraph(nb_de_media.getText(),new Font(Font.TIMES_ROMAN, 11, Font.NORMAL)));
				table.addCell(cell);
				cell = new PdfPCell(new Paragraph(labalnb_de_CDDVD.getText(),new Font(Font.TIMES_ROMAN, 11, Font.NORMAL)));
				table.addCell(cell);
				cell = new PdfPCell(new Paragraph(nb_de_CDDVD.getText(),new Font(Font.TIMES_ROMAN, 11, Font.NORMAL)));
				table.addCell(cell);
				
				document.add(table);
				
				r2D = new Rectangle2D.Double(0, 200, 800, 600);
				pieChart.draw(g2, r2D);
				g2.dispose();
				r2D = new Rectangle2D.Double(0,800, 800, 600);
				pieChart2.draw(g3, r2D);
				g3.dispose();
				r2D = new Rectangle2D.Double(0, 1400, 800, 600);
				repart.draw(g4, r2D);
				g4.dispose();
				r2D = new Rectangle2D.Double(0, 2000, 800, 600);
				catrepart.draw(g5, r2D);
				g5.dispose();
				cb.addTemplate(tp, 0, 0);
			}
			catch (DocumentException de) {
				System.err.println(de.getMessage());
			}
			document.close();
	}
	
}

/*File fileName = new File(System.getProperty("user.home") + "/jfreechart1.pdf");
saveChartAsPDF(fileName, chart, 400, 300, new DefaultFontMapper());*/

Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam

Hors ligne

#9 Le 03/05/2007, à 16:53

kaworu

Re : Créer des graphes à partir de stats

Salut !
J'ai fais la même chose que toi pour un projet. Le but était de faire différent graph avec des données. Comme cela représentait beaucoup de données (700Mo pour les fichiers CSV, ce sont en faite toutes les brevet déposés depuis 1960 si je me souviens bien), j'ai procédé comme suit :
1) un script pour tout planquer dans une Base MySQL
2) un script ou suivant les paramètres, un graphique était pondu.
Les scripts sont en python, avec le driver MySQL, GNUplot et sont driver pour la génération des graphiques.
Si je devais le refaire aujourd'hui je le ferai en Ruby/Og/Gruff, parce que ça doit être sympa à coder et ça devrait marcher facilement sous Windows (j'ai eu du mal à faire passer GNUplot et son driver sous windows, mais je pense que c'est de ma faute).

Si les script t'interessent pour avoir un exemple, je les posterai ici.

EDIT:
les voilà :
1) le script qui nourri la base MySQL. Comme pas tout m'interessait et que j'étais pressé, j'ai écris les parseurs. ça aurait été plus malin d'utiliser les bonnes méthodes/classes fournies par python (voir ici : http://www.commentcamarche.net/faq/suje … chiers-csv) mais bon.
import.py

#!/usr/bin/env python
# -*- coding: Utf-8 -*- 

# Version 1.2
# ------------------------------------------
# import :
# ------------------------------------------

from sys import exit, stdout

# wrapper MySQL
try     :   import MySQLdb as mysql
except  :    
    print "Vous devez installer \"mysql-python\" pour que ce script fonctionne correctement"
    exit(2)

# pour des jolies couleurs, marche que sous Gentoo :P
# car il faudrait un terminal ANSI
def green(s)    :   return s
def blue(s)     :   return s
def red(s)      :   return s
def bold(s)     :   return s
try     :   from output import green, blue, red, bold
except  :   gentoo = False
else    :   gentoo = False


# ------------------------------------------
# Variables :
# ------------------------------------------

# db_infos :    serveur,        database,   user,   passwd
db_infos = (    "127.0.0.1",    "shs",       "shs",  "shs")
# ne pas utiliser "localhost" comme host avec mysql-python cf -> http://www.blathersource.org/bugs_view.php?projid=pyicq-t&bugid=280

# verbose_var = 0 : peu d'affichage , 1 : bcp d'affichage 
# !!! peut ENORMEMENT ralentir l'execution si activé !!!
# car l'affichage python est très lent
verbose_var = 0
data_path = "/home/alex/doc/prog/python/shs/data/"

# noms des fichiers
files_names =   {
                "assignee"      :   "aconame.txt",
                "citations"     :   "cite75_99.txt",
                "patents"       :   "apat63_99.txt",
                }

# requête de créations des tables
tables =        {   
                "assignee"      :   "CREATE TABLE assignee (assignee NUMERIC PRIMARY KEY, compname TEXT)",
                "citations"     :   "CREATE TABLE citations (citing NUMERIC, cited NUMERIC)",
                "patents"       :   "CREATE TABLE patents (assignee NUMERIC,  patent NUMERIC PRIMARY KEY, country TEXT, appyear NUMERIC, postate TEXT, gyear NUMERIC)",
                }

# début des requêtes 
query_array =   {
                "assignee"      :   "INSERT INTO assignee VALUES ",
                "citations"     :   "INSERT INTO citations VALUES ",
                "patents"       :   "INSERT INTO patents VALUES ",
                }

# nombres de lignes des fichiers (merci wc -l)
files_length =  {
                "aconame.txt"   :   175116,
                "cite75_99.txt" :   16522439,
                "apat63_99.txt" :   2923923,
                }


# ------------------------------------------
# fonctions parser :
# ------------------------------------------

def a_parser(l) :
    lm=l.strip().split(",")
    lm=( lm[0], ",".join(lm[1:]) )
    return "(%s, %s)" % lm

def c_parser(l) :
    return "(%s, %s)" % tuple( l.strip().split(",") )

def p_parser(l) :
    lm=l.split(",")
    lm=(lm[6], lm[0], lm[4], lm[3], lm[5], lm[1])
    return "(%s, %s, %s, %s, %s, %s)" % tuple(map(quotesnone,lm))

def quotesnone(x) :
    "renvoie le paramètre ou une String vide si le paramètre est nul"
    x = x.strip()
    if x == "" : x= "\"\""
    return x

# dictionnaire des fonctions parser
fn =            {
                "assignee"      :   a_parser,
                "citations"     :   c_parser,
                "patents"       :   p_parser,
                }


# ------------------------------------------
# fonctions :
# ------------------------------------------

def my_error(e="plouf") :
    """
    affiche une erreur et quitte le programme avec code de sortie 1
    """
    print red("ERREUR :"), e
    exit(1)

def my_open(file, mode) :
    """
    ouvre un fichier envoyé en paramètre dans le bon mode et renvoie le descripteur
    """
    try     : f = open(file, mode)
    except  : my_error( bold("ouverture du fichier ") + file + bold(" échouée.") )
    else    : return f

def my_close(file, f) :
    """
    ferme un descripteur de fichier envoyé en paramètre
    """
    try     :   f.close()
    except  :   my_error( bold("fermeture du fichier ") + file + bold(" échouée.") )

def db_connection() :
    """
    Connexion à la bdd (ici MySQL), retourne le curseur
    """
    print green("*"), bold("Connexion à la base de donnée :"), db_infos[1],
    global db_str
    try     :
        db_str = mysql.connect(host=db_infos[0], db=db_infos[1], user=db_infos[2], passwd=db_infos[3])
        c = db_str.cursor()
    except  :   my_error(bold("Connexion à la base de donnée ") + db_infos[1] + bold(" échouée."))
    else    :   print blue("\t\t["), green("ok"), blue("]")
    return c

def db_deconnection() :
    """
    Déconnexion à la bdd (ici MySQL)
    """
    print green("*"), bold("Déconnexion de la base de donnée :"), db_infos[1],
    try :
        db_str.commit()
        db_str.close()
    except  :   my_error(bold("Déconnexion de base de donnée ") + db_infos[1] + bold(" échouée."))
    else    :   print blue("\t["), green("ok"), blue("]")

def db_query(query, verbose=0) :
    """
    Requête SQL (ici MySQL)
    """
    try     :   c.execute(query)
    except  :   my_error(bold("requête ") + query + bold(" échouée."))
    else    :   
        if verbose : print green("*"), bold("requête SQL :"), query

# ------------------------------------------
# script :
# ------------------------------------------

print blue("=" * 42)

for key, file in files_names.items() :
    c = db_connection()
    # création de la table
    db_query(tables[key])
    # ------ début du traitement du fichier
    print green("*"), bold("traitement du fichier :"), file
    # on ouvre le fichier et on saute une ligne
    f = my_open(data_path + file, "r")
    l = f.readline()
    # ------ pour l'affichage de la progression
    print bold("  Progression :"),
    counter, pc = 1, ""
    nlines, increment = files_length[file] / 100, 1
    if nlines == 0 :    nlines, increment = files_length[file] / 10, 10
    if nlines == 0 :    nlines, increment = files_length[file], 100
    # String de la reqête SQL, on va en faire une tous les 1Mo car c'est la longueur max acceptee par MySQL (par defaut)
    q = query_array[key]

    # début de la boucle while, traitement du fichier ligne par ligne
    while True :
        try :
            l = f.readline()
        except :
            my_error(bold("Problème durant la lecture du fichier ") + file)
        else :
            if not l : break
            # traitement avec la fonction appropriée et on alonge la requête SQL
            q += fn[key](l)
            # tous les 1Mo (avec un peu de marge hein)
            if len(q) > 1047400  :
                db_query(q, verbose=verbose_var)
                # on réinitialise la requête
                q = query_array[key]
            else : q += ","
            # affichage de la progresson
            if counter % nlines == 0 :
                if gentoo : print "\b" * ( len(pc) +2 ),
                pc = " "+str(counter/nlines)+"%"
                print pc,
                stdout.flush()
            # Incrémentation du compteur de lignes
            counter += increment

    # si il reste des requêtes on fini, on vire le dernier charactère de la chaine car c'est une ","
    if q != "" : db_query(q[:len(q)-1], verbose=verbose_var)
    # fermeture du fichier et de la bdd
    print
    my_close(data_path + file, f)
    db_deconnection()
    print blue("=" * 42)

# vim:ts=4

2) le fichier qui pond le graphique. Dans celui-ci il faut changer les variables à la main, mais faire une petite interface graphique en Tk/WxWidget/Qt4 pour gerrer les variables ça devrait être pas trop dur.
pyplot.py

#!/usr/bin/env python
# -*- coding: Utf-8 -*- 

# Version 1.2
# ------------------------------------------
# import :
# ------------------------------------------

from sys import exit, stdout

# wrapper MySQL
try     :   import MySQLdb as mysql
except  :
    print "Vous devez installer \"mysql-python\" pour que ce script fonctionne correctement"
    exit(2)

# wrapper Gnuplot
try     :   import Gnuplot, Gnuplot.funcutils
except  :
    print "Vous devez installer \"gnuplot-py\" et \"Gnuplot\" pour que ce script fonctionne correctement"
    exit(2)

# pour des jolies couleurs, mais marche que sous Gentoo :P
# car il faudrait un terminal ANSI
def green(s)    :   return s
def blue(s)     :   return s
def red(s)      :   return s
def bold(s)     :   return s
try     :   from output import green, blue, red, bold
except  :   gentoo = False
else    :   gentoo = True

# ------------------------------------------
# Variables :
# ------------------------------------------

# db_infos :    serveur,        database,   user,   passwd
#db_infos = (    "127.0.0.1",    "shs",       "shs",  "shs")
db_infos = (    "gw.o-t.ch",    "shs",       "shs-guest",  "guest")
# ne pas utiliser "localhost" comme host avec mysql-python cf -> http://www.blathersource.org/bugs_view.php?projid=pyicq-t&bugid=280

# verbose_var = 0 : peu d'affichage , 1 : bcp d'affichage 
# !!! peut ENORMEMENT ralentir l'execution si activé !!!
# car l'affichage python est très lent
verbose_var = 0

# date de départ / max
i, max = 1969, 1999

# nom de la corp
corp_name = "INTEL CORPORATION"

# fichier de sortie de la requête SQL
output_file = "data_years.txt"

# commandes Gnuplot
# rajouter autant de jolie commande supplémentaire pour faire un joli
# plot
g_term          =   "pdf"
g_filename      =   "g_years.%s" % g_term
gnuplot_opts    =   [
                "set terminal %s"   % g_term,
                "set output \"%s\"" % g_filename,
                "set title \"Toutes les compagnies\"",
                "set data style linespoints",
                ]

# ------------------------------------------
# fonctions :
# ------------------------------------------

def my_error(e="plouf") :
    """
    affiche une erreur et quitte le programme avec code de sortie 1
    """
    print red("\nERREUR :"), e
    exit(1)

def my_open(file, mode) :
    """
    ouvre un fichier envoyé en paramètre dans le bon mode et renvoie le descripteur
    """
    try     :   f = open(file, mode)
    except  :   my_error(bold("ouverture du fichier") + file + bold(" échouée."))
    else    :   return f

def my_write(fd, content) :
    """
    écris dans le descripeur de fichier fd la chaine envoyée en paramètre
    """
    try     :   fd.write(content)
    except  :   my_error(bold("écriture du fichier échouée."))

def my_close(file, fd) :
    """
    ferme un descripteur de fichier envoyé en paramètre
    """
    try     :   fd.close()
    except  :   my_error( bold("fermeture du fichier") + file + bold("échouée.") )

def file_exist(file) :
    """
    ouvre un fichier donné en paramètre pour tester s'il existe
    """
    ret = 1
    try     :   die = open(file, "r")
    except  :   ret = 0
    else    :   die.close()
    return ret

def db_connection() :
    """
    Connexion à la bdd (ici MySQL), retourne le curseur
    """
    print green("*"), bold("Connexion à la base de donnée :"), db_infos[1],
    global db_str
    try     :
        db_str = mysql.connect(host=db_infos[0], db=db_infos[1], user=db_infos[2], passwd=db_infos[3])
        c = db_str.cursor()
    except  :   my_error(bold("Connexion à la base de donnée ") + db_infos[1] + bold(" échouée."))
    else    :   print blue("\t\t["), green("ok"), blue("]")
    return c

def db_deconnection() :
    """
    Déconnexion à la bdd (ici MySQL)
    """
    print green("*"), bold("Déconnexion de la base de donnée :"), db_infos[1],
    try     :
        db_str.commit()
        db_str.close()
    except  :   my_error(bold("Déconnexion de base de donnée ") + db_infos[1] + bold(" échouée."))
    else    :   print blue("\t["), green("ok"), blue("]")

def db_query(query, verbose=0) :
    """
    méthode pour requête SQL (ici MySQL)
    """
    try     :   c.execute(query)
    except  :   my_error(bold("requête ") + query + bold(" échouée."))
    else    :
        if verbose : print green("*"), bold("requête SQL :"), query

# ------------------------------------------
# script :
# ------------------------------------------


### MySQL ###
if not file_exist(output_file) :
    c = db_connection()
    db_query("SELECT `ASSIGNEE` FROM `coname` WHERE `COMPNAME` LIKE '%s';" % corp_name, verbose=1)                              # <= une compagnie
    corp_assignee = c.fetchall()[0][0]                                                                                          # <= une compagnie

    # pour l'affichage de la progression
    counter, pc  = 0, ""
    nlines, increment = (max - i) / 100, 1
    if nlines == 0 :    nlines, increment = (max-i) / 10, 10
    if nlines == 0 :    nlines, increment = (max-i), 100

    y_list = []
    print bold("  Progression : "),
    # requêtes SQL, de i à max
    while i <= max :
        # db_query("SELECT COUNT(*) FROM patents WHERE appyear=%s ;" % i, verbose=verbose_var)                                  # <= toutes les compagnies
        db_query("SELECT COUNT(*) FROM patents WHERE appyear=%s AND ASSIGNEE=%s;" % (i,corp_assignee), verbose=verbose_var)   # <= une compagnie
        y_list.append( (i, c.fetchall()[0][0]) )
        # affichage de la progression
        if counter % nlines == 0 :
            if gentoo : print "\b" * ( len(pc) +2 ),
            pc = " " + str(counter/nlines) + "%"
            print pc,
            stdout.flush()
        i += 1
        counter += increment
    print
    db_deconnection()

    ### Enregistrement du fichier ###
    print green("*"), bold("Ecriture dans le fichier :"), output_file,
    f = my_open(output_file, "w")
    for row in y_list : my_write(fd=f, content="%s %s\n" % row)
    my_close(file=output_file, fd=f)
    print blue("\t["), green("ok"), blue("]")


### Gnuplot ###
# configuration
print green("*"), bold("configuration de Gnuplot"),
g = Gnuplot.Gnuplot(debug=verbose_var)
# commandes Gnuplot définies dans le tableau
for cmd in gnuplot_opts : g(cmd)
print blue("\t\t\t["), green("ok"), blue("]")
# gnuplotage
if g_term != "X11" and g_term != "windows" : print green("*"), bold("écriture dans le fichier :"), g_filename,
g.plot("\"%s\"" % output_file)
if g_term != "X11" and g_term != "windows" : print blue("\t["), green("ok"), blue("]")


# ------------------------------------------
# fin du script :
# ------------------------------------------

if g_term == "X11" or g_term == "windows" : raw_input(green("* ") + bold("Fin du script, appuyez sur une touche : "))

# vim:ts=4

Dernière modification par kaworu (Le 03/05/2007, à 17:23)


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#10 Le 04/05/2007, à 17:05

madmaker

Re : Créer des graphes à partir de stats

Rodriguez a écrit :

Je dois faire ça sous un environnement Windows.

ce n'est pas pour etre raciste ...mais ubuntu c'est linux et non windows pour ton information

Hors ligne