es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python – Cálculo de iteración sobre iteración

Buenos días.
Tengo una base de datos con casi 1.3 millones de filas (Base de Datos de Cráteres Lunares) y quiero agrupar los cráteres que están dentro de cráteres más grandes. Para hacer esto, ordené la base de datos de mayor a menor y luego iteré los cráteres más grandes sobre los demás para calcular si la distancia entre las posiciones está dentro del diámetro. El problema es que este cálculo lleva aproximadamente 50 segundos por cráter, por lo que llevará varios meses calcular toda la base de datos. He probado algunas técnicas alternativas como Dask, Multiprocessing, pero no funcionaron. Agradezco cualquier ayuda que puedan brindarme.

start = datetime.now()
cluster = 1
for i in range(len(craters_diam)):
    start2 = datetime.now()
    if craters_diam.loc[i, 'CLUSTER'] == 0:
        craters_diam.loc[i, 'CLUSTER'] = cluster
        lat1 = craters_diam.loc[i, 'LAT_CIRC_IMG']
        lon1 = craters_diam.loc[i, 'LON_CIRC_IMG']
        diam = craters_diam.loc[i, 'DIAM_CIRC_IMG']
        for j in range(i+1, len(craters_diam)):
            if craters_diam.loc[j, 'CLUSTER'] == 0:
                lat2 = craters_diam.loc[j, 'LAT_CIRC_IMG']
                lon2 = craters_diam.loc[j, 'LON_CIRC_IMG']
                dist = distance(lat1, lat2, lon1, lon2)
                if dist <= diam/2:
                    craters_diam.loc[j, 'CLUSTER'] = cluster
        cluster += 1
    print(datetime.now() - start2)
print(datetime.now() - start)

La función de distancia calcula en geometría esférica.

Si alguien conoce una manera más inteligente (más rápida) de hacerlo, ¡gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hola,

    Parece que el enfoque actual que estás utilizando es muy consumidor de tiempo y puede tardar meses en agrupar todos los cráteres. Aquí tienes algunas sugerencias que pueden ayudarte a mejorar la velocidad del proceso:

    1. Utiliza un algoritmo de clustering: En lugar de iterar sobre cada uno de los cráteres, puedes utilizar algoritmos de clustering como K-Means, DBSCAN o clustering jerárquico. Estos algoritmos utilizan métricas de distancia para agrupar los puntos de datos. Están optimizados para un mejor rendimiento y pueden agrupar conjuntos de datos grandes mucho más rápido que los enfoques tradicionales.
    2. Paraleliza la tarea: Si bien has intentado la multiprocesamiento, puede haber algunos problemas con la implementación que deben abordarse. Si puedes paralelizar la tarea de manera eficiente, esto puede acelerar significativamente el proceso.

    3. Reduce el número de comparaciones: Puedes reducir la cantidad de comparaciones que necesitas hacer utilizando indexación espacial. Por ejemplo, el índice R-tree puede almacenar las posiciones y diámetros de los cráteres de manera que se limite el número de comparaciones necesarias para encontrar cráteres cercanos. Esta técnica puede reducir en gran medida el tiempo necesario para las comparaciones.

    4. Utiliza Cython o Numba: Realizar un perfilado de tu código te dirá qué secciones son las más lentas. Puedes utilizar Cython o Numba para optimizar esas secciones lentas. Estas herramientas escriben código C o de máquina de alto rendimiento para tus funciones de Python y pueden mejorar significativamente el rendimiento.

    Espero que estas sugerencias te ayuden a encontrar un enfoque más rápido para tu problema. ¡Buena suerte!

Comments are closed.