2.2. Tipos de datos#
Como se revisión en la lección 2.3 y en las lecciones anterior, todos los valores en python son objetos que tienen un cierto tipo.
2.2.1. ¿Qué es un objeto?#
Los objetos, en cualquier lenguaje de programación son abstracciones de lógica y valores. Aunque, para comenzar a trabajar con python, no es necesario tener un entendimiento muy profundo del paradigma de Programación Orientada a Objetos
(OOP, por sus siglas en inglés), para profundizar el dominio le lenguaje, es un concepto fundamental.
En este curso no nos enfocaremos en OOP, pero hay algunos conceptos necesarios que debemos conocer y trataremos en esta libreta.
Truco
Piensa en cada objeto como un pequeño artefacto o robot, las cosas que el artefacto puede hacer, son los métodos
. Las cosas que tiene o sus características son sus atributos.
2.2.2. Tipos básicos#
Cada objeto tiene un tipo.
Por ejemplo, los tenis
son un tipo de calzado
, y a su vez, el calzado es un tipo de ropa
.
Así en python, por ejemplo, cada valor posible tiene un tipo. Por ejemplo, el valor True
, es de tipo bool
, es decir, booleano, puede ser Verdadero (True
) o Falso (False
), pero a su vez, bool es un tipo de int
o número entero. Es decir que en algunos contextos ``Truees equivalente a
1`.
En python existen algunos tipos básicos que pueden consultarse en la sección correspondiente del tema 2.3. En las siguientes celdas iremos revisando cada uno de los tipos básicos, su utilidad y ejemplos de cómo y para qué utilizarlos.
2.2.3. Métodos y Atributos#
Dependiendo del tipo los objetos pueden tener atributos
y métodos
.
Importante
Los Métodos son funciones asociadas a cada objeto. Piensa en funciones que actúan con el objeto para hacer algo. Por ejemplo:
mi_lista.sort()
El métodosort
, asociado a unalista
, ordena la lista en cuestión. Todos los métodos se ejecutan, con paréntesis, comosort()
.
Los Atributos son variables asociadas al objeto en cuestión, piensa en ellas como características. Por ejemplo:
datos.columns
El atributocolumns
, asociado a unpandas.DataFrame
, devuelve una lista de las columnas en el arreglo de datos. Los atributos no se ejecutan, no tienen paréntesis al final.
2.2.4. Tipos para valores individuales#
Estos tipos representan datos individuales y pueden usarse de múltiples formas. Todos estos valores se adaptan muy bien para el uso de calculadora que estamos trabajando en esta unidad.
Nota
Los tipos básicos de valores individuales, como int
, float
, str
, bool
y NoneType
son todos inmutables.
Es decir, aunque podemos cambiar la variable reasignándola, no podemos mutar el valor, toma el siguiente ejemplo.
x = 1
x += 1
print(x) # 2
En este ejemplo, x
inicia con el valor int
1 y luego se usa el operador +=
que es equivalente a x = x + 1
.
Es decir, x aumenta una unidad, pero el número «1» no cambia, es inmutable.
2.2.4.1. Enteros (int
)#
Los tipos int
son números enteros, pueden ser positivos o negativos.
Se codifican con el número en cuestión.
En ciencias de la salud pueden representar tamaños de muestra, número de años cumplidos, etcétera.
2.2.4.2. Flotantes (float
)#
Los tipos float
son números con punto decimal, incluyen también aquellos que su decimal es cero. Por ejemplo el número 3.0
es tipo float
, no int
.
Los int
y float
pueden pueden usarse en operaciones matemáticas de todo tipo incluso entre ellas.
En la siguiente celda agrega variables tipo int
que sean relevantes en tu campo e intenta realizar operaciones matemáticas relevantes.
# por ejemplo
tensión_sistólica = 134 # int
tensión_diastólica = 71 # int
tensión_arterial_media = (tensión_sistólica + tensión_diastólica * 2) / 3 # float
print(tensión_arterial_media)
# pon aqui tus datos y realiza operaciones con ellas
92.0
2.2.4.3. Booleanos (bool
)#
Los tipos bool
son valores que pueden tomar un valor «cierto» o «falso», True
o False
.
Nota
Los tipos bool
son en realidad descendientes de los int
0
(Falso) y 1
(Cierto), así, True + True == 2
.
Esto puede ser algo confuso pero no tienes que preocuparte por ello en este momento.
Lo más habitual es generar valores por medio de pruebas lógicas que veremos en otra lección, pero te dejo un ejemplo:
imc = 40
obeso = imc >= 30 # mayor o igual a 30
print(obeso) # True
Puedes probar este ejemplo en la celda siguiente.
# ejemplo
enfermo = True # sí está enfermo
print(enfermo)
True
2.2.4.4. Cadenas de texto (str
)#
Los strings, de tipo str
son cadenas de texto, son cualquier texto libre, puede usarse para datos como el nombre del paciente, el identificador de una variante genética, etcétera.
Los str
reaccionan diferente a las operaciones matemáticas y no todas están implementadas.
Para codificar un str
, es necesario englobar todo el texto en comillas, pueden ser simples '
o dobles "
y es posible escribirlos en múltiples líneas, pero se requiere poner tres comillas en lugar de una.
una_línea = "Este str es de una sola línea"
multiples_líneas = """Este texto tiene múltiples
lineas de texto.
"""
Advertencia
Siempre revisa que cada par de comillas que se abre también se cierre. Si dejas unas comillas sin cerrar, python marcará un error.
# ejemplos:
nombre = 'Christian'
apellido = 'Delaflor'
print(nombre * 3) # multiplicación
print(nombre + apellido) # suma
# practica aquí con otras cadenas de texto y operaciones
ChristianChristianChristian
ChristianDelaflor
Truco
Las cadenas de texto str
son en realidad colecciones formadas por caracteres individuales. Esto quiere decir que puedes utilizar slicing e indización, ordenamiento, etcétera, parecido a las listas como verás en la siguiente sección, solo contempla que las cadenas de texto son inmutables, así que al reordenarlo estás efectivamente cambiando el objeto asociado a la variable, no lo estás mutando.
2.2.4.5. Tipo Nulo (NoneType
)#
El tipo nulo o None
es un valor único que representa la ausencia de un valor.
Sus usos varían, como cuando se pretende obtener el primer objeto que cumpla alguna característica dentro de una lista pero ningún valor cumple con los parámetros.
2.2.5. Colecciones#
Las colecciones son tipos que contienen a otros objetos.
A diferencia de los tipos básicos, que son inmutables, la mayoría de las colecciones sí pueden ser mutables, es decir, el objeto puede cambiar sin necesidad de reasignar la variable.
Las colecciones mutables son list
(listas), set
(conjuntos) y dict
(diccionarios).
Las colecciones inmutables, por otro lado, son tuple
(tuplas) y FrozenSet
(aunque este último no lo cubriremos en el curso).
2.2.5.1. Listas (list
)#
Este es uno de los principales tipos en python, y los más importantes a aprender en el contexto del análisis de datos.
Las listas contienen objetos de cualquier tipo y pueden ordenarse, agregar o quitar objetos, etcétera.
Para crear una lista, es necesario utilizar corchetes []
. Dentro de los corchetes se ponen los valores que se deseen para inicializar la lista, o pueden agregarse más tarde. Analiza el siguiente ejemplo:
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pares = []
for num in nums:
if num % 2 == 0:
pares.append(num)
En el ejemplo comenzamos con dos listas, la primera, nums
contiene los números del 1 al 10, la segunda lista pares
, inicia vacía. Después tenemos un código que podría parecer algo raro pero es fácil de entender. Primero hay un bucle (no te preocupes, lo veremos luego), que va tomando cada valor de la lista, del primero al último, en orden, (porque las listas son ORDENADAS) y va comprobando si el número es o no par. Para comprobar si es par, utiliza el operador «módulo» (%
), que funciona como una división pero regresa el remanente en lugar del resultado, por lo tanto, si un número es divisible entre 2, no tendrá remanente y ser|á par. Luego, si el número es par, entonces lo anexa (append
) a la lista de «pares».
Como no hemos cubierto los bucles, el ejemplo puede parecer raro, pero puedes jugar con él, en las celdas de código en esta libreta.
Los principales métodos de las listas son:
Método |
Función |
Ejemplo |
Explicación |
---|---|---|---|
|
Agrega un elemento al final de la lista. |
|
Agrega «María» al final de la lista |
|
Inserta un elemento en una posición específica. |
|
Agrega «José» en la posición 1 |
|
Elimina la primera aparición de un elemento por su valor. |
|
Remueve la primera «Ana» de la lista |
|
Elimina y devuelve un elemento (por defecto el último). |
|
Remueve el último elemento de la lista y lo devuelve para asignarlo a la variable |
|
Ordena la lista en orden ascendente (modifica la lista original). |
|
Ordena la lista de menor a mayor |
|
Invierte el orden actual de la lista. |
|
Invierte el orden de la lista |
2.2.5.1.1. Cómo obtener los valores dentro de la lista#
Importante
El concepto de indización y de slicing aplica a las listas y las tuplas, pero también es crítico cuando veamos arreglos de datos, que se utilizan en el análisis estadístico.
2.2.5.1.1.1. indización#
En python la posición de los valores en una colección se marca desde el número cero. Es decir, el primer elemento está en la posición cero, el segundo en la uno, y así sucesivamente.
Para acceder al elemento en la posición n
, lo que hacemos es utilizar corchetes después de la lista, como si ejecutáramos una función, pero con corchetes en lugar de paréntesis:
lista[10] # accede al elemento 10 de la lista.
frutas = ['manzana', 'pera', 'naranja'] # lista de frutas
# ejercicio
# obten el str "pera" de la lista frutas
pera = 'reemplaza esto con tu código'
print(pera)
reemplaza esto con tu código
Si una lista no tiene el número de elementos suficientes, python arrojará un error:
print('esta celda va a fallar')
frutas[10]
esta celda va a fallar
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
Cell In[5], line 2
1 print('esta celda va a fallar')
----> 2 frutas[10]
IndexError: list index out of range
Los índices también sirven para alterar las listas, por ejemplo, supongamos que queremos cambiar «pera» por «kiwi» en nuestra lista, lo hacemos así:
frutas[1] = 'kiwi' # cambiamos la fruta en la posición 1
print(frutas)
['manzana', 'kiwi', 'naranja']
2.2.5.1.1.2. Rebanadas (Slicing)#
Además de acceder a un solo valor con su posición, también podemos obtener una sublista usando lo que se llama slicing, que significa “rebanar”.
La sintaxis general es:
lista[inicio:fin]
Esto devuelve una nueva lista que incluye el elemento en la posición inicio
, pero excluye el de la posición fin
.
Es decir, va de inicio
hasta fin - 1
.
numeros = [10, 20, 30, 40, 50, 60]
print(numeros[1:4]) # [20, 30, 40]
Puedes omitir el inicio o el final si deseas ir desde el principio o hasta el final:
print(numeros[:3]) # [10, 20, 30]
print(numeros[3:]) # [40, 50, 60]
También puedes usar un tercer número para indicar el paso o la frecuencia con la que se seleccionan los elementos:
print(numeros[::2]) # [10, 30, 50] (cada dos)
print(numeros[1::2]) # [20, 40, 60] (pares)
Finalmente, puedes usar slicing con pasos negativos para invertir la lista:
print(numeros[::-1]) # [60, 50, 40, 30, 20, 10]
Nota
El slicing no modifica la lista original, solo devuelve una nueva lista con los valores seleccionados.
2.2.5.1.1.3. Ejercicios#
Supón la siguiente lista:
letras = ["a", "b", "c", "d", "e", "f", "g"]
Extrae una sublista con
"c"
,"d"
y"e"
.Extrae las primeras tres letras.
Extrae todas menos las dos últimas.
Extrae los elementos en las posiciones impares.
Imprime la lista al revés.
Ejecuta tu código en la siguiente celda de código.
'reemplaza esto con tu código'
'reemplaza esto con tu código'
Nota
En este momento puede ser que te parezca que el slicing es una complicación innecesaria, pero esto está alejado de la realidad. Lo usaremos más adelante en el curso para manipular arreglos de datos, esto funciona para obtener por ejemplo, un conjunto de columnas, en bases de datos, o para seleccionar grupos de sujetos.
2.2.5.1.2. Mutabilidad#
Como se comentó al principio de la lección, en python existen algunos tipos mutables y otros inmutables, las listas son efectivamente mutables, como verás en la siguiente celda.
lista = [] # lista vacía
print(id(lista)) # imprime el id de la lista vacía
# el id es un número único que identifica el objeto en memoria
# solo un objeto puede tener un id en un momento dado
lista.append('h')
lista.append('z')
lista.append('a')
print(lista) # imprime la lista con los elementos añadidos
print(id(lista)) # imprime el id de la lista con los elementos añadidos
# el id no ha cambiado, porque la lista es el mismo objeto en memoria
# intentemos eso mismo con un `int`
numero = 5 # int
print(id(numero)) # imprime el id del int
numero += 1 # incrementamos el int
print(numero) # imprime el int incrementado
print(id(numero)) # imprime el id del int incrementado
# el id ha cambiado, porque el int es un objeto inmutable
1654615809728
['h', 'z', 'a']
1654615809728
140704208966696
6
140704208966728
2.2.5.2. Tuplas (tuple
)#
Las tuplas son prácticamente idénticas a las listas, pero con una diferencia importante, son inmutables, eso quiere decir que las tuplas luego de ser inicializadas no pueden ser modificadas, no se pueden agregar o quitar elementos, ni siquiera reordenarlas.
Para inicializar una tupla, simplemente engloba a los valores en paréntesis.
mi_tupla = (1, 7, 42)
Las tuplas son útiles porque, aunque pierdan función con respecto a las listas, son más ligeras en la memoria y muy importantemente, son hashable
, lo que quiere decir que pueden ser utilizadas como llaves de diccionarios.
Nota
Los tipos Hashable
, implementan un método __hash__()
que devuelve un valor único para este objeto, el hash es como un identificador que solo existe para esa configuración del objeto.
2.2.5.2.1. Ejercicio#
intenta ver que puedes hacer con las tuplas, usa los mismos métodos que has usado con las listas.
# ejercicio:
# intenta obtener valores de la tupla, cambiar valores, etc.
'reemplaza esto con tu código'
'reemplaza esto con tu código'
2.2.5.3. Conjuntos (set
)#
Los conjuntos, o sets, son colecciones NO ORDENADAS de valores ÚNICOS. Esto quiere decir que dentro de un set solo existe una sola versión de cada objeto, si más versiones quieren ser incorporadas, serán ignoradas.
Truco
Se puede crear sets de cualquier tipo de colecciones.
adn = 'AACTCACTTTCGGTACTTGCA'
print(set(adn))
# {'A', 'C', 'T', 'G'}, quizá no en ese mismo orden
Importante
Como no tienen orden, no es posible usar indización ni slicing con los sets.
Los sets son útiles sobre todo en comparaciones, por ejemplo, si queremos saber si dos conjuntos contienen los mismos objetos únicos o conocer cuáles están en ambos, por ejemplo, como verás en la siguiente celda.
sujetos_grupo_a = {'Juan', 'María', 'Pedro'} # conjunto de sujetos del grupo A
sujetos_grupo_b = {'Ana', 'Pedro', 'Luis'} # conjunto de sujetos del grupo B
# identificar los sujetos que están en ambos grupos
print(sujetos_grupo_a & sujetos_grupo_b) # intersección de los conjuntos
# identificar los sujetos que están en el grupo A pero no en el grupo B
print(sujetos_grupo_a - sujetos_grupo_b) # diferencia de los conjuntos
# identificar los sujetos que están en el grupo B pero no en el grupo A
print(sujetos_grupo_b - sujetos_grupo_a) # diferencia de los conjuntos
# identificar los sujetos que están en al menos uno de los grupos
print(sujetos_grupo_a | sujetos_grupo_b) # unión de los conjuntos
# identificar los sujetos que están en el grupo A o en el grupo B pero no en ambos
print(sujetos_grupo_a ^ sujetos_grupo_b) # diferencia simétrica de los conjuntos
{'Pedro'}
{'María', 'Juan'}
{'Luis', 'Ana'}
{'Luis', 'Juan', 'María', 'Pedro', 'Ana'}
{'Juan', 'María', 'Luis', 'Ana'}
2.2.5.3.1. Ejercicio#
Crea un conjunto con tus amigos y otro con tus colegas y realiza operaciones con ellos, como las que has visto con los conjuntos anteriores
'cambia esto por tu código'
'cambia esto por tu código'
2.2.5.4. Diccionarios (dict
)#
Los diccionarios son uno de los tipos más importantes y relevantes en el contexto del análisis de datos. Están formados por dos partes, las llaves (keys, en inglés) y los valores.
Las llaves deben ser valores hashable
, como int
, float
, str
, tuple
, etcétera, ya que solo puede existir una misma llave con ese valor específico, de hecho, las llaves, como colección, son parecidas al set
, en donde solo existe una versión del mismo valor.
Los valores no tienen restricción y puede ser cualquier objeto en python, incluyendo colecciones.
Para construir un diccionario, se utilizan llaves {}
y se separa cada llave de su valor por dos puntos :
, separando cada par con coma:
mi_diccionario = {llave1: valor1, llave2: valor2, llave3:valor3}
El siguiente es un diccionario válido, con él verás la relevancia de los diccionarios.
sujeto = {
'nombre': 'ALP',
'edad': 38,
'enfermo': True,
'peso': 72,
'talla': 1.73,
'comorbilidades': ['DM2', 'HAS']
}
Advertencia
Los conjuntos set
también utilizan las llaves {}
, al igual que los diccionarios, pero no te confundas, el formato {llave:valor}
es para dict
y el formato {valor1, valor2}
es para los sets.
2.2.5.4.1. Acceder a los valores dentro del diccionario#
Supongamos que trabajamos con el ejemplo anterior, el diccionario sujeto
, que corresponde a la información de un paciente.
Se utilizan los mismos corchetes []
pero en lugar del índice del objeto, vamos a poner el la llave del valor al que queremos acceder, por ejemplo, si quisiéramos saber qué edad tiene el paciente:
edad = sujeto['edad']
Como se accede al objeto asociado con la llave en cuestión, es posible interactuar directamente por ejemplo, si queremos acceder a la lista de comorbilidades y obtener el primer valor (DM2), el código sería:
primera_comorbilidad = sujeto['comorbilidades'][0]
# DM2
Como ves, el primer juego de corchetes es para la llave, pero el segundo es para la lista. Es decir que en este ejemplo, sujeto['comorbilidades']
es lo mismo que si tuviéramos directamente la lista['DM2', 'HAS']
.
2.2.5.4.2. agregar o cambiar valores en el diccionario#
Similar a las listas, se hace por medio de corchetes con la llave con la que queremos interactuar:
sujeto['edad'] += 1 # agregar un año a la edad del paciente
sujeto['comorbilidades'].append('TDAH') # agregar una comorbilidad
sujeto['hace ejercicio'] = True # agregar una nueva llave y valor
Para quitar un par de llave y valor del diccionario, se utiliza la palabra clave del
, de esta forma: del sujeto['peso']
, esto quitaría la llave y el valor de "peso"
del diccionario.
2.2.5.4.3. Ejercicios#
sujeto = {
'nombre': 'ALP',
'edad': 38,
'enfermo': True,
'peso': 72,
'talla': 1.73,
'comorbilidades': ['DM2', 'HAS']
}
print(sujeto)
# 1. imprme el nombre del sujeto
# 2. imprime la última comorbilidad del sujeto
# 3. añade una nueva comorbilidad al sujeto
# 4. agrega una nueva clave al sujeto llamada "tratamiento" y asigna un valor
# 5. suprime la clave "enfermo" del sujeto
# 6. agrega una variable de "imc" al sujeto y calcula el IMC usando la fórmula: peso / talla ^ 2
{'nombre': 'ALP', 'edad': 38, 'enfermo': True, 'peso': 72, 'talla': 1.73, 'comorbilidades': ['DM2', 'HAS']}