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.

error de xgb.DMatrix(): DataFrame.dtypes para los datos debe ser int, float, bool o categórico cuando se suministra un tipo categórico.

Tengo el siguiente código, donde utilizo una tabla con muchas variables.

year = int(i/100)
month = i - int(i/100)*100
filtro = [('year','==',ano),('month','==',mes)]

dataset = pq.ParquetDataset(bucket, filesystem=s3, filters=filtro)
df =  dataset.read_pandas().to_pandas()

X = df.loc[:,variable_modelo]
y = df[['period']]

data_pred = None
data_pred = xgb.DMatrix(X, label=y)

ypred = model.predict(data_pred)

Y luego uso la función .predict() de xgb.train(param, dtrain, num_round) en las variables. Sin embargo, tengo el siguiente error:

ValueError: DataFrame.dtypes para los datos deben ser de tipo int, float, bool o categórico. 
            Cuando se suministra un tipo categórico, el parámetro
            `enable_categorical` de DMatrix debe establecerse en `True`.period

En la tabla, la columna “period” tiene data_type: ‘date’. ¿Cómo puedo solucionar este error?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar este error, debes convertir la columna de período en un formato numérico, como el tiempo Unix o el tiempo ordinal. Puedes lograr esto utilizando el método .astype() de la serie de pandas.

    Por ejemplo, si tu columna de período contiene fechas en el formato AAAA-MM-DD, puedes convertirla en tiempo Unix utilizando el siguiente código:

    df['period'] = df['period'].astype('datetime64[ns]').astype(int) // 10**9
    

    Esto convertirá la columna de período en tiempo Unix (segundos desde el 1 de enero de 1970), que se puede utilizar como entrada numérica para tu modelo xgboost.

    Alternativamente, puedes convertir la columna de período en tiempo ordinal (días desde el 1 de enero del año 1 d.C.) utilizando el siguiente código:

    df['period'] = df['period'].astype('datetime64[ns]').apply(lambda x: x.toordinal())
    

    Esto convertirá la columna de período en tiempo ordinal, que también se puede utilizar como entrada numérica para tu modelo xgboost.

    Una vez que hayas convertido la columna de período en un formato numérico, vuelve a ejecutar el código y el error debería desaparecer.

Comments are closed.