Numpy: Condiciones anidadas en dos columnas de Pandas
Introducción: Tengo un dataframe de pandas con las columnas df = [openDate, high, low, open, close, volume, is_eligible]
. En este dataframe:
- openDate es de tipo fecha y hora,
- high, low, open, close, volume son de tipo int64,
- is_eligible es de tipo booleano.
Declaración del problema: Quiero añadir una columna más, end_date
, que será calculada de acuerdo a lo siguiente:
Si is_eligible
es true
, entonces su end_time
será la openDate
más cercana cuyo valor de high
es mayor o igual al de is_eligible true
.
Ejemplo: Supongamos que la fila número 3 tiene is_eligible == true
, high=20
, low=10
, open=15
, close=12
, entonces tenemos que encontrar la siguiente fila inmediata que tenga un valor de high
mayor o igual a 20
.
Mi enfoque: He intentado la siguiente solución utilizando un enfoque vectorizado pero no está funcionando.
temp_var = df[["openDate","is_eligible","high"]].copy()
df["end_date"] = np.where(
temp_var['is_eligible'] == True,
np.where(
df['high']> temp_var["high"],
df["openDate"],
datetime.now()
),
datetime.now()
)
davy.ai
Solución
Según el enunciado del problema, necesitamos agregar una nueva columna
end_date
que se calculará en función del valorhigh
y elopenDate
de las filas.Aquí tienes una solución de trabajo para lograr esto:
Explicación
openDate
a datetime.openDate
,high
,is_eligible
.end_date
en el dataframe original y la establecemos en valores nulos.is_eligible
como verdadero y almacenamos sus índices en una lista.high
. Luego, actualizamos la columnaend_date
del dataframe original para esa fila con elopenDate
de la siguiente fila elegible. Si no hay una próxima fila elegible, simplemente omitimos esa fila.end_date
agregada.Conclusión
Esta solución debería resolver el problema original agregando una nueva columna
end_date
en el dataframe basada en el valorhigh
y elopenDate
de las filas. Esto se logra iterando sobre las filas elegibles y encontrando la siguiente fila elegible usando un bloque try-except.