Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Detectar ciclos con NumPy
#1
Hola, soy muy nueva en Python (2 meses aprendiendo) y debo realizar esta tarea: 

Tengo dos columnas: 

Fecha:     Estado
1                10 (inicio)
2                12
3                11
4                13
5                14
6                18
7                20 (pico)
8                16
9                14
10              12 (fin e inicio del siguiente pico)
11              13
12              14
13              15

La consigna es que debo escribir el código en Pyhton y que este identifique los ciclos con las siguientes consideraciones: 

- la duración aproximada del ciclo total (inicio-pico-fin) es de 10 días, que pueden variar. 
- después del inicio del ciclo los estados que le siguen deben ser más grandes que el inicio. 
- si el valor actual es mas grande que todos los anteriores entonces ese valor es el pico
- pasados 5 días si el valor actual es el más pequeño ese es el fin del ciclo. 

Entiendo que primero debo definir las variables y luego trabajar con excepciones...pero no sé bien cómo empezar a escribir el código. He visto varios tutoriales, etc, pero para este caso en específico me cuesta identificar cómo empezar!! POR FAVOR, si alguien puede darme unas ideas de cómo debería verse el código lo agradecería muchísimo!!
Responder
#2
Hola, bienvenida. Smile

Para empezar, ¿en qué formato tenés esas dos columnas? ¿Son listas de Python, DataFrames de pandas? ¿Escribiste algún código hasta el momento? Más que variables y excepciones, pienso que es algo que se puede resolver usando bucles para recorrer los valores y condicionales para chequear si es el inicio, el pico o el fin del ciclo.

Saludos
Responder
#3
Smile 
(24-08-2022, 01:50 AM)Francisco escribió: Hola, bienvenida. Smile

Para empezar, ¿en qué formato tenés esas dos columnas? ¿Son listas de Python, DataFrames de pandas? ¿Escribiste algún código hasta el momento? Más que variables y excepciones, pienso que es algo que se puede resolver usando bucles para recorrer los valores y condicionales para chequear si es el inicio, el pico o el fin del ciclo.

Saludos

Francisco, muchas gracias por tu respuesta! Hasta ahora tengo esto, pero no sé si voy bien..

d = np.array(([10,12,13,14,18,20,16,14,12,13,14,15))]

for idx in range(len(data)-1):
     if data["event"][idx+1] > data["event"] [idx]:
          data["date"][idx]="S"

Tengo dudas de como seguir con el código, en mi cabeza lo siguiente que me imagino es algo como esto: 

def cycleSort(array):
  
   
  for cycleStart in range(0, len(array) - 1):
    item = array[cycleStart]


Pero me entran muchas dudas y no sé cómo seguir, voy a buscar ejemplos de como crear bucles y condicionales  Big Grin  . Lo que me cuesta identificar es cómo poner las indicaciones en el código. Me alucina ver en los ejemplos lo fácil que parece, pero cuando me toca hacerlo a mí me quedo en blanco!  Huh

Gracias por responderme! Cualquier otra sugerencia es bienvenida!

Saludos.
Responder
#4
Hola!

Si estás usando NumPy, creo que sería mejor guardar la información como un array de dos dimensiones:

Código:
import numpy as np

data = np.array([
    [1, 10], # (inicio)
    [2, 12],
    [3, 11],
    [4, 13],
    [5, 14],
    [6, 18],
    [7, 20], # (pico)
    [8, 16],
    [9, 14],
    [10, 12], # (fin e inicio del siguiente pico)
    [11, 13],
    [12, 14],
    [13, 15],
])

Luego, si querés buscar "manualmente" el número máximo en la segunda columna, podrías hacer (siguiendo tu lógica):

Código:
for i in range(len(data)):
    # Chequear si es el mayor entre los estados anteriores.
    mayor_anteriores = True
    for j in range(i):
        if data[i][1] < data[j][1]:
            mayor_anteriores = False
            break
    # Chequear si es el mayor entre los estados siguientes.
    mayor_siguientes = True
    for j in range(i, len(data)):
        if data[i][1] < data[j][1]:
            mayor_siguientes = False
            break
    if mayor_anteriores and mayor_siguientes:
        print("El pico es:", data[i])
        # Dejar de buscar una vez encontrado el pico.
        break

Seguramente haya una forma más eficiente y sintética usando funciones propias de NumPy (también está la función incorporada max() de Python).

Para detectar todos los ciclos (cuántos hay, sus respectivos inicio, pico y fin, etc.) habría que hacer condiciones más complejas. ¿Tenés bien en claro el funcionamiento de los condicionales (if) y los bucles (for) en Python? Sin esos conceptos fundamentales va a resultar muy difícil avanzar con el ejercicio.

Saludos
Responder
#5
(25-08-2022, 03:07 AM)Francisco escribió: Hola!

Si estás usando NumPy, creo que sería mejor guardar la información como un array de dos dimensiones:

Código:
import numpy as np

data = np.array([
    [1, 10], # (inicio)
    [2, 12],
    [3, 11],
    [4, 13],
    [5, 14],
    [6, 18],
    [7, 20], # (pico)
    [8, 16],
    [9, 14],
    [10, 12], # (fin e inicio del siguiente pico)
    [11, 13],
    [12, 14],
    [13, 15],
])

Luego, si querés buscar "manualmente" el número máximo en la segunda columna, podrías hacer (siguiendo tu lógica):

Código:
for i in range(len(data)):
    # Chequear si es el mayor entre los estados anteriores.
    mayor_anteriores = True
    for j in range(i):
        if data[i][1] < data[j][1]:
            mayor_anteriores = False
            break
    # Chequear si es el mayor entre los estados siguientes.
    mayor_siguientes = True
    for j in range(i, len(data)):
        if data[i][1] < data[j][1]:
            mayor_siguientes = False
            break
    if mayor_anteriores and mayor_siguientes:
        print("El pico es:", data[i])
        # Dejar de buscar una vez encontrado el pico.
        break

Seguramente haya una forma más eficiente y sintética usando funciones propias de NumPy (también está la función incorporada max() de Python).

Para detectar todos los ciclos (cuántos hay, sus respectivos inicio, pico y fin, etc.) habría que hacer condiciones más complejas. ¿Tenés bien en claro el funcionamiento de los condicionales (if) y los bucles (for) en Python? Sin esos conceptos fundamentales va a resultar muy difícil avanzar con el ejercicio.

Saludos

Hola Francisco, te agradezco mil tu respuesta, me ayuda a entender mejor este ejercicio! Respondiendo a tu última pregunta con respecto a los condicionales y bucles, tengo idea con base en lo que he visto en videos pero es la primera vez que tengo que escribir código, por eso tantas dudas y que no sé bien para donde ir!!! Cualquier otra recomendación es bienvenida!!!!!

Saludos
Responder
#6
¡Es un ejercicio muy complicado si es la primera vez que escribís un condicional o un bucle! Te recomiendo que busques ejercicios básicos específicos de condicionales y bucle for antes de encarar algo de esta complejidad.

(24-08-2022, 02:13 PM)Imja escribió: Lo que me cuesta identificar es cómo poner las indicaciones en el código. Me alucina ver en los ejemplos lo fácil que parece, pero cuando me toca hacerlo a mí me quedo en blanco!  Huh

Esto es falta de práctica en la escritura de código. Aprender a programar es como aprender un nuevo idioma: solo escuchando, sin hablar ni escribir, es imposible incorporar las reglas del lenguaje.

Saludos
Responder
#7
(26-08-2022, 12:00 AM)Francisco escribió: ¡Es un ejercicio muy complicado si es la primera vez que escribís un condicional o un bucle! Te recomiendo que busques ejercicios básicos específicos de condicionales y bucle for antes de encarar algo de esta complejidad.

(24-08-2022, 02:13 PM)Imja escribió: Lo que me cuesta identificar es cómo poner las indicaciones en el código. Me alucina ver en los ejemplos lo fácil que parece, pero cuando me toca hacerlo a mí me quedo en blanco!  Huh

Esto es falta de práctica en la escritura de código. Aprender a programar es como aprender un nuevo idioma: solo escuchando, sin hablar ni escribir, es imposible incorporar las reglas del lenguaje.

Saludos

Hola Francisco, tenés razón, no lo había pensado de esa forma! Ya encontré algunos canales con ejercicios. Dedos cruzados!!

Muchas gracias!

Imja
Responder
#8
¡De nada! Cualquier cosa nos volvés a preguntar. Wink

Saludos
Responder
#9
(26-08-2022, 06:20 PM)Francisco escribió: ¡De nada! Cualquier cosa nos volvés a preguntar. Wink

Saludos

Hola, pensé que te había respondido de forma pública y veo que no. Adjunto mi respuesta a tu último mensaje aquí:

Hola!! gracias por tu respuesta Francisco!

Entonces sería algo parecido a esto?

# identificar el fin del ciclo: pasados 5 días si el valor actual es el más pequeño ese es el fin del ciclo.

Código:
dias = 5

for i in range(len(data)):
    fin_ciclo = True
      for j in range(5, dias +1):
        if data[i][0] and data[j][1] < dias(days=i)
        fin_ciclo = False
        break
    if data[i][0] and data[j][1] and dias(days=i)
        print("El fin del ciclo es:", data[i]
        break
Responder
#10
Hola. Más bien algo así:

Código:
for i in range(len(data)):
    # Al menos debe haber 5 valores antes.
    if i < 5:
        continue
    fin_ciclo = True
    for j in range(i - 5, i):
        # Si en los cinco días anteriores hay algún valor
        # menor, no es el fin del ciclo.
        if data[i][1] > data[j][1]:
            fin_ciclo = False
            break
    if fin_ciclo:
        print("El fin del ciclo es:", data[i])
        break

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)