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.

TypeError: tipo de operando no admitido para &: ‘datetime.datetime’ y ‘bool’

Estaba intentando replicar un código SQL:

proc sql;
        update __crsp_sf1
        set vol = 
            case 
                when date < '01FEB2001'd then vol / 2
                when date <= '31DEC2001'd then vol / 1.8
                when date < '31DEC2003'd then vol / 1.6
                else vol
            end
        where exchcd = 3;
    quit;

y utilicé:

crsp_sf1.loc[(crsp_sf1[''exchcd''] == 3)&(crsp_sf1[''date'']<datetime.datetime(2001, 2, 1)),''vol'']/=2
crsp_sf1.loc[(crsp_sf1[''exchcd''] == 3)&(crsp_sf1[''date'']>datetime.datetime(2001, 2, 1)&(crsp_sf1[''date'']<=datetime.datetime(2001, 12, 31))),''vol'']/=1.8
crsp_sf1.loc[(crsp_sf1[''exchcd''] == 3)&(crsp_sf1[''date'']>datetime.datetime(2001, 12, 31)&(crsp_sf1[''date'']<datetime.datetime(2003, 12, 31))),''vol'']/=1.6

Pero obtuve una advertencia que decía “TypeError: unsupported operand type(s) for &: ‘datetime.datetime’ and ‘bool'”. Al mismo tiempo, revisé mi marco de datos para encontrar algunos valores de la columna ‘vol’ que se actualizaron con 1/2 del valor anterior. Pero no sabía si todas las filas se actualizaron o el significado de esta advertencia.
¿Cómo debo escribir correctamente este código SQL en Python?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para replicar el código SQL correctamente en pandas, puede utilizar la función numpy.where para crear una nueva columna vol_new con los valores actualizados, y luego actualizar la columna original vol con los nuevos valores:

    import numpy as np
    
    crsp_sf1['vol_new'] = np.where(crsp_sf1['date'] < pd.Timestamp('20010201'), crsp_sf1['vol'] / 2,
                        np.where(crsp_sf1['date'] <= pd.Timestamp('20011231'), crsp_sf1['vol'] / 1.8,
                        np.where(crsp_sf1['date'] < pd.Timestamp('20031231'), crsp_sf1['vol'] / 1.6, crsp_sf1['vol'])))
    
    crsp_sf1.loc[crsp_sf1['exchcd'] == 3, 'vol'] = crsp_sf1.loc[crsp_sf1['exchcd'] == 3, 'vol_new']
    crsp_sf1.drop(columns=['vol_new'], inplace=True)
    

    Aquí, la función numpy.where crea una nueva columna vol_new basada en las condiciones especificadas en el código SQL. Luego, la columna original vol se actualiza con los nuevos valores solo donde exchcd == 3. Finalmente, se elimina la columna temporal vol_new.

    El error que encontraste ocurrió porque utilizaste & en lugar de & para las condiciones de date, y también porque utilizaste incorrectamente los paréntesis. El código actualizado arriba debería funcionar correctamente.

Comments are closed.