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 if else con una bandera no funciona correctamente.”

Estoy tratando de establecer una bandera en mi instrucción de si y sino. Quiero que sea 1 si cruza el umbral superior pero solo la primera cruz después de la señal anterior, y lo mismo si cruza por debajo del umbral inferior (-1 en la primera cruzada). De lo contrario, quiero que sea 0.

Entonces mi lógica es establecer una bandera. Luego en la primera cruz de señal (cond1) cambia el estado de la bandera … para que no se active de nuevo … pero ahora podrá activar la cruz de señal bajo la condición 2, de lo contrario debería ser cero … pero no funciona.

como está / cómo quiero:
|——–| ————– |
| 1 |1 |
| 1 |-1 |
| 1 |1 |
| 1 |-1 |

def is_triggered(row):
flag = False

if flag == False and ((row.D>row.UPPER) and (row.D_PREV<row.upper)): return="" 1="" flag="True" if="" flag="=" true="" and=""></row.upper)):><row.lower) and="" (row.d_prev="">row.LOWER)):
    return -1
    flag = False

return 0

“`</row.lower)>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código actual en términos del uso de banderas. En primer lugar, la variable de bandera se establece en False al comienzo de la función pero nunca se cambia. Esto significa que la primera condición que se active siempre establecerá la bandera en True, y las condiciones posteriores no activarán las declaraciones if porque la bandera ya está en True.

    Para solucionar esto, necesitamos mover la asignación de bandera dentro de cada declaración if. En segundo lugar, necesitamos devolver el valor de bandera después de haber sido establecido en True o False en cada condición. Aquí hay una versión modificada del código que debería funcionar:

    def is_triggered(row):
        flag = False
    
        if not flag and row.D > row.UPPER and row.D_PREV < row.UPPER:
            flag = True
            return 1
    
        if flag and row.D < row.LOWER and row.D_PREV > row.LOWER:
            flag = True # no es necesario, solo lo muestro como una declaración
            return -1
    
        return 0
    

    Nótese que también he simplificado un poco las condiciones y eliminado las comparaciones innecesarias con True y False. Con este código, la variable de bandera se establece en True cuando se activa una condición, y seguirá siendo True hasta que se active la otra condición, momento en el que se restablecerá en False. La declaración de retorno final maneja el caso en el que aún no ha sucedido ninguna activación o la bandera se ha restablecido en False.

Comments are closed.