7 votos

Función de expresión de QGIS

Me gustaría escribir un Python expresión de la función que calcula el promedio de las columnas (los parámetros de longitud variable), omitiendo los valores NULL.

@qgsfunction(args=-1, group='Custom')
def col_avg(vals, feature, parent):
    v = [ x for x in vals if x is not NULL]
    if len(v):
        return sum(v) / len(v)
    return 0

Si existe un valor NULO entre los parámetros de entrada, el resultado es NULL. Si yo uso una expresión en Seleccionar por la Expresión, por ejemplo:

my_col is not NULL

funciona. Yo uso de QGIS 2.18.7 en Ubuntu 16.04

* adición * Aquí está una imagen, como la llamo yo mi función: enter image description here

5voto

Braiam Puntos 120

Uso None en lugar de Null ... o no usarlo en absoluto, sino especificar el valor debe ser establecido. Usted puede leer más acerca de la identificación de los valores nulos

v = [ x for x in vals if x is not None]

o decirle a devolver los elementos que se establecen, de manera implícita que no son null

v = [ x for x in vals if x]

EDITAR

Ok, parece que el problema no es la manipulación de los valores nulos dentro de la función, pero durante la llamada a la función. Puesto que usted tiene la característica en la mano, no dejes pasar el valor de la columna, pero sólo el nombre de la columna, y capturar el valor directamente en la función

@qgsfunction(args=-1, group='Custom')
def testlist(cols, feature, parent):
  vals = [feature[i] for i in cols if feature[i] is not None]
  return sum(vals)/len(vals)

Para cada columna i en la lista cols, si el correspondiente feature el valor no es nulo, se debe agregar a la lista de nuevo vals y el proceso como en tu post original.

y te diría que es el uso de comillas simples:

testlist('colNameA','colNameB')

Bonus: Su campo de salida contiene decimales, así que vamos a asegurarnos de que la función devuelve:

return sum(vals)/float(len(vals))

1voto

Zoltan Puntos 284

El problema es en la función callby QGIS. Si hay un valor NULL en la lista de parámetros no se llamará mi función por QGIS. Lo entendí cuando he añadido un comando de impresión a mi función y comprobé en la consola de Python. He encontrado una solución para utilizar coalesce función para cada uno de los parámetros:

col_avg(coalesce("e2000", -999), coalesce("e2001", -999), coalesce("e2002", -999))

También he cambiado mi función para saltar-999 en lugar de NULL-s.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X