¿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.
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.