Suite

Utilisation de Python dans le calculateur de champs - if/else sur plusieurs champs


J'essaie de trouver comment remplir un champ en fonction du score le plus bas sur 6 autres champs. J'ai lu plusieurs autres questions relatives aux instructions if/else, mais je commence tout juste à apprendre Python, donc j'ai du mal à mettre en place un code qui fonctionne.

J'essaie de remplir un champ "Échec principal", où pour chaque ID d'objet dans la classe d'entités, le champ le moins bien noté sur 6 autres champs sera noté.

Les autres champs sont : 'Interconnectivity', 'PropCover', 'PatchSize', 'ShapeIndex', 'Naturalness' et 'EdgeNat' et ils sont tous des entiers courts, les nombres élevés étant meilleurs que les nombres faibles.

Ainsi, par exemple, si « Interconnectivity » avait le score le plus bas dans les 5 champs pour un objectID, j'aimerais savoir comment remplir la colonne « Main Failing » pour cet objectID avec un texte indiquant « Interconnectivity ».

Edité : Voici un exemple du code que j'ai essayé jusqu'à présent avec l'aide de Branco. Il s'exécute sans erreur mais laisse le champ MainFailing vide (si 'return resultList[0]') ou le remplit avec des 0 (si return resultList[1]).

Bloc de code :

myFunction( !InterconnectivityScore!, !PropCoverScore!, !PatchSizeScore!, !ShapeIndexScore!, !NatScore!, !EdgeNatScore!)

Code de script pré-logique :

def myFunction ( interconnectivityScoreValue, propCoverScoreValue, patchSizeScoreValue, shapeIndexScoreValue, natScoreValue, edgeNatScoreValue): resultList = ["",0] if interconnectivityScoreValue <= resultList[1]: resultList[0] = "Interconnectivity" resultList[1] si propCoverScoreScore = resultList[1]: resultList[0] = "ProportionalCover" resultList[1] = PropCoverScore si patchSizeScoreValue <= resultList[1]: resultList[0] = "PatchSize" resultList[1] = PatchSizeScore si shapeIndexScoreValue <= resultList[1 ]: resultList[0] = "ShapeIndex" resultList[1] = ShapeIndexScore si natScoreValue <= resultList[1]: resultList[0] = "Naturalness" resultList[1] = NatScore si edgeNatScoreValue <= resultList[1]: resultList[ 0] = "EdgeNaturalness" resultList[1] = EdgeNatScore renvoie resultList[1]

Essayez ceci (édité selon le commentaire @alpha-beta-soup) :

def myFunction (inter, prop, patch, shp, nat, edge): myList = [inter, prop, patch, shp, nat, edge] myList.sort() myDict = {'Interconnectivity' : inter, 'PropCover' : prop , 'PatchSize' : patch, 'ShapeIndex': shp, 'Naturalness' : nat, 'EdgeNat' : edge} myVal = 101 # en utilisant 101 comme valeur max + 1 possible ; ajustez si besoin myReturn ="pour k, v dans myDict.iteritems(): if v < myVal: myVal = v myReturn = k return myReturn

Notez que si vous avez deux valeurs basses correspondantes, il n'y a rien à sélectionner l'une sur l'autre. Cela nécessiterait une vérification supplémentaire en fonction de vos critères. Puisqu'un dictionnaire n'est pas ordonné, vous ne pouvez pas le contrôler de cette façon.

Voici un autre moyen sans dictionnaires, avec une clause facultative pour les liens. Vous voudrez peut-être une logique différente en cas d'égalité.

def myFunction2 (inter, prop, patch, shp, nat, edge): # utilise des tuples pour assurer l'ordre des valeurs myScoreTuple = (prop, patch, shp, nat, edge) myTextTuple = ('PropCover', 'PatchSize', 'ShapeIndex' , 'Naturalness', 'EdgeNat') # initialise les valeurs myLowValue = inter myReturn = 'Interconnectivity' # vérifie maintenant toute valeur inférieure pour i dans range(len(myScoreTuple)): if myScoreTuple[i] < myLowValue: myLowValue = myScoreTuple[ i] myReturn = myTextTuple[i] # facultatif - ajoute plusieurs valeurs de texte en cas d'égalité. Supprimer si inutile elif myScoreTuple[i] == myLowValue: myReturn = ', '.join((myReturn, myTextTuple[i])) return myReturn

Vous pouvez le faire en utilisant la calculatrice de champ et python. Assurez-vous que l'analyseur est défini sur Python et que le bloc de code est affiché.

Le code que j'ai mis en place utilise simplement une série d'instructions IF. J'ai décidé que c'était plus facile puisque je comparais leurs scores, qui, je suppose, sont des scores numériques ? Dans les deux cas, je ne fais aucune vérification pour 2 scores ayant la même valeur. Je suis sûr que vous pouvez comprendre cette partie ou comment gérer les chaînes (si c'est ainsi que les informations sont stockées). Je n'allais pas m'inquiéter de si, elif, etc etc. Échec principal calculateur de terrain. C'est le principal Code de script pré-logique : partie. Cela décrit la fonction que vous allez utiliser pour traiter les informations transmises dans votre partie *MainFailing * (Field12 pour moi). Ce sont vos paramètres de fonction.

def myFunction(interconnectivityValue, propCoverValue, patchSizeValue, shapeIndexValue, naturalnessValue, edgeNatValue): resultList = ["", 0] if interconnectivityValue <= resultList[1]: resultList[0] = "interconnectivity" resultList[1] = interconnectivityValue if propCoverValue < = resultList[1]: resultList[0] = "propCover" resultList[1] = propCoverValue if patchSizeValue <= resultList[1]: resultList[0] = "patchSize" resultList[1] = patchSizeValue if shapeIndexValue <= resultList[1 ]: resultList[0] = "shapeIndex" resultList[1] = shapeIndexValue if naturalnessValue <= resultList[1]: resultList[0] = "naturalness" resultList[1] = naturalnessValue if edgeNatValue <= resultList[1]: resultList[ 0] = "edgeNat" resultList[1] = edgeNatValue renvoie resultList[0]

le Échec principal part vous permet de spécifier comment vous voulez appeler la fonction que vous avez déclarée dans votre Code de script pré-logique : section. Pour passer les champs de chaque ligne, notez que les noms des champs sont entourés de !. C'est ainsi que python sait récupérer la valeur de la table attributaire.

L'utilisation de python (ou VB Script) dans la calculatrice de champ est une bonne étape vers l'utilisation d'une approche plus centrée sur python. Personnellement, je préférerais le faire en utilisant la fenêtre interactive python et un arcpy UpdateCursor. C'est une autre approche que vous pouvez envisager une fois que vous avez compris la partie Calculatrice de champ.


Voir la vidéo: Python - Muuttuja (Octobre 2021).