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 Pandas: Cómo determinar un ‘ciclo’ y sus picos

Usando el siguiente fragmento de datos a continuación:

Data = [95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,229,444,457,387,280,188,236,181,183,183,185,186,189,190,190,190,179,165,151,151,161,214,213,213,214,213,212,195,179,160,158,155,114,98,164,346,229,39,134,149,194,1,153,171,187,185,104,102,100,90,90,92,92,92,93,93,93,93,93,93,94,94,94,94,94,11,1,11,11,70,182,104,58,60,134,115,99,97,99,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93,152,206,221,286,326,341,360,377,391,392,393,393,393,394,406,418,420,422,422,408,389,345,329,276,224,166,113,-6,91,91,91,442,324,387,389,387,443,393,393,393,393,391,381,379,377,303,174,131,0,115,112,112,111,111,109,107,106,104,104,103,102,101,101,101,101,100,100,1,1,12,13,65,138,87]
df2 = pd.DataFrame(Data)

Forma el siguiente gráfico:

Pressure Peaks

Esta muestra de datos consiste en 2 ciclos de una máquina de la que estoy recibiendo datos. Puedes ver que la máquina comienza, luego aumenta a su presión máxima de 457 y luego a su segunda presión máxima de 346. Esto se considera 1 ‘ciclo’. Luego está inactivo hasta su próximo ‘ciclo’, donde puedes ver que aumenta a 422 y 443. Cada ‘ciclo’ tiene 2 valores máximos en él. Mis datos reales tienen cientos de estos ciclos.

He estado tratando de encontrar una forma de escribir un código que pueda localizar estos ciclos, así como los dos valores máximos asociados con ellos.

Entonces, por ejemplo, me gustaría que la salida sea algo como:
Ciclo 1: 457,346
Ciclo 2: 422, 443

Sin embargo, cuando he intentado esto, tengo problemas para identificar los valores máximos y los comienzos/finalizaciones de los ciclos. El mayor problema es que la duración del ciclo varía y los picos también varían mucho. He jugado con modelos de mezcla de Gaussianas pero no he tenido éxito.

También soy relativamente nuevo en Python, así que cualquier ayuda simplificada sería muy apreciada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para identificar los ciclos y sus valores de pico asociados en los datos proporcionados, podemos utilizar un algoritmo de detección de picos como peakutils. Primero, necesitamos encontrar los picos en los datos usando un umbral adecuado y una distancia mínima entre picos. Luego, podemos agrupar los picos adyacentes para formar ciclos utilizando su proximidad en el tiempo. Finalmente, podemos extraer los dos picos máximos en cada ciclo para obtener la salida deseada. Aquí hay un ejemplo de código:

    import pandas as pd
    import numpy as np
    import peakutils
    
    # Cargar los datos en un DataFrame
    Data = [95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,229,444,457,387,280,188,236,181,183,183,185,186,189,190,190,190,179,165,151,151,161,214,213,213,214,213,212,195,179,160,158,155,114,98,164,346,229,39,134,149,194,1,153,171,187,185,104,102,100,90,90,92,92,92,93,93,93,93,93,93,94,94,94,94,94,11,1,11,11,70,182,104,58,60,134,115,99,97,99,98,98,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93,152,206,221,286,326,341,360,377,391,392,393,393,393,394,406,418,420,422,422,408,389,345,329,276,224,166,113,-6,91,91,91,442,324,387,389,387,443,393,393,393,393,391,381,379,377,303,174,131,0,115,112,112,111,111,109,107,106,104,104,103,102,101,101,101,101,100,100,1,1,12,13,65,138,87]
    df2 = pd.DataFrame(Data, columns=['pressure'])
    
    # Encontrar los picos en los datos usando un umbral adecuado y una distancia mínima
    peaks = peakutils.indexes(df2['pressure'].values, thres=0.5, min_dist=10)
    
    # Agrupar los picos adyacentes para formar ciclos
    cycles = []
    current_cycle = []
    for i in range(len(peaks)):
        current_cycle.append(peaks[i])
        if i == len(peaks)-1 or peaks[i+1] - peaks[i] > 100:
            cycles.append(current_cycle)
            current_cycle = []
    
    # Extraer los dos valores de pico máximos en cada ciclo
    output = []
    for i in range(len(cycles)):
        cycle_peaks = df2.iloc[cycles[i]]
        max_peaks = cycle_peaks.nlargest(2, 'pressure')['pressure'].values
        output.append(f"Ciclo {i+1}: {max_peaks[0]},{max_peaks[1]}")
    
    print('\n'.join(output))
    

    Este código debería producir la siguiente salida:

    Ciclo 1: 457,346
    Ciclo 2: 443,422
    

    Nota que el umbral y la distancia mínima utilizados para encontrar los picos pueden necesitar ser ajustados dependiendo de las características de los datos. Además, este código asume que los ciclos están separados por un espacio significativo en el tiempo, por lo que es posible que no funcione bien si los ciclos están muy cercanos entre sí.

Comments are closed.