9 votos

Exportación de características cuando el valor de la columna está entre determinados percentiles

Quiero hacer un análisis estadístico. Necesito exportar algunas características. Su valor de columna entre el percentil 10%-90% (o 20%-80%) para evitar el efecto de los valores atípicos. No puedo encontrar una función en la ventana de expresión. Hay q1, q3, mediana. Devuelven los valores de los percentiles 25%, 75% y 50%.

Hay posts relacionados que encontré aquí. Ninguno de ellos satisface mi necesidad.

¿Cómo puedo exportar las características, su valor de la columna está entre el rango específico como 10%-90%, 20%-80%, etc?

9voto

Bien Puntos 1

Puede crear una nueva función que devuelva un valor de percentil, y luego, comparar el valor del campo.

  1. Abrir Select Feature by Expression herramienta

  2. Cree una nueva función en el editor de funciones utilizando el script que aparece a continuación. ( Cómo utilizar el editor de funciones )

    from qgis.core import from qgis.gui import import numpy as np

    values, layer = None, None @qgsfunction(args='auto', group='Custom') def percentile(per, layer_name, field_name, feature, parent): global layer, values

    if values is None:
        layer = QgsProject.instance().mapLayersByName(layer_name)[0]
        values = [f[field_name] for f in layer.getFeatures()]
    
    return float(np.percentile(values, per))
  3. Ejecute esta expresión para seleccionar las características cuyo valor de campo esté entre el percentil 10%-90%. Puede cambiar 10 y 90 para cambiar el rango.

    percentile(10, @layer_name, 'FIELD') < FIELD < percentile(90, @layer_name, 'FIELD')

  • Nota: El tercer parámetro (nombre del campo) en percentile debe ser una cadena -> 'FIELD' . Por favor, lee esto: Escribir una expresión
  1. Utilice Extract selected feature herramienta.

7voto

chhh Puntos 1154

Puede utilizar Select by expression y pegar estas expresiones (ver también las capturas de pantalla más abajo):

  1. Para el 10% más bajo:

    "value" <= array_get( array_sort ( array_agg ("value") ), aggregate ( @layer, 'count', "value" ) / 10 - 1 )

  2. Para el 10% más alto:

    "value" >= array_get( array_sort ( array_agg ("value") ), aggregate ( @layer, 'count', "value" ) / 10*9 )

Combine ambas expresiones con or al 10% más bajo más el 10% más alto (0-10%, 90-100%).

Captura de pantalla: aplicando esto a una capa con 100 puntos y un campo de atributo llamado value que contenga valores aleatorios de 1 a 1000, seleccionará los 10 más bajos (de 100) values entradas:

enter image description here

Y para los valores más altos:

enter image description here

Y combinado:

enter image description here

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