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.

¿Obtener el último ejemplo de pct_change de pandas groupby apply?

Estoy utilizando datos financieros de yfinance.

df = yf.download("AAPL MSFT", period="60D", interval="5m")

Los datos se ven así:

                            AAPL        MSFT
Datetime                                         
2021-09-17 09:30:00-04:00  147.880005  303.049103
2021-09-17 09:35:00-04:00  147.669998  302.510010
2021-09-17 09:40:00-04:00  147.470001  303.000000
2021-09-17 09:45:00-04:00  147.320007  302.739990
2021-09-17 09:50:00-04:00  147.179993  301.869995
2021-12-10 15:35:00-05:00  178.179993  341.500000
2021-12-10 15:40:00-05:00  178.339996  341.437012
2021-12-10 15:45:00-05:00  178.460007  341.049988
2021-12-10 15:50:00-05:00  179.059998  342.220001
2021-12-10 15:55:00-05:00  179.500000  342.230011

Quiero calcular el cambio de porcentaje diario (días hábiles).

df.groupby(by=pd.Grouper(freq="B")).apply(lambda x: x.pct_change(periods=len(x)-1).iloc[-1,:])

Funciona correctamente sin seleccionar el último ejemplo con iloc. Cuando utilizo iloc para obtener el último ejemplo del cambio de porcentaje (el único relevante para mí), obtengo este error:

IndexError: single positional indexer is out-of-bounds

aunque el objeto es un DataFrame con ejemplos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error ‘IndexError: el indexador posicional único está fuera de los límites’ ocurre cuando el índice pasado a iloc está fuera del rango. En este caso, significa que el índice ‘-1’ está fuera del rango del dataframe.

    Una posible razón para este error podría ser que el dataframe está vacío y no hay elementos para seleccionar. Otra posibilidad es que la operación de groupby haya resultado en un solo grupo con solo un elemento, y la función pct_change no funciona para un solo elemento.

    Para evitar el error, se recomienda verificar si el dataframe contiene algún elemento antes de seleccionar el último elemento usando iloc. Además, puede ser útil agregar instrucciones de depuración para comprender la salida de cada paso intermedio y identificar la fuente del error.

    Aquí está el código modificado con instrucciones de depuración adicionales para ayudar a identificar la fuente del error:

    “`
    import yfinance as yf
    import pandas as pd

    df = yf.download(“AAPL MSFT”, period=”60D”, interval=”5m”)

    daily_pct_change = df.groupby(by=pd.Grouper(freq=”B”)).apply(lambda x: x.pct_change(periods=len(x)-1))

    print(daily_pct_change)

    if not daily_pct_change.empty:
    last_daily_pct_change = daily_pct_change.iloc[-1,:]
    print(last_daily_pct_change)
    else:
    print(“El dataframe está vacío”)
    “`

    El código anterior calcula primero el cambio porcentual diario sin seleccionar el último ejemplo. Luego, verifica si el dataframe resultante está vacío antes de seleccionar el último elemento. Finalmente, imprime last_daily_pct_change si existe o la cadena “El dataframe está vacío” si el dataframe está vacío.

    Esta modificación debería ayudar a identificar el problema que causa el error y evitarlo.

Comments are closed.