1. Faro

Nivel 6 · Carga el CSV del proveedor y comprueba sus tipos

La solicitud

De Priya Shah, Directora de Datos

“Un proveedor pegó su albarán de entrega en un correo como texto CSV. Cárgalo en un DataFrame y dime qué tipo le da pandas a cada columna. Quiero saber a qué nos enfrentamos antes de que nadie sume nada.”

Tu objetivo

Carga csv_text con pd.read_csv(io.StringIO(csv_text), parse_dates=["received_on"]). Asigna a result un diccionario que asocie cada nombre de columna con su dtype como string, tal como lo devuelve df.dtypes.astype(str).to_dict().

  • Guarda un dict en resultpendiente

Tu código

Python

Cargando el editor…

    ResultadoPresiona Ejecutar para ver el tuyo

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    La lección

    Leer texto CSV con read_csv

    pd.read_csv es como empieza casi todo análisis. Normalmente le das una ruta, como pd.read_csv("orders.csv"). Las tablas de Harbor & Pine de este juego se cargaron exactamente así, por eso orders y products ya están listas para ti.

    A veces el CSV no es un archivo: es texto pegado en un correo, devuelto por una API o escrito en una prueba. io.StringIO envuelve un string para que se comporte como un archivo abierto, y read_csv no nota la diferencia:

    import io
    
    df = pd.read_csv(io.StringIO(csv_text), parse_dates=["received_on"])
    df.shape    # (4, 5)

    La primera línea se convierte en los nombres de columna. parse_dates le dice a pandas qué columnas contienen fechas, para que sean datetimes reales en lugar de texto. Sin él, received_on volvería como object, y ordenar o restar fechas no funcionaría.

    Qué te dice dtypes

    df.dtypes lista el tipo que pandas eligió para cada columna. En este albarán de entrega:

    df.dtypes
    # sku                    object
    # product                object
    # units                 float64
    # unit_cost             float64
    # received_on    datetime64[ns]

    El texto se guarda como object. Los números con decimales son float64, los números enteros son int64 y las fechas interpretadas son datetime64[ns].

    Por qué units pasó a float64

    Todas las cantidades del archivo son números enteros, y aun así units es float64. La cantidad de la manta está en blanco. pandas marca un valor que falta como NaN («not a number»), y NaN solo existe como float, así que la columna entera se guarda como floats: 40 pasa a ser 40.0.

    Verás lo mismo en los datos de la tienda. En employees, manager_id es float64, no int64, porque el CEO no tiene jefe y esa celda es NaN. df.info() también lo muestra: el Non-Null Count de units es 3 de 4, lo que apunta directamente al hueco.

    Errores comunes

    • Pasar el propio texto a read_csv. Sin io.StringIO, pandas trata el texto como un nombre de archivo y falla con un FileNotFoundError.
    • Olvidar parse_dates, de modo que las fechas se quedan como texto.
    • Tratar como error una columna de id o de conteo float64. Normalmente significa que hay al menos un valor que falta; encuéntralo con .info() antes de convertir.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.