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.

¿Existe alguna forma de devolver un número decimal o entero a partir de una condición Verdadero/Falso?

n_level = range(1, steps + 2)

df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707]}

for i in n_level:
    if df['crest'] >= df[f'L{i}T']:
        df['Marker'] = i
    elif df['trough'] <= df[f'L{i}M']:
        df['Marker'] = -i
    else:
        df['Marker'] = 0

Espero obtener el siguiente df con la columna “Marker”:

df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707], 'Marker': [0, -2, 1, 3]}

La declaración “if” devuelve Verdadero o Falso, utilizando eso, ¿podemos convertirlo en el Valor i-ésimo (+/-)?

Lo que necesito es otra columna df[‘Marker’], que medirá si el crest o el trough cruzaron L{i}T o L{i}M, cualquier violación en el lado positivo en caso del crest y violación en el lado negativo en caso del trough.

Sample Dataframe

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir los valores True o False al valor correspondiente de “i” (+/-), puedes utilizar una función de numpy llamada where.

    Aquí está el código modificado:

    import numpy as np
    
    df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707]}
    
    for i in n_level:
        condition1 = df['crest'] >= df[f'L{i}T']
        condition2 = df['trough'] <= df[f'L{i}M']
        markers = np.where(condition1, i, np.where(condition2, -i, 0))
        df[f'Marker{i}'] = markers
    

    Esto creará una nueva columna Marker{i} para cada valor i en n_level. La función where establece los valores en markers a i donde condition1 es True, a -i donde condition2 es True, y a 0 en caso contrario.

Comments are closed.