Bienvenue! Inscrivez-vous et rejoignez notre communauté :)
  • Login:

Bienvenue sur Forum SIG - Systèmes d'Information Géographique et Géomatique.

Bienvenue sur le forumSIG. S'il s'agit de votre première visite, assurez vous de faire une recherche préalable dans les FAQ SIG. Vous devez vous inscrire avant de pouvoir poster.

Affichage des résultats 1 à 12 sur 12
  1. #1

    Date d'inscription
    février 2016
    Localisation
    Lorraine
    Âge
    23
    Messages
    252

    Par défaut Somme des valeurs d'une colonne en fonction d'un champ

    Bonjour

    Mon sujet se rapproche de celui-ci; mais je n'arrive pas à résoudre mon problème, j'ai aussi vu d'autres discussions plus ou moins proche de mon problème (sur forumsig et georezo)

    Petit contexte : J'ai un modèle builder, dans lequel j'ai un autre modèle builder, dans lequel j'ai un autre modèle builder (bref un sous sous modèle builder) et mon problème est dans ce sous sous modèle builder :

    J'ai un équivalent de cette table et j'aimerais obtenir "résultat souhaité" qui correspond à la somme des surface pour un code donné :

    Code____Surface____résultat souhaité
    123_______12____________41
    123________6____________41
    123_______13____________41
    124_______34___________144
    124_______23___________144
    124_______87___________144

    Actuellement j'obtient :

    Code_Surface_Résultat obtenu
    123____12__________12
    123____16__________28
    123____13__________41
    124____34__________34
    124____23__________57
    124____87_________144

    Ce qui est logique car j'utilise ce script dans le calculateur de champ avec un itérateur sur "Code":

    total = 0
    def accumulate(increment):
    global total
    if total:
    total += increment
    else:
    total = increment
    return total


    Pour obtenir "résultat souhaité" trois possibilités s'offre à moi :

    1. Après être passé dans l'itérateur, j'utilise le calculateur de champ et une âme charitable trouve la possibilité d'obtenir le "résultat obtenu" que je souhaite. (soit en ajoutant une étape de plus dans mon code soit en calculant un nouveaux champ avec le max de ma colonne?)

    2. Soit je remplace le sous sous modèle builder par un script python en utilisant un group by sur "code" et un curseur mais mon problème est que dans le curseur j'ai besoin d'un input data mais celui-ci est créé par l'utilisateur dans le modèle builder (et il sera variable à chaque fois que l'utilisateur utilise le modèle builder)

    3. J'ai vu à de nombreuse reprise l'utilisation du "résumé statistique" mais j'aimerais l'éviter car en réalité je dois réaliser cette opération 5 fois et à chaque fois avec un champ de plus dans le "tri" des données.

    Et du coup je suis perdu (j'espère avoir été clair)

    merci à tous par avance et bon week-end
    Dernière modification par Diplos ; 04/03/2016 à 14h26.
    Diplos

  2. #2
    Rédacteur Supporter(rice)

    Date d'inscription
    octobre 2008
    Localisation
    Le caillou
    Emploi
    Développeur SIG
    Âge
    31
    Messages
    1 877

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    L'option résumés statistiques + jointure est la seule envisageable dans model builder "pur"

    Sinon, avec un script python utilisé dans model builder, tu peux facilement passer des paramètres utilisateurs :
    http://desktop.arcgis.com/fr/desktop...cript-tool.htm
    http://desktop.arcgis.com/fr/desktop...parameters.htm

    Pour le code, un curseur en lecture pour collecter les valeurs que tu souhaites.
    Puis un curserur en update pour écrire les résultats de cette collecte.

  3. #3

    Date d'inscription
    février 2016
    Localisation
    Lorraine
    Âge
    23
    Messages
    252

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    Super, beaucoup barapapa

    Je vais me plonger dans le script python
    Diplos

  4. #4

    Date d'inscription
    février 2016
    Localisation
    Lorraine
    Âge
    23
    Messages
    252

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    re,

    j'ai (enfin) un peu de temps pour regarder les curseurs :

    Ci-dessous la première partie de mon code qui me donne la somme du champ surface :

    Code:
    import arcpy
    valeur=0
    champs="Surface"
    fichier= "C:\Projet\Distancier\Distancier.gdb\DistancierVoiture"
    cursor = arcpy.da.SearchCursor(fc, champs)
    with arcpy.da.SearchCursor(fichier, champs) as cursor:
        for row in cursor:
            valeur = valeur + row[0]
    print valeur
    Le problème (avant d'essayer de sauvegarder ces valeurs) c'est que je tourne en rond avec l'utilisation d'un Group By (sur deux champs) impossible d'ajouter au curseur ce type de requête
    Diplos

  5. #5
    Rédacteur Supporter(rice)

    Date d'inscription
    octobre 2008
    Localisation
    Le caillou
    Emploi
    Développeur SIG
    Âge
    31
    Messages
    1 877

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    Salut Diplos,

    Pas de groupby dans un curseur de recherche !

    2 options :
    - utiliser résumés statistiques en python
    - grouper les valeurs par code (stocker dans un dictionnaire au fur et à mesure du curseur)
    -> dans ce cas, si tu as plusieurs champs, tu peux faire une clé unique pour ton dico en faisant un json.dumps des valeurs par exemple
    Code:
    values = {}
    group_fields = ["field1", "field2"]
    value_field = "Surface"
    with arcpy.da.SearchCursor(table, group_fields + [value_field]) as cursor:
        for row in cursor:
            key = json.dumps(row[:len(group_fields)])
            value = row[-1] if row[-1] else 0
            if key not in values:
                values[key] = value
            else:
                values[key] += value

  6. #6

    Date d'inscription
    février 2016
    Localisation
    Lorraine
    Âge
    23
    Messages
    252

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    Salut, Barbapapa

    merci, je comprend mieux pourquoi je tournais en rond, mais j'aurais du le remarquer moi même

    Le dictionnaire est une excellente idée, j'arrive à obtenir ce que je souhaite (je cherchais à éviter le résumé statistique histoire de me creuser un peu la tête et retrouver mes connaissances en python que j'ai laissé à l’abandon depuis pas mal de temps^^)

    Ci-dessous le code avec la partie de mise à jour :

    Code:
    import arcpy
    import json
    
    table = "chemin de la table"
    values = {}
    group_fields = ["champ1", "champ2"]
    value_field = "champ3"
    maj_field = "champ qui doit être mis à jour"
    
    with arcpy.da.SearchCursor(table, group_fields + [value_field]) as cursor:
        for row in cursor:
            key = json.dumps(row[:len(group_fields)])
            value = row[-1] if row[-1] else 0
            if key not in values:
                values[key] = value
            else:
                values[key] += value
    with arcpy.da.UpdateCursor(table, group_fields + [maj_field]) as cursor:
        for row in cursor:
            mongroupe = json.dumps(row[:len(group_fields)])
            if mongroupe in values:
                row[2] = values[mongroupe]
                cursor.updateRow(row)
    Diplos

  7. #7

    Date d'inscription
    février 2016
    Localisation
    Lorraine
    Âge
    23
    Messages
    252

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    Bonjour,

    Je rencontre un dernier problème avec le script : je peux le lancer sans problème mais j'ai besoin de pouvoir modifier "maj_field"

    Du coup j'utilise : arcpy.GetParameterAsText(1)
    et dans les propriété de mon outil j'ai mon champ 1 (type de données champ) et quand j’exécute l'outil j'ai ce message d'erreur :

    for row in cursor:
    RuntimeError: La colonne spécifiée n’existe pas.

    or la colonne que je rentre en paramètre pour le test est la même qui est fonctionnelle lors de l’exécution de l'outil : champ3.

    Est-ce que qqn aurait une idée?

    En vous remerciant par avance,
    Diplos

  8. #8
    Rédacteur Supporter(rice)

    Date d'inscription
    octobre 2008
    Localisation
    Le caillou
    Emploi
    Développeur SIG
    Âge
    31
    Messages
    1 877

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    Si c'est ton 1er paramètre, celui ci à l'index 0 donc arcpy.GetParameterAsText(0)

  9. #9

    Date d'inscription
    février 2016
    Localisation
    Lorraine
    Âge
    23
    Messages
    252

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    j'ai vérifié mais j'utilise bien un autre paramètre avant avec le 0 pour ma table attributaire (table)
    Par contre entre les deux j'utilise un paramètre dérivé venant du premier paramètre (pour ma table en sortie, vu que je ne fait que calculer un champ dans ce code)

    ça pourrait venir de là?
    Diplos

  10. #10
    Rédacteur Supporter(rice)

    Date d'inscription
    octobre 2008
    Localisation
    Le caillou
    Emploi
    Développeur SIG
    Âge
    31
    Messages
    1 877

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    Citation Envoyé par Diplos Voir le message
    j'ai vérifié mais j'utilise bien un autre paramètre avant avec le 0 pour ma table attributaire (table)
    Par contre entre les deux j'utilise un paramètre dérivé venant du premier paramètre (pour ma table en sortie, vu que je ne fait que calculer un champ dans ce code)

    ça pourrait venir de là?
    Si ton champs est le 3ème paramètre, tu dois le récupérer avec l'index 2.

  11. #11

    Date d'inscription
    février 2016
    Localisation
    Lorraine
    Âge
    23
    Messages
    252

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    Merci, c'était bien cela

    Je ne sais pas pourquoi mais j'ai cru que le paramètre dérivé n'avait pas d'influence sur la numérotation
    Diplos

  12. #12

    Date d'inscription
    février 2016
    Localisation
    Lorraine
    Âge
    23
    Messages
    252

    Par défaut Re : Somme des valeurs d'une colonne en fonction d'un champ

    re,

    je viens juste faire un retour concernant l'écriture du code, dans ce document j'ai trouvé vraiment quelques trucs intéressant ce qui permet de faire évolué mon code :

    Code:
    import arcpy
    import json
    
    table = "chemin de la table"
    values = {}
    group_fields = ["champ1", "champ2"]
    value_field = "champ3"
    maj_field = "champ qui doit être mis à jour"
    
    with arcpy.da.SearchCursor(table, group_fields + [value_field]) as cursor:
        for row in cursor:
            key = json.dumps(row[:len(group_fields)])
            value = row[-1] if row[-1] else 0
            values[key] = (values.get(value_field, value) + value)
    Dernière modification par Diplos ; 25/03/2016 à 15h52.
    Diplos

 

 

Discussions similaires

  1. [QGIS 2.x] Nombre de valeurs uniques en fonction d'un champ par maille
    Par Mathias Pires dans le forum Assistance et Programmation
    Réponses: 4
    Dernier message: 19/01/2016, 11h59
  2. [ArcGIS 10.x] Somme des points dans un même polygone + Somme d'un champ (table des points)
    Par ecofriendly dans le forum Assistance Technique
    Réponses: 2
    Dernier message: 08/08/2012, 16h58
  3. [ArcGIS 9.x] Polygones en fonction de la somme de valeurs
    Par fowear dans le forum Assistance Technique
    Réponses: 0
    Dernier message: 28/10/2010, 09h22
  4. [MapInfo 9.X] Mise à jour colonne somme
    Par Azery dans le forum Assistance Technique
    Réponses: 6
    Dernier message: 03/02/2010, 11h42
  5. [MapInfo 7.x] Somme de lignes en fonction d'un champ
    Par Gyoms dans le forum Assistance Technique
    Réponses: 14
    Dernier message: 09/10/2008, 20h59

Les tags pour cette discussion

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •