Tipos de datos con pandas#

Ya hemos visto los tipos básicos del lenguaje Python 1. Ahora bien, la librería pandas también cuenta con una serie de tipos de datos que debemos tener en cuenta para poder realizar nuestras operaciones de análisis. Para complejizar un poco más lo anterior, los tipos de datos de pandas se sobreponen con los de otras librerías como numpy y scipy.

Mapa de tipos de datos de pandas#

Para entender un poco mejor los tipos de datos en pandas, veamos la siguiente tabla:

tipo de dato pandas

tipo Python

uso

object

str o mezclado

Valores de texto o mezcla de valores numéricos y no numéricos

int64

int

número enteros

float64

float

números decimales

bool

bool

valores de verdad y falsedad

datetime64

NA

valores de fecha y tiempo

timedelta[ns]

NA

valores de diferencia entre dos valores de datetime

Los tipos de datos int64 y float64 son préstamos de numpy. Aunque hay diferecias con los datos int y float de Python, realmente no afectan el análisis básico de datos que llevaremos a cabo en este curso 2. En ese sentido, tenemos tres tipos de datos particulares de pandas que detallaremos a continuación.

Tipo de dato object#

El tipo de dato object es un tipo de dato que puede contener valores de texto o valores numéricos. Esto hace que sea uno de los tipos más confusos de pandas porque puede ser que comprenda una columna de texto, o una con datos numéricos que no se han declarado como int64 o float64, incluso diccionarios o listas. Podríamos decir que en pandas todos los tipos de datos son object hasta que se declaren como uno de los tipos de datos específicos.

Volvamos a nuestro ejemplo1 y ahora usemos el módulo dtypes para obtener el tipo de dato de cada columna:

import pandas as pd

ejemplo1 = pd.DataFrame(
    {"Nombre": ["Andrea", "Berenice", "Carlos"], # tipo de datos string
    "Edad": [34, 51, 26], # tipo de datos int
    "Registro": [True, False, True], # tipo de datos bool
    "Promedio": [9.5, 8.5, 10], # tipo de datos float
    "Origen": [
        {"Ciudad": "Ciudad de México", "Estado": "CDMX"}, 
        {"Ciudad": "Guadalajara", "Estado": "Jalisco"}, 
        {"Ciudad": "Toluca", "Estado": "Estado de México"}
        ], # tipo de datos dict 
    "Calificaciones": [(9, 8, 10), (8, 7, 9), (7, 6, 8)] # tipo de datos tuple
    })

ejemplo1.dtypes
Nombre             object
Edad                int64
Registro             bool
Promedio          float64
Origen             object
Calificaciones     object
dtype: object

Vemos que los datos están claramente detallados en el tipo de dato de cada columna. Ahora probemos el mismo método con la fuente de datos que usamos en la sección anterior:

# modifiqué el nombre del dataframe a covid_nacional para mejor legibilidad
covid_nacional.dtypes
Unnamed: 0                int64
fecha_actualizacion      object
id_registro              object
origen                   object
sector                   object
entidad_um               object
sexo                     object
entidad_nac              object
entidad_res              object
municipio_res            object
tipo_paciente            object
fecha_ingreso            object
fecha_sintomas           object
fecha_def                object
intubado                 object
neumonia                 object
edad                      int64
nacionalidad             object
embarazo                 object
habla_lengua_indig       object
indigena                 object
diabetes                 object
epoc                     object
asma                     object
inmusupr                 object
hipertension             object
otra_com                 object
cardiovascular           object
obesidad                 object
renal_cronica            object
tabaquismo               object
otro_caso                object
toma_muestra_lab         object
resultado_lab            object
toma_muestra_antigeno    object
resultado_antigeno       object
clasificacion_final      object
migrante                 object
pais_nacionalidad        object
pais_origen              object
uci                      object
dtype: object

Verás que prácticamente todas las columnas son de tipo object. Esto se debe a que en conjuntos de datos grandes, pandas ahorra memoria y tiempo al no declarar los tipos de datos de cada columna. Por esa razón, es muy probable que nos encontremos con fuentes de datos de tipo object aunque su tipo en realidad sea entero, decimal o booleano.

Tipo de dato datetime64#

El tipo de dato datetime64 es un tipo de dato que representa una fecha y una hora. El tipo de dato datetime64 es un préstamo de numpy y es un tipo de dato que se puede usar para representar una fecha y una hora.

En nuestro ejemplo de datos por Covid 19, las fechas están representadas con el formato AAAA-MM-DD (por ejemplo: 2022-05-03). Para representar una fecha y una hora, podemos usar el formato datetime64[ns]. pandas incluye una función para convertir una cadena de texto a un tipo de dato datetime64[ns] llamada to_datetime. Usémosla en la columna ‘fecha_ingreso’ para ver el resultado

covid_nacional['fecha_ingreso'] = pd.to_datetime(covid_nacional['fecha_ingreso'])
covid_nacional['fecha_ingreso'].head()
0   2022-05-03
1   2022-01-13
2   2022-01-12
3   2022-02-20
4   2022-01-12
Name: fecha_ingreso, dtype: datetime64[ns]

En este caso el tipo de fecha es bastante simple (año, mes, día). Pero también es posible utilizar el tipo datetime64 para estabecer la hora y los minutos de la fecha, incluso la unidad de tiempo coordinado (UTC) del dato.

covid_nacional['fecha_ingreso'] = pd.to_datetime(covid_nacional['fecha_ingreso'], utc=True)
covid_nacional['fecha_ingreso'].head()
0   2022-05-03 00:00:00+00:00
1   2022-01-13 00:00:00+00:00
2   2022-01-12 00:00:00+00:00
3   2022-02-20 00:00:00+00:00
4   2022-01-12 00:00:00+00:00
Name: fecha_ingreso, dtype: datetime64[ns, UTC]

En este ejemplo la librería agrega el valor de hora 00:00:00+00:00 al no tener otra referencia para representar la hora. Si hubiese una hora de origen, por ejemplo, la hora de ingreso de un paciente, podría ser relevante hacer esa operación.

Tipo de dato timedelta[ns]#

El tipo de dato timedelta[ns] es un tipo de dato que representa una diferencia de tiempo entre dos valores. Por ejemplo, la diferencia de tiempo en horas, días, minutos o segundos entre dos fechas. Por ejemplo, si queremos saber cuál es la diferencia de tiempo entre los síntomas y el ingreso del paciente a la institución de salud, podemos restar dos valores de datetime y obtendremos un valor de timedelta.

covid_nacional['fecha_sintomas'] = pd.to_datetime(covid_nacional['fecha_sintomas'], utc=True)
covid_nacional['diferencia_tiempo'] = covid_nacional['fecha_ingreso'] - covid_nacional['fecha_sintomas']
covid_nacional['diferencia_tiempo'].head()
0   0 days
1   3 days
2   0 days
3   7 days
4   2 days
Name: diferencia_tiempo, dtype: timedelta64[ns]

Incluso podemos hacer alguna operación estadística simple, como hallar el promedio de estos valores de timedelta.

covid_nacional['diferencia_tiempo'].mean()
Timedelta('1 days 19:32:13.920714831')

De manera muy rápida podemos afirmar que la diferencia de tiempo entre los síntomas y el ingreso del paciente es, en promedio, de un día y 19 horas.

Actividad#

En el foro, describe la forma de la fuente de datos:

  • Número de filas

  • Número de columnas

  • Nombre de las columnas

Y, usando el módulo dtypes analiza los tipos de datos que tienes en tu DataFrame (int, float, object).

Comparte con los demás colegas la descripción de la fuente de datos y solamente con estos datos comenta qué posibilidades y retos encuentras con la fuente de información de por lo menos otros dos colegas.

Notas#


1

Los tipos básicos (primitivos o integrados) dependen de cada lenguaje. En ciertos lenguajes como Java existen tipos de datos como byte, short, long y double, que hacen más preciso el manejo de los datos. Una gran ventaja de Python es que sintetiza estos tipos de datos, que son un tanto más abstractos, en favor de la legibilidad. Para un listado completo de estos tipos de datos en Python puedes consultar la documentación de Python.

2

pandas usa este tipo de datos porque son computacionalmente más precisos que los de Python, lo cual hace más rápido procesar grandes cantidades de datos.