2 votos

El bucle de reescritura de QGIS es eficiente, asigna un número a cada fila de una columna,

company name

Tengo una columna titulada CompanyNam y necesito extraer la información de la propiedad. Por ejemplo, si CEZ es la primera empresa, le asigno el número 1, luego Sokolovska es el siguiente número, etc. Si CEZ vuelve a aparecer en alguna otra fila, obtendrá el número 1. Es importante tener en cuenta que si tengo NULL en la columna, asigno un número diferente a cada entrada de la fila NULL. Necesito los números correspondientes a la salida CompanyNam. Tengo el siguiente código:

EmptyArray = []
d = {}
newlist = []
for gFeat in GeneratorLayer.getFeatures():
    Owner = gFeat.attributes()[gProvider.fieldNameIndex('CompanyNam')].toString()
    A = ([str(i) for i in Owner]) #convert from PyQt4.QtCore.QString to normal string
    B = ''.join(A)
    EmptyArray.append(B)
    for m, n in enumerate(EmptyArray):
        if n not in d:
            d[n] = [m+1]
        newlist.append({n: d[n]})
        if n == '':
            d[n] = [m+1]
        newlist.append({n: d[n]}) #Every NULL gets a new number
    for names in newlist:
        for o, p in names.iteritems():
            if o == '':
                a2 = str('{},NULL'.format(p))
            elif o != '':
                a2 = str('{},{}'.format(p,o)

A continuación, utilizo a2 en otros pasos. El código funciona bien para una columna con 60-100 filas, pero para columnas más grandes, los tiempos de cálculo son realmente altos. ¿Pueden sugerirme alguna forma de reescribir este código, manteniendo la lógica? La salida tiene el siguiente aspecto:

[1],CEZ
[1],CEZ
[1],CEZ
[1],CEZ
[1],CEZ
[1],CEZ
[1],CEZ
[1],CEZ
[9],Sokolovska
[10],International
[11],ENERGOTRANS,
[12],Alpiq
[13],Mittal Steel
[14],United
[1],CEZ
[1],CEZ
[17],Dalkia.....

Sería aún mejor tener la numeración [1 ], [2], [3] y no [1 ], [9], [10], pero no he descubierto cómo hacerlo.

3voto

Brett Allen Puntos 231

No tengo conocimientos de qgis python, pero lógicamente puedo seguir tu script. El principal problema es que mientras iteras las características, también estás iterando la otra lista y el diccionario, por lo que el tiempo transcurrido está creciendo exponencialmente. Has creado un bucle dentro de otro bucle, y estás viendo el coste de hacerlo.

Así es como yo lo haría, aunque sigue siendo un poco engorroso (deduzco de tu código que NULL en la tabla de atributos == '' en el script):

counter = 1
ref_dict = {}
newlist = []
for gFeat in GeneratorLayer.getFeatures():
    Owner = gFeat.attributes()[gProvider.fieldNameIndex('CompanyNam')].toString()
    A = ([str(i) for i in Owner]) #convert from PyQt4.QtCore.QString to normal string
    name = ''.join(A)

    if name == '':
        name = 'NULL'
        newlist.append((counter, name))
        a2 = "[{0}], {1}".format(counter, name)
        counter += 1
    elif not name in ref_dict.keys():
        ref_dict[name] = counter
        newlist.append((counter, name))
        a2 = "[{0}], {1}".format(counter, name)
        counter += 1
    else:
        newlist.append((ref_dict[name], name))
        a2 = "[{0}], {1}".format(ref_dict[name], name)

Esto debería producir una lista de tuplas con el siguiente aspecto:

[(1,CEZ),(1,CEZ),...,(2,Sokolovska),(3,International),(4,ENERGOTRANS), etc.]

También le dejará la variable a2 que puede utilizar para otra operación sobre la misma característica. La ref_dict sólo se utiliza para las empresas cuyo nombre no es NULL.

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