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 :

compléter une liste avec données manquantes


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut compléter une liste avec données manquantes
    Bonjour
    Je fais un petit script qui doit prendre le résultat d'une requête sql, rajouter quelques trucs et écrire le tout dans un fichier. Mon problème se situe au niveau du "rajouter quelques trucs".
    Tout d'abord, mes données : des carres(aire géographique) dans lesquels il y a des points(point gps), des dates(je ne garde que l'année), un nombre d'individus par date par année. Pour chaque point, il y a 2 relevés par ans(= 2 dates), et pour chaque relevé un nombre d'individus. Je ne garde sur les 2 relevés de l'année que celui avec le nombre max d'individus. Tout ça est stocké dans une liste de listes triée par point puis par date.
    ['001002', 2007, 1] <-- ['Point (string)', année (int), nb d'ind (int)]
    Jusque là tout va bien, je vous explique ça pour vous mettre dans le bain.

    Parfois, pour un point et une année, il n'y a pas d'informations, soit que le relevé n'a pas été effectué(alors nb d'individus = -1), soit qu'on n'a rien vu (alors nb d'individus = 0).
    Je dois donc remplir les trous, en rajoutant le N° du point, l'année et le nombre d'individus. Pour savoir si le relevé a été effectué j'ai une autre liste par ex : [ [ '0010', 2001 ], [ '0010', 2002 ], [ '0010', 2005 ], [ '0032', 2006 ]....].
    Les 4 premiers chiffres du point correspondent au carré : '001001' --> carré N°0010 point N°01. C'est pour ça que j'ai gardé le point en type string.
    Je pense qu'il y a une boucle infinie quelque part, je vous soumets mon code, pendant que je continue à débugguer pour trouver l'erreur car j'y suis depuis vendredi et je me dis que peut être un coup d'oeil neuf de quelqu'un pourrait peut être déceler une énormité dans mon script.
    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
     
    def compltrim(observes, suivis):
    	liste = []
    	liste.append(observes[0])
    	dico={}
    	fin = 0
    	for i in range(1, len(observes)) :
    		if (liste[fin][0] != observes[i][0]): # si chgt de site
    			if (observes[i][1] == 2001):    # si l'annee est bien 2001
    				liste.append(observes[i])
    			else :                # si l'annee n est pas 2001
    				dico = releff(suiv, observes[i][0][:4])
    				if dico.has_key(2001):     # si le carre a ete suivi mais pas de contact
    					liste.append([observes[i][0], 2001, 0])
    				else:               # si le carre n'a pas ete suivi
    					liste.append([observes[i][0], 2001, -1])
    		else :# (liste[fin][0] == observes[i][0]):   # si pas chgt de site
    			if ( liste[fin][1]+1 == observes[i][1]): # si bon enchainement d'annees
    				liste.append(observes[i])
    			else : # trou ds les annees 
    				dico = releff(suiv, observes[i][0][:4])
    				while(liste[fin][1] != (observes[i][1]-1)): # tant qu'il y a un trou
    					if ( dico.has_key(liste[fin][1]+1)):   # si le carre a ete suivi mais pas de contact
    						liste.append([observes[i][0], liste[fin][1]+1, 0])
    					else :       # si le carre n a pas ete suivi
    						liste.append([observes[i][0], liste[fin][1]+1, -1])
    					fin = len(liste) - 1
    				if ( liste[fin][1]+1 == observes[i][1]): # si bon enchainement d'annees apres la boucle
    					liste.append(observes[i])
    		fin = len(liste) - 1
    	return liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    # cette fonction renvoie un dico contenant des couples clé(année)-valeur(carre), permet de trouver rapidement si le carre a été suivi une certaine année.
    def releff(suiv, carre):
    	coord = trouvcoord(suiv, carre)
    	dico = {}
    	for j in range(coord[0], coord[1]):
    		dico[suiv[j][1]] = suiv[j][0]
    	return dico
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # cette fonction renvoie une liste contenant le premier et le dernier indice pour lesquels le carré est égal au carré donné en argument
    def trouvcoord(lissuiv, ref):
    	stop = len(lissuiv)
    	i = 0
    	while ( (i != stop) and (lissuiv[i][0] != ref) ):
    		i += 1
    	deb = i
    	fin = deb
    	while ( (fin != stop) and(lissuiv[fin][0] == ref) ):
    		fin += 1
    	fin = fin -1
    	return [deb, fin]
    J'ai fait quelques choix comme ne pas faire d'insertion mais remplir une liste, ça buggait pas mal et j'ai voulu "officialiser" tous les contrôles, même si je pense qu'il vaut mieux procéder par insertion par soucis de mémoire utilisée, ou ne pas faire de contrôle sur le premier relevé (ligne 3) car je réserve ça à quand j'aurais résolu mon problème actuel.
    Si vous voyez des trucs ça m'aiderait bien ou si vous ne comprenez rien à ce que j'ai fait je vous expliquerai mieux et peut être que comme ça je trouverai.
    Merci d'avoir lu mon post et bonne journée

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Dans compltrim, je vois deux fois cette ligne-là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico = releff(suiv, observes[i][0][:4])
    qui devrait planter vu qu'il n'y a pas de variable appelée suiv. A moins que ce ne soit une variable globale ? Je pense plutôt que c'est une erreur, vu que la fonction possède un argument suivis qui n'est pas utilisé...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Oui effectivement, merci, je mets des noms différents pour pas tout mélanger et j'applique pas je ne l'avais pas décelé car il ne faisait pas bugguer le tout, je pense parce que ce qui est donné comme suivis s'appelle suiv et est défini à l'extérieur de la fonction.
    J'ai corrigé mes bugs, je ne sais pas si ça vous intéresse d'avoir le nouveau code sans bugs, j'avoue que j'ai touché 2-3 trucs mais je ne sais plus trop quoi.

    Par contre j'ai rajouté des bugs car comme je l'avais dit ça ne vérifie pas le premier relevé, et en plus ça contrôle seulement les dates inférieures, si par exemple j'avais des relevés jusqu'en 2008 et rien en 2009, mon programme ne voit rien.
    J'abuse un peu et je vous mets mon nouveau code, et je continue à chercher de mon côté.

    edit : j'ai résolu mon problème, merci d'avoir lu, j'ai mis mon script au cas où ça intéresse quelqu'un. C'est pas optimisé ni simplifié mais j'ai pas le temps de le faire pour l'instant.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    def compltrim(observes, suivis):
    	liste = []
    	liste.append(observes[0])
    # premier releve
    	if (observes[0][1] == 2001):  # si le pemier releve est bien en 2001
    		liste.append(observes[0])
    		d=1        # pour initier la boucle for au releve suivant
    	else :              # le premier releve n'est pas en 2001
    		dico = releff(suivis, observes[0][0][:4])
    		if dico.has_key(2001):     # si le carre a ete suivi mais pas de contact
    			liste.append([observes[0][0], 2001, 0])
    		else:               # si le carre n'a pas ete suivi
    			liste.append([observes[0][0], 2001, -1])
    		d = 0
    # releves suivants
    	fin = 0
    	for i in range(d, len(observes)) :
    		if (liste[fin][0] != observes[i][0]): ############# si chgt de site
    			if (liste[fin][1] != 2009) : # si le releve precedent n etait pas en 2009
    				dico=releff(suivis, observes[i-1][0][:4])
    				while ( liste[fin][1] < 2010 ) :
    					if (dico.has_key(liste[fin][1]+1)):
    						liste.append([observes[i-1][0], liste[fin][1]+1, 0])
    					else :       # si le carre n a pas ete suivi
    						liste.append([observes[i-1][0], liste[fin][1]+1, -1])
    					fin = len(liste) - 1
    			if (observes[i][1] == 2001):    # si le releve precedent est en 2009 et que l annee est bien 2001
    				liste.append(observes[i])
    			else :                # si l'annee n est pas 2001
    				dico = releff(suivis, observes[i][0][:4])
    				if dico.has_key(2001):     # si le carre a ete suivi mais pas de contact
    					liste.append([observes[i][0], 2001, 0])
    				else:               # si le carre n'a pas ete suivi
    					liste.append([observes[i][0], 2001, -1])				
    		else :# (liste[fin][0] == observes[i][0]):   ############# si pas chgt de site
    			if ( liste[fin][1]+1 == observes[i][1]): # si bon enchainement d'annees
    				liste.append(observes[i])
    			else : # trou ds les annees 
    				dico = releff(suivis, observes[i][0][:4])
    				while( liste[fin][1] < (observes[i][1]-1)): # tant qu'il y a un trou
    					if ( dico.has_key(liste[fin][1]+1)):   # si le carre a ete suivi mais pas de contact
    						liste.append([observes[i][0], liste[fin][1]+1, 0])
    					else :       # si le carre n a pas ete suivi
    						liste.append([observes[i][0], liste[fin][1]+1, -1])
    					fin = len(liste) - 1
    				if ( liste[fin][1]+1 == observes[i][1]): # si bon enchainement d'annees apres la boucle
    					liste.append(observes[i])
    		fin = len(liste) - 1
    	return liste

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

Discussions similaires

  1. [AC-2003] Compléter une table avec des données d'autres tables
    Par Tchebichef dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 30/11/2012, 11h55
  2. [Débutant] récupération de données depuis une liste avec visual studio
    Par Catarssis dans le forum Développement Sharepoint
    Réponses: 2
    Dernier message: 03/09/2012, 11h42
  3. Réponses: 2
    Dernier message: 25/05/2011, 17h07
  4. [XL-2007] Faire un graphique avec une liste de données
    Par Deallyra dans le forum Excel
    Réponses: 14
    Dernier message: 21/01/2010, 20h08
  5. Extraire ou filtrer données d'une liste avec conditions.
    Par SimonLefebvre dans le forum Excel
    Réponses: 7
    Dernier message: 08/10/2008, 07h02

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