Módulos y Librerías de Python
Módulos y Librerías de Python
TIyP 002
Docente
Yordan Aguilar Ruiz
Índice general
En el transcurso del curso anterior, sentamos los cimientos esenciales para la creación de
programas en Python, permitiéndonos abordar principalmente proyectos de sencilla y me-
diana complejidad con destreza. En esta nueva etapa, nos embarcaremos en la exploración
de un concepto central y fundamental: la modularidad. Este principio no solo amplı́a
nuestra comprensión del lenguaje, sino que también nos capacita para fragmentar nuestros
programas en unidades más simples y manejables, brindándonos la capacidad de desglosar
la complejidad, facilitando ası́ la resolución de problemas y la gestión eficiente del código.
En términos prácticos, un módulo corresponde a un archivo con extensión .py que se es-
cribe a parte del fichero principal y que se llama a este último por medio de instrucciones
especı́ficas del lenguaje. La idea de estos archivos es que contengan estructuras individuales,
como variables, funciones o clases.
Se recomienda tener un modulo para funciones y un módulo para cada clase. Podemos
añadir también otros módulos que almacenen variables/constantes o bases de datos. Es una
buena práctica crear carpetas en el directorio principal donde se almacenen estos módulos
para tener todo más organizado.
1.1 Módulos en Python 2
Programa principal
>> # Este es el módulo principal. Vacı́o por el momento.
Módulo Funciones
>> def productos(base):
>> print(base.bebestibles)
>> print(base.lacteos)
>> print(base.snack)
>> print(base.bebestibles)
>> elif tipo == 2:
>> print(base.lacteos)
>> else tipo == 3:
>> print(base.snack)
Programa principal
>> import Clase cliente
>> import Base de datos
>> import Funciones
Aquı́, hemos traı́do los tres módulos al programa principal. Hemos creado un cliente llama-
do Daniel, hemos invocado la función productos para ver todos los productos disponibles y
hemos comprado uno de la sección de lácteos con el código de identificación 007.
Programa principal
>> import Clase cliente as cc
>> import Base de datos as bd
>> import Funciones as f
>> f.productos(bd)
>> daniel.comprar(bd.Lácteos[007],2)
Observación. Una cosa importante que tenemos que tener en cuenta es que, para cargar
un módulo al programa principal, debemos primero hacerlo correr en su propio fichero. Si
no hacemos esto, es posible que tengamos errores por que el módulo no ha sido cargado.
Podemos renombrar cada uno de los elementos que traemos al programa utilizando la sen-
tencia especial as.
Si necesitamos importar todos los elementos del módulo, podemos utilizar un asterı́sco en
reemplazo de los elementos que traeremos al programa principal.
La idea de esto es que ya no necesitaremos anteponer el nombre del módulo del que prece-
de la variable/función/clase, pues lo hemos traı́do al programa principal y somos libres de
utilizarlas como si ahı́ estuviesen definidas.
Aunque esto facilita bastante la programación, no es una práctica recomendada, pues no es
eficiente traer cosas que no necesitaremos.
Programa principal
>> from Clase cliente import *
>> from Base de datos import *
>> from Funciones import *
Ejercicios propuestos
Ejercicio 01. Crear un módulo llamado “Asignaturas” que contenga un diccionario cu-
yas claves sean los códigos de las asignaturas (CIBA, INGI) y el valor sea una lista con el
nombre de la signatura y la cantidad de créditos que consume. Crear otro módulo llamado
“Asignaturas electivas” que tenga la misma estructura, pero sus asignaturas deben tener
como código de identificación la cadena ASEL. Por último, crear un tercer módulo llama-
do Estudiante que tenga la clase estudiante con sus atributos de nombre, apellido y edad.
Como atributo estático debe tener la cantidad de créditos (33). Como métodos deben tener
inscribir asignaturas y desinscribirlas.
Llamar estos módulos desde el programa principal y utilizarlos para crear estudiantes que
inscriban sus asignaturas. Debe haber una variable que permita ver las asignaturas inscritas.
1.2 Paquetes, bibliotecas o librerı́as de Python 5
En términos prácticos, entenderemos un paquete como una carpeta con muchos módulos.
Para que Python comprenda que una carpeta es un paquete, debe contener un módulo es-
pecial llamado init . Este módulo diferenciará al paquete y permitirá ejecutar una serie
de instrucciones a penas sea llamado al programa principal.
Librerı́as de creación propia: Son aquellas librerı́as que nosotros creamos en nues-
tros programas. Debemos crear también los módulos que queremos que contengan.
Librerı́as estandar: Son aquellas librerı́as que ya vienen por defecto dentro de
Python y que podemos importar a nuestros programas.
Librerı́as de terceros: Son aquellas librerı́as que hicieron otras personas y que
están disponibles en la web para ser utilizadas. Antes de implementarlas debemos
descargarlas utilizando el comando pip3 install nombre paquete en la terminal de
Visual Studio Code.
El importe de paquetes al programa principal se hace con from nombre paquete import
nombre modulo. Podemos ver lo que tienen dichos módulos presionando la tecla CTRL.
Veamos un ejemplo:
Librerı́a Mat
Módulo init .py # Esto se activa a penas se invoca al módulo
>> from . import Aritmética
>> from . import Geometrı́a as geo
>> print(”Se ha cargado el paquete al sistema”)
>> PI = 3.14159265
Módulo aritmetica.py
>> def vAbs(num):
>> if num >= 0:
>> return num
>> else:
>> return num*-1
Módulo geometria.py
>> def punto cuadrante(x,y):
>> if x>0 and y>0:
>> print(f”({x},{y}) está en el primer cuadrante”)
>> if x<0 and y>0:
>> print(f”({x},{y}) está en el segundo cuadrante”)
>> if x<0 and y<0:
>> print(f”({x},{y}) está en el tercer cuadrante”)
>> if x>0 and y<0:
>> print(f”({x},{y}) está en el cuarto cuadrante”)
Programa principal
Programa
>> import Módulo
>> print(Aritmética.factorial(4)) 24
>> print(geo.dist origen(3,4)) 5.0
Ejercicios propuestos
Ejercicio 01. Crear un paquete llamado Geometrı́a que tenga los siguientes módulos:
Punto: Este módulo debe tener los siguientes métodos: Distancia al origen, Distancia
entre dos puntos, Punto medio.
Vector: Este módulo debe tener los siguientes métodos: Suma, Resta, Producto es-
calar, Producto punto, Norma.
Recta: Este módulo debe tener los siguientes métodos: Recta por dos puntos, Forma
general de la recta, Recta paralela por un punto exterior, Recta perpendicular por un
punto exterior, Intersección de rectas.
Crear un fichero principal y llamar estos módulos del paquete Geometrı́a. Utilizar las fun-
ciones para corroborar algunos cálculos.
1.3 Módulo Math 7
import math
Una vez importado, podemos utilizar todas las funciones que trae el módulo.
El siguiente programa aproxima el valor de sen(x) por medio de una serie de potencias:
>> PI=3.14159265358979323846
>> valor = 0
>> x = PI/4
>> for i in range(0,11):
>> valor += ( ((-1)**i) * (x**(2*i+1)) )/(math.factorial(2*i+1))
>> print(round(valor,4))
El siguiente programa calcula los coef. del triángulo de Pascal utilizando combinatorias.
>> pot = 5
>> valores = [ ]
>> for i in range(0,pot+1):
>> num = int(math.comb(pot,i))
>> valores.append(num)
>> print(valores)
El siguiente código permite crear una fracción, simplificarla y calcular su distancia al origen
utilizando el máximo común divisor y el valor absoluto.
Observación. Podemos utilizar la función math.pi para utilizar el número pi y math.e para
utilizar el número e.
Las siguientes funciones permiten calcular el área de un cı́rculo dado su radio y el radio que
deberı́a tener un cı́rculo para tener el área dada utilizando la función math.pi, math.pow()
y math.sqrt().
Supongamos ahora que tenemos un cultivo de k bacterias en el tiempo 0 y que cada minuto
que pasa esta cantidad de bacterias se duplica. Las siguientes funciones permiten calcular
la cantidad de bacterias que habrá al cabo de t minutos y cuanto tiempo deberı́a pasar para
tener una determinada cantidad de bacterias partiendo de un cultivo de k.
>> cant bacterias = lambda k,t : f”Un cultivo de {k} bacterias tendrá una población de
1.3 Módulo Math 9
El siguiente programa permite ingresar dos lados de un triángulo y el ángulo entre medio
de dichos lados. El programa calcula las medidas de los demás lados y ángulos utilizando el
teorema del seno y del coseno.
>> a = 5
>> b = 7
>> gamma = 40
>> c = round(math.sqrt(a**2 + b**2 - 2*a*b*math.cos(math.radians(gamma))),2)
>> alpha = round(math.degrees(math.asin((a*math.sin(math.radians(gamma)))/(c))),2)
>> beta = round(180 - alpha - gamma,2)
>> print(f”Lados:\na: a\nb: b\nc: c”)
1.4 Módulo random 10
>> print( )
>> print(f”Ángulos:\nalpha: alpha\nbeta: beta\ngamma: gamma”)
Para que el programa efectúe los cálculos de manera correcta, se debe entregar gamma en
grados sexagesimales.
Observación.
Si queremos generar una secuencia de números aleatorios podemos utilizar un bucle
como for o while. (Se recomienda for)
Si creamos una semilla y queremos generar varios números pseudoaleatorios debemos
activarla varias veces dentro del programa. Si volvemos a compilar el programa y
tenemos solo un generador aleatorio, se repetirá el mismo número, por que cada vez
que corramos el programa se volverá a iniciar la semilla.
El siguiente programa genera una lista con el orden en la que pasaran una serie de estu-
diantes a presentar sus trabajos.
>> lista = [”Yordan Aguilar”, ”Daniel Varas”, ”Carla Silva”, ”Catalina Ruiz”]
>> j = len(lista)-1
>> print(”Orden de presentación\n”)
>> for i in range(0,5):
>> num = random.randint(0,j)
>> print(lista[num])
>> lista.pop(num)
>> j -= 1
El siguiente programa tiene una tupla formada por pares de datos donde está el nombre de
un participante y su número de la suerte. El programa va generando números aleatorios del 1
al 99 y se presenta al ganador cuando se halla el número de la suerte de una de las personas.
Ejercicios propuestos
Ejercicio 01. Crear un juego de Pokemon donde hayan dos pokemones en batalla. Cada
uno debe ser definido en una clase diferente que debe estar en un módulo distinto. Como
atributos deben tener su nombre, tipo y puntos de salud y como métodos, debe tener 6
ataques diferentes. Nosostros como entenadores debemos escoger nuestros propios ataques
y el contrincante debe escoger sus ataques al azar. Cada ataque disminuirá la vida del
contrario. El combate finalizará cuando uno de los dos tenga vida cero.
import statistics
Usualmente, se acostumbra a renombrar a este módulo como st. Una vez importado, pode-
mos utilizar todas las funciones del módulo.
El sigueinte programa realiza un análisis descriptivo de una muestra, incluyendo sus es-
tadı́sticos de tendencia central y de dispersión.
El siguiente código contiene dos muestras estadı́sticas sobre la edad y el peso y calcula la
correlación lineal y la recta de regresión lineal simple entre ellas.
>> print(correlacion)
>> print(f”y = {regresion lineal.slope}x + {regresion lineal.intercept}”)
import datetime
Módulo datetime
Comenzaremos importando el módulo datetime para el manejo conjunto de fechas y horas.
Una vez iniciada la fecha actual, es posible acceder a sus atributos diferenciados por medio
de las siguientes funciones:
Podemos asignar el datetime.now( ) a una variable y utilizarla para acceder a sus atributos.
1.6 Módulo datetime 15
>> print(f”La fecha actual es: año {fecha.year}, mes {fecha.month}, dı́a {fecha.day}”)
>> print(f”La hora actual es: hr {fecha.minute}, min {fecha.minute}, seg {fecha.second}”)
Podemos establecer nuestras propias fechas indicando el año, mes, dı́a, hora, minuto y
segundo que necesitemos. Para ello, escribimos:
Una vez creada la fecha, es posible acceder a sus atributos utilizando las mismas funciones
antes vistas para la fecha actual.
El siguiente código contiene una fecha inicializada por nosotros y dos funciones que la trans-
forman en un timestamp y que la regresan a su formato original.
Módulo date
Analicemos otro módulo de la librerı́a datetime. El módulo date nos permite entregar fechas
indicando solo el año, el mes y el dı́a. Para importarlo, utilizamos la siguiente sintáxis:
Podemos crear una fecha con la sintáxis nom var = date(year, month, day) y asignarle la
información que estimemos conveniente. La idea de crear una fecha utilizando date es que
no incluiremos la hora, los minutos y los segundos.
1.6 Módulo datetime 16
Módulo time
Analicemos otro módulo de la librerı́a datetime. El módulo time nos permite entregar horas
indicando solo la hora, el minuto y el segundo. Para importarlo, utilizamos la siguiente
sintáxis:
from datetime import time
Una vez importado, podemos comenzar a utilizarlo.
Podemos crear una hora con la sintáxis nom var = time(hour, minute, second) y asignarle
la información que estimemos conveniente. La idea de crear una hora utilizando time es que
no incluiremos el año, el mes y el dı́a.
Módulo timedelta
El último módulo que estudiaremos de la librerı́a datetime es el módulo timedelta. La idea
principal de importar timedelta es ser capaz de efectuar operaciones aritméticas con fechas
y horas, como sumas, restas, entre otros. Para importarlo, utilizaremos la siguiente sintáxis:
Observación.
Podemos utilizar los operadores de comparación para averigiar la relación que hay
entre dos fechas.
Los operadores clásicos de comparación que podemos utilizar son <, >, ≤, ≥, == y ! =.
1.6 Módulo datetime 17
Ejercicios propuestos
Ejercicio 01. Crear un programa que simule una tienda especializada en la venta de útiles
escolares (gomas, cuadernos, mochilas, carpetas, ...) donde podamos generar clientes que
asistan y compren productos.
El programa debe tener un módulo llamado Productos que tenga un diccionario como base
de datos, cuyas claves sean los números de identificación, y los valores, tuplas con el nom-
bre del producto y el precio. Debemos crear también un segundo módulo llamado Cliente
que contenga una clase con el mismo nombre, cuyos atributos sean su nombre, apellido y
presupuesto disponible, y como métodos tenga comprar y ver cesta de productos.
Invocar dichos módulos al programa principal y utilizarlos para crear clientes que asistan a
la librerı́a y compren. Los productos seleccionados se deben almacenar en una lista llamada
cesta de productos. Una vez que el usuario escoja todo lo que quiere comprar, debe poder
pagar todos los productos. Al pagar la cesta, debe generarse una boleta que contenga:
Nombre de la tienda
Si la cesta junta un valor superior a los $20.000, se debe aplicar un descuento del 15 % sobre
el monto final. El descuento, si procede, debe poder verse en la boleta. Por último, se debe
almacenar la boleta en una base de datos que nos permita recuperarla en caso de que se
requiera.
Capı́tulo 2
Como esta librerı́a no viene integrada en Python, es necesario descargarla de la web para
poder implementarla en nuestros programas. Para ello, abrimos la terminal de VS Code y
escribimos lo siguiente:
pip3 install sympy
Una vez instalada, puede ser invocada al programa principal para utilizar sus funciones. El
importe se hace de la siguiente forma:
import sympy
Generalmente se abrevia el nombre del módulo con la expresión “sp”. Los principales cálcu-
los que podemos realizar son los siguientes:
Polinomios y expresiones algebraicas
Cálculo y funciones
Matrices y determinantes
Estudiaremos y profundizaremos a continuación cada uno de estos temas.
2.1 Librerı́a Sympy 19
/ : división ∗∗ : potencia
También hay funciones avanzadas en sympy que vienen integradas y que podemos utilizar
para añadir complejidad a nuestras expresiones algebaricas:
Una vez definida la expresión algebraica, podemos evaluarla reemplazando sus variables de
la siguiente forma:
nombre variable.subs(variable, valor) # Una variable
nombre variable.subs([(x, x0), (y, y0), (z, z0), ...]) # Varias variables
El siguiente código muestra un programa que contiene varias expresiones algebraicas que
son evaluadas en distintos puntos.
No es necesario evaluar todas las variables, podemos dejar algunas sin reemplazar.
2.1 Librerı́a Sympy 20
Podemos utilizar una gran variedad de métodos para trabajar con expresiones algebraicas.
Algunas de ellas se muestran a continuación:
>> x = sympy.symbols(”x”)
>> print(sympy.factor(p1))
>> print(sympy.expand(p2))
>> print(sympy.simplify(p3))
>> print(sympy.trigsimp(p4))
>> print(sympy.apart(p5))
Por último, veremos que es posible permitir al usuario ingresar expresiones algebraicas al
programa. Para esto, debemos ingresar lo escrito en la terminal con la sentencia input( ) y
luego transformar el str en una expresión de sympy con la siguiente función:
sympy.sympify(cadena str)
Veamos un ejemplo de esto:
>> x = sympy.symbols(”x”)
Con esto, ya somos capaces de ingresar nuestras propias expresiones algebraicas y utilizar
las funciones de sympy para trabajarlas como deseemos.
2.1 Librerı́a Sympy 21
Observación. Para resolver ecuaciones con valor absoluto debemos agregar “real = True”
al momento de definir las variables.
------------------------------------------------------------
El primer sistema tiene solución única, el segundo, infinita, y el tercero, solución vacı́a.
2.1 Librerı́a Sympy 22
Intervalos en R
Podemos aprovechar las expresiones matemáticas que nos ofrece sympy para crear intervalos
matemáticos. Los más usuales son:
sympy.Interval(a, b) I. cerrado
sympy.Interval.open(a, b) I. abierto
sympy.Interval(a, b, left open = True) I. semiabierto a izquierda
sympy.Interval(a, b, rigth open = True) I. semiabierto a derecha
sympy.Interval(- sympy.oo, sympy.oo) I. no acotado
sympy.Interval(a, a) I. de valor único
Podemos hacer algunas operaciones con los intervalos. Las principales operaciones son:
intervalo1.union(intervalo2)
intervalo2.intersection(intervalo2)
intervalo1 - intervalo2
------------------------------------------------------------
Solución de inecuaciones
Podemos aprovechar las expresiones matemáticas de sympy para resolver inecuaciones de
cualquier tipo. Para esto, debemos considerar la siguiente función:
sympy.solveset(inecuacion, variable, domain = sympy.S.Reals)
El siguiente código presenta la solución de varios tipos de inecuaciones matemáticas:
El siguiente código define una función racional, la evalúa en algunos puntos y calcula su
dominio:
>> f = (x - 3)/(x**2 - 1)
sympy.limit(funcion, x, x0 ) Lı́mites
sympy.limit(funcion, x, x0 , +)
sympy.limit(funcion, x, x0 , −)
>> print(sympy.shape(m1))
>> print(sympy.shape(m2))
>> print(sympy.shape(m3))
Podemos crear matrices especiales utilizando algunos métodos del módulo sympy. Los prin-
cipales tipos son:
El método sympy.ones(m,n) permite crear una matriz de orden m×n cuyos coeficientes
son todos iguales a 1.
El método sympy.diag(a,b,c,...) permite crear una matriz diagonal con los elementos
entregados.
Podemos obtener elementos especı́ficos de la matriz, obtener sus filas, sus columnas, modi-
ficar la matriz e incluso eliminar filas o columnas especı́ficas.
Veamos un ejemplo. El siguiente programa contiene una matriz que es modificada, cam-
biando sus elementos y eliminando filas y columnas.
2.1 Librerı́a Sympy 25
>> matriz[5, 2] = 0
Podemos realizar algunas operaciones entre matrices utilizando los siguientes métodos:
Notemos que para calcular la matriz inversa debemos elevar a la potencia −1.
2.1 Librerı́a Sympy 26
Hay otras funciones que podemos aplicar a matrices utilizando el módulo sympy. Entre las
más interesantes se encuentran:
>> sistema = sympy.linsolve(sympy.Matrix([[1, 1, 1, 6], [1, -1, 2, 5], [1, -1, -3, -10]]), (x,y,z))
Debemos recordar que los coeficientes del sistema de ecuaciones son los de la matriz am-
pliada, por lo que se considera a la matriz de resultados con sus signos correspondientes.
Ejercicios propuestos
Ejercicio 01. Construir un programa que permita al usuario ingresar una función por
consola y que el programa le entrege los siguientes datos:
Máximos y mı́nimos
Ejercicio 02. Crear un programa que permita al usuario ingresar las ecuaciones de tres
rectas del plano y que este devuelva el área del triángulo formado. Utilizar el módulo sympy
para hallar la intersección de las rectas. Crear varias instancias para probar el programa y
corroborar con un graficador web.
2.2 Librerı́a Numpy 27
Como esta librerı́a no viene integrada en Python, es necesario descargarla de la web para
poder implementarla en nuestros programas. Para ello, abrimos la terminal de VS Code y
escribimos lo siguiente:
pip3 install numpy
Una vez instalada, puede ser invocada al programa principal para utilizar sus funciones. El
importe se hace de la siguiente forma:
import numpy
Generalmente se abrevia el nombre del módulo con la expresión “np”. Los principales objetos
que vamos a estudiar en este módulo son:
Arreglos de una dimensión o vectores
Arreglos de dos dimensiones o matrices
Estudiaremos y profundizaremos a continuación cada uno de estos temas.
>> print(v1)
>> print(v2.size)
>> print(v3.dtype)
de texto para asegurar la homogeneidad de tipos. Esta es una caracterı́stica muy importante,
pues los arreglos trabajan exclusivamente con datos de una sola clase.
nombre vector[indice]
De la misma forma, es posible extraer rangos de datos del vector indicando los ı́ndices donde
haremos el corte. Incluso, podemos agregar un salto.
Podemos crear vectores con un rango de datos entre a y b − 1, agregando un paso de c, con
la siguiente función:
np.arange(a, b, c)
De la misma forma, podemos crear vectores con una cantidad de elementos predefinida entre
dos números utilizando al función linspace.
np.linspace(a, b, cantidad)
Veamos algunos ejemplos para comprender mejor las funciones antes expuestas.
>> v1[2] = 10
Observación. También podemos utilizar la operación “vector / n” para dividir todos los
elementos del vector por n, y “vector ** n” para elevar todos los elementos del vector a n.
>> print(np.linalg.norm(v1))
Existen otras funciones especiales que podemos aplicar a vectores para mejorar su uso.
nombre vector.sort( ) Ordena los elementos del vector
Otras funciones útiles para el cálculo estadı́stico son aquellas que suman o multiplican todos
los elementos de la muestra. Estas, se implementan de la siguiente forma:
np.sum(nombre vector)
np.prod(nombre vector)
Por último, nos interesa saber, para la creación de tablas de frecuencia, los elementos que
forman parte de la muestra y la frecuencia con la que aparecen. Para esto, utilizaremos la
siguiente función:
Si le pasamos el ı́ndice cero, obtendremos una lista con los valores de la muestra. Si le
pasamos el ı́ndice uno, obtendremos una lista con la frecuencia de estos datos.
Veamos un ejemplo de como analizar una muestra utilizando las funciones estadı́sticas de
numpy.
>> muestra = np.array([50, 38, 43, 56, 51, 36, 25, 33, 41, 44,
>> 34, 39, 49, 37, 40, 50, 50, 35, 22, 45,
>> 44, 38, 14, 44, 51, 27, 44, 39, 50, 35,
>> 31, 34, 48, 48, 30, 42, 26, 35, 32, 63,
>> 36, 38, 53, 23, 39, 45, 37, 31, 39, 53])
>> m3 = np.ones((1,4))
>> m4 = np.zeros((2,2))
>> m5 = np.eye(4)
>> m6 = np.diag([1,2,3,4])
>> m7 = np.full((2,3), 10)
Podemos conocer algunas caracterı́sticas de las matrices utilizando las siguientes funciones:
nombre matriz.size N° elementos de la matriz
Ası́ como podemos acceder a los elementos, filas y columnas de la matriz, es posible modi-
ficarlas con las siguientes funciones:
Muchas veces necesitamos extraer o modificar elementos de una matriz que verifiquen una
condición especı́fica. Para esto, contamos con las siguientes funciones:
Estas funciones extraen los elementos de la matriz que cumplen una condición especı́fica.
Si lo deseamos, podemos reemplazarlos con un valor especı́fico. Algo importante a tener en
consideración es que, si deseamos agregar condiciones compuestas, podemos utilizar opera-
dores lógicos como & en reemplazo del and, y | en reemplazo del or. Veamos un ejemplo:
Por último, es posible utilizar arreglos 2-dimensionales (matrices) para resolver sistemas de
ecuaciones lineales, pasando directamente la amtriz de coeficientes y la amtriz de resultados.
Veamos algunos ejemplos. El siguiente código tiene un programa que considera varias ma-
trices y eraliza diferentes operaciones con ellas.
>> b = np.array([[0 ],
>> [9 ],
>> [-4]])
Como esta librerı́a no viene integrada en Python, es necesario descargarla de la web para
poder implementarla en nuestros programas. Para ello, abrimos la terminal de VS Code y
escribimos lo siguiente:
pip3 install pandas
Una vez instalada, puede ser invocada al programa principal para utilizar sus funciones. El
importe se hace de la siguiente forma:
import pandas
Generalmente se abrevia el nombre del módulo con la expresión “pd”. Los principales objetos
que vamos a estudiar en este módulo son:
Series
DataFrames
Índice 0 1 2 3
Valor Enero Febrero Marzo Abril
Columnas
Índice Nombre Dı́a Mes Año
0 Alice 23 Enero 2005
Filas 1 Bob 18 Febrero 1992
2 Charles 31 Marzo 2022
3 Dan 4 Abril 1983
Este método crea un dataframe por medio de un diccionario. Las claves son los encabezados
y los valores son los datos que ingresamos a las columnas.
2.3 Librerı́a Pandas 35
Por defecto, los ı́ndices parten en cero y van aumentando uno a uno marcando cada una de
las filas. Si queremos cambiar sus etiquetas, podemos agregar el parámetro index y pasarle
una lista con los nombres que queremos darles. Veamos un ejemplo:
Podemos cambiar el nombre de las filas y columnas por medio de las siguientes funciones:
nombre DF = nombre DF.rename(index = {nombre antiguo : nombre nuevo})
nombre DF = nombre DF.rename(columns = {nombre antiguo : nombre nuevo})
Veamos un ejemplo sencillo de como aplicar estas funciones:
------------------------------------------------------------
>> s2 = pd.Series([23, 25, 30], name = ”Edad”, index = [”Carla”, ”Javier”, ”Felipe”])
Tenemos algunas funciones especiales de la librerı́a pandas que permiten analizar los datos
del DataFrame. Estos son:
nombre DF.describe( ) Análisis estadı́stico
nombre DF.dtypes Tipo de dato por columna
nombre DF.shape Orden del DataFrame
Los tipos de datos son “int” para valores enteros, “float” para decimales y “object” para
cadenas de texto o strings.
2.3 Librerı́a Pandas 36
Podemos extraer filas o columnas especı́ficas de un dataframe con las siguientes funciones:
nombre dataframe.loc[fila]
nombre dataframe[columna]
Podemos extraer más de una fila o más de una columna a la vez. Esto se hace con las
siguientes funciones:
Veamos un ejemplo sencillo de como crear un dataframe y utilizar las funciones antes vistas
para analizar y seleccionar datos:
>> df = pd.DataFrame({
>> ”Nombre” : [”Javier”, ”Carlos”, ”Daniel”, ”Valentina”],
>> ”Apellido” : [”Iturra”, ”Alvarado”, ”Silva”, ”Pérez”],
>> ”Edad” : [17, 24, 36, 27],
>> ”Carrera” : [”Psicologı́a”, ”Ingenierı́a”, ”Pedagogı́a”, ”Enfermerı́a”]
>> })
El uso adecuado de estas funciones nos permite filtrar tablas de datos para analizar lo que
estimemos conveniente.
2.3 Librerı́a Pandas 37
Veamos un ejemplo donde consideramos un dataset y creamos una tabla de frecuencias para
su respectivo análisis:
>> muestra = np.array([50, 38, 43, 56, 51, 36, 25, 33, 41, 44,
>> 34, 39, 49, 37, 40, 50, 50, 35, 22, 45,
>> 44, 38, 14, 44, 51, 27, 44, 39, 50, 35,
>> 31, 34, 48, 48, 30, 42, 26, 35, 32, 63,
>> 36, 38, 53, 23, 39, 45, 37, 31, 39, 53])
>> valor = 0
>> frecuencia acumulada = [ ]
Una vez creado un dataframe, es posible guardarlo en nuestro computador. La idea de esto
es generar una copia de la información utilizada en el programa, ası́, no se pierde si se cierra
la aplicación. Para esto, utilizamos la siguiente función:
El parámetro index = false es para almacenar los datos del dataframe sin los tı́tulos de las
columnas y los identificadores de las filas. Si ponemos True, si se guardarán.
Es posible cargar otro tipo de archivos distintos a excel, como CSV, Json, PDF, etc.
Capı́tulo 3
Introducción a la visualización de
datos en Python
A lo largo de esta unidad, aprenderás a crear gráficos de lı́neas, barras, dispersión y más,
utilizando Matplotlib. Comenzaremos desde lo básico, como la instalación y configuración,
y avanzaremos hacia técnicas más avanzadas de personalización y exploración de diferentes
tipos de gráficos.
Al final de esta unidad, no solo serás capaz de crear visualizaciones impresionantes, sino
que también comprenderás cómo estas herramientas pueden potenciar tu capacidad para
extraer información valiosa de tus datos.
MatPlotLib, al ser una biblioteca no integrada de Python, requiere ser descargada e ins-
talada en nuestro sistema operativo. Para realizar dicha actividad, utilizamos el siguiente
código en la terminal de VS Code:
Una vez instalada, se procede a importar. Es usual trabajar con un módulo especial de esta
librerı́a llamado pyplot.
import matplotlib.pyplot as plt
Este módulo nos entrega una serie de herramientas de diseño para la personalización y
modificación de los gráficos.
3.1 Gráficos cartesianos 40
-------------------------------------------------------------
Estas funciones admiten otros parámetros especiales para mejorar y personalizar su formato.
Estas funciones se indican a continuación:
3.1 Gráficos cartesianos 41
El método color = “color” le dá un color al texto. Podemos pasar un color en inglés
o uno en formato hexadecimal.
-------------------------------------------------------------
Esta función admite otros parámetros opcionales para controlar su formato. Algunas de
estas son:
El método color = “color” le dá un color a la grilla. Podemos pasar un color en inglés
o uno en formato hexadecimal.
El método linestyle = “estilo” cambia el estilo de las lı́neas de la grilla. Puede ser uno
de los siguientes: - - - -. :
El método axis = “eje” permite controlar las lı́neas que se mostrarán en la grilla. Si
ponemos “x” solo se mostrarán las lı́neas verticales y si ponemos “y” se muestran solo
las horizontales.
-------------------------------------------------------------
El método plt.legend( ) establece una leyenda para marcar los diferentes objetos que
agregemos al gráfico.
Esta función admite un parámetro opcional llamado loc = “localización”. Esto nos permite
ubicar la layenda donde nosotros queramos. Por defecto es “best” que es la mejor posición
3.1 Gráficos cartesianos 42
pero nosotros podemos modificarla y dejarla donde queramos según el siguiente cuadro de
posiciones:
-------------------------------------------------------------
Esta función admite otros parámetros especiales para mejorar y personalizar su formato.
Dentro de las principales están:
El método color = “color” le dá un color al texto. Podemos pasar un color en inglés
o uno en formato hexadecimal.
El texto puede ser escribo en lenguaje LaTex, para ello, utilizamos las instrucciones dentro
de $...$. Podemos rotar pasando rotate = angulo.
-------------------------------------------------------------
Podemos utilizar estas rectas para crear los ejes del plano, tanto el eje x como el eje y.
3.2 Gráfica de puntos, segmentos y vectores 43
Esta función admite otros parámetros especiales para mejorar y personalizar su formato.
Dentro de las principales están:
El método color = “color” le dá un color al texto. Podemos pasar un color en inglés
o uno en formato hexadecimal.
x = [x1 , x2 , ..., xn ]
y = [y1 , y2 , ..., yn ]
El método plt.scatter(x,y) permite graficar todos los puntos indicados por las listas
del eje x y del eje y.
Esta función admite otros parámetros para el control del formato. Las principales son:
zorder = numero permite superponer los puntos sobre otros objetos del plano.
label = “nombre” permite poner un nombre a los puntos. Este será el nombre que
indicaremos en la leyenda.
Veamos un ejemplo de como utilizar estas funciones para la creación de puntos en el plano.
Podemos combinar puntos con segmentos para crear figuras geométricas poligonales.
3.2 Gráfica de puntos, segmentos y vectores 44
Podemos graficar segmentos en el plano cartesiano por medio de la función plt.plot. Esta
se explica a continuación:
x = [x1 , x2 , x3 , ..., xn ] y = [y1 , y2 , y3 , ..., yn ]
El método plt.plot(x,y) permite graficar segmentos que vayan desde (xi , yi ) hasta
(xi+1 , yi+1 ) siguiendo ordenadamente las listas.
Esta función admite otros parámetros para el control del formato. Las principales son:
color = “color” modifica el color de los puntos.
zorder = numero permite superponer los segmentos sobre otros objetos del plano.
label = “nombre” permite poner un nombre a los segmentos. Este será el nombre que
indicaremos en la leyenda.
-------------------------------------------------------------
Podemos sombrear un área del plano por medio de la función plt.fill. Esta, en conjunto
con los puntos y segmentos, permite la creación de figuras geométricas.
x = [x1 , x2 , x3 , ..., xn ] y = [y1 , y2 , y3 , ..., yn ]
El método plt.fill(x,y) permite sobrear la región limitada por los puntos indicados.
Algunos parámetros que podemos agregar a esta función son:
color = “color” modifica el color de los puntos.
zorder = numero permite superponer los segmentos sobre otros objetos del plano.
3.3 Gráfica de funciones en R2 45
Podemos graficar vectores en el plano cartesiano por medio de la función plt.quiver. Esta
se explica a continuación:
Algunos parámetros opcionales que podemos agregar para mejorar la gráfica son:
label = “nombre” le dá un nombre al vector. Este será el nombre que veremos en la
leyenda, en caso de que esta esté activada.
-------------------------------------------------------------
Podemos sombrear el área entre curvas por medio de la función plt.fill between. Esto
se hace de la sigueinte manera:
El método plt.fill between(x, y1, y2) permite sombrear el área entre las funciones y1
y y2 considerando su mismo dominio.
Podemos agregar parámetros para mejorar la gráfica de la siguiente forma:
where = (y1 > y2) indica donde se debe sombrear la curva. En este caso, donde la
función y1 esté sobre la función y2. Podemos dar condiciones con & y |.
color = “color” permite modificar el color del sombreado.
alpha = numero permite modificar la transparencia del sombreado. (0 ≤ alpha ≤ 1)
Para el área entre dos puntos escribimos plt.fill between(x, y, where = ((x>a) & (x<b))).
3.3 Gráfica de funciones en R2 47
Podemos poner varios gráficos en un solo script. Para esto, debemos crear cada uno de
los gráficos por separado y luego ir personalizándolos uno por uno.
Si queremos mostrar el script, usamos plt.show( ) igual que antes. Para modificar los gráfi-
cos, vamos accediendo uno por uno por medio del nombre ax1, ax2, ... y anteponiendo el
término “set ” antes de cada función.
El método color = “color” le dá un color al texto. Podemos pasar un color en inglés
o uno en formato hexadecimal.
Veamos un ejemplo de como utilizar estas funciones para hacer dos gráficos en un solo
script.
Se pueden utilizar gráficos dobles para comparar y analizar dos o más funciones del plano.
3.4 Gráficos estadı́sticos 48
plt.scatter(x, y) Gráfica
Algunos parámetros opcionales que podemos añadir a la gráfica son los siguientes:
Podemos graficar una serie de observaciones y calcular la recta de regresión lineal utilizando
el módulo statistics. Veamos un ejemplo:
Podemos utilizar gráficos dobles para comparar un polı́gono de frecuencia absoluta con uno
de frecuencia acumulada.
3.4 Gráficos estadı́sticos 50
plt.bar(x, y) Gráfica
color = “color” modifica el color de las barras del gráfico. Puede entregarse en inglés
o en formato hexadecimal.
Veamos un ejemplo de como crear gráficos de barra, tanto verticales como horizontales,
utilizando las funciones de personalización.
Estos gráficos pueden ser útiles tanto para variables cuantitativas como cualitativas.
3.4 Gráficos estadı́sticos 51
Esta sentencia admite ciertos parámetros para personalizar su estructura. Las principales
funciones son:
color = “color” modifica el color de las barras del gráfico. Puede entregarse en inglés
o en formato hexadecimal.
Es común utilizar algunas funciones especiales para mejorar el diseño de los histogramas.
Se recomienda calcular el número de intervalos y la amplitud de estos mismos por medio
de las siguientes ecuaciones:
r
k = 1 + 3.322 · log(n) r = xmáx − xmı́n a=
k
En este caso, k es el número aproximado de intervalos, r es el rango de los datos y a es la
amplitud.
Otra cosa a considerar es que, los histogramas, son gráficos diseñados para variables estric-
tamente cuantitativas, no se pueden emplear para otro tipo de variables como los gráficos
de barra. El eje base de las barras deben ser números.
3.4 Gráficos estadı́sticos 52
Estos gráficos indican la normalidad de los datos cuando la mediana está en el centro.
3.4 Gráficos estadı́sticos 53
Esta sentencia admite ciertos parámetros para personalizar su estructura. Las principales
funciones son:
explode = [sacados] permite sacar algunas rebanadas del gráfica para hacerlas sobre-
salir. Las que no queremos sacar las indicamos con cero.
colors = [colores] permite modificar los colores de cada rebanada del gráfico.
Los gráficos circulares, de anillo o de torta son especialmente útiles cuando se analiza va-
riables cualitativas. Permite analizar la distribución y la frecuencia porcentual de los datos
para ası́ conocer las clases más relevantes del dataset.
3.5 Procesamiento de imágenes 54
-------------------------------------------------------------
Podemos analizar algunas caracterı́sticas de la imágen por medio de las siguientes funciones:
El método nombre imagen.format indica el formato de la imágen (png, jpg, ...)
El método nombre imagen.size indica la resolución de la imágen en pixeles.
Veamos un ejemplo de como cargar imágenes y como analizar sus caracterı́sticas.
3.5 Procesamiento de imágenes 55
Podemos guardar una imágen cargada al programa donde nosotros le indiquemos. Para ello,
debemos utilizar la siguiente función:
nombre Imagen.save(“dirección”)
Veamos algunas funciones del módulo PIL para modificar las imágenes y aplicar filtros:
Al recortar una imagen debemos tener cuidado con las dimensiones que damos. Tanto la
izquierda como la derecha se miden desde la izquierda y tanto la parte de arriba como la
de abajo se miden desde arriba. Por ende, la derecha debe ser mayor a la izquierda y la
medida de abajo debe ser mayor a la medida de arriba.
Esta función permite pegar una imágen sobre otra. Las coordenadas (x, y) indican la posición
donde pegaremos la imágen. Podemos recortar o redimensionar la imagen que pegaremos.
Esta función permite rotan una imágen en el ángulo que nosotros deseemos. El ángulo debe
ser entregado en grados sexagesimales.
La combinación de estas funciones permite modificar imágenes como mejor nos parezca.
Una vez modificada, las podemos guiardar con la función save( ).
3.5 Procesamiento de imágenes 56
Veamos un ejemplo de como utilizar estas funciones para recortar y pegar imágenes sobre
otras.
Si nos damos cuenta, las imágenes pegadas presentan un fondo negro. Idealmente, no de-
verı́an tenerlo, por tal razón es que veremos a continuación como pegar imágenes sin fondo:
Paso 01
Se carga la imagen de fondo y la imágen a pegar. Esta se debe convertir a formato RGBA.
fondo = Image.open(“dirección”)
Paso 02
Se redimensiona la imágen que se va a superponer sobre el fondo.
Paso 03
Se crea una nueva imágen completamente transparente donde pegaremos la imagen a su-
perponer ya redimensionada.
En este caso, fondo.size permite crear una imágen transparente del mismo tamaño del fondo
y el vector (0,0,0,0) lo deja transparente.
Paso 04
Se pega ahora la imágen que vamos a superponer sobre la imágen transparente recién creada.
Paso 05
Se vuelve a montar la imágen transparente sobre el fondo original, ahora con la imagen ya
superpuesta.
En este caso, la función alpha composite permite fusionar dos imágenes considerando la
transparencia de la nueva imágen.
3.5 Procesamiento de imágenes 57
Veamos un ejemplo de como utilizar estas funciones para recortar y pegar imágenes sobre
otras considerando un fondo transparente.
Por último, el módulo Pillow nos permite aplicar determinados filtros a las imágenes para
cambiar su aspecto. Para ello, lo primero que debemos hacer es importar el siguiente módulo:
Una vez hecho esto, utilizamos la siguiente función para aplicar filtros a imágenes:
nombre imagen.filter(filtro)
ImageFilter.BLUR
ImageFilter.CONTOUR
ImageFilter.EMBOSS
ImageFilter.FIND EDGES
También es recomendable, de ser necesario, aplicar un alias a los objetos importados para
mejorar la legibilidad del código y facilitar la programación.
Se recomienda crear módulos con nombres únicos para evitar problemas de importación.
Por último, se recomienda utilizar paquetes para organizar módulos y legibilizar el código.
A su vez, se recomienda establecer carpetas especı́ficas para almacenar las imágenes, bases
de datos, entre otros.
Todos los docstrings se escriben como comentarios entre triple comillas. Para indicar tı́tulos
debemos dejar un salto de lı́nea y debajo agregar una serie de iguales. Para indicar subtı́tulos
59
debemos dejar un salto de lı́nea y debajo agregar una serie de guiones. Para destacar texto
debemos indicarlos entre comillas dobles y para mostrar ejemplos utilizamos triples signo
mayor que, es decir, >>>.
En el caso de las funciones, podemos agregar otros marcadores que nos permitan documentar
el tipo de variables que se debe introducir y el tipo de resultado que se obtendrá. Para ello,
debemos indicar con dos puntos el tipo de variable y con una flecha el tipo de resultado.
Manejo de errores
El manejo de errores es muy importante cuando se diseñan programas en Python. El uso
adecuado de las sentencias Try - Except y la proporción de mensajes claros para facilitar la
depuración son de vital importancia.
Se recomienda implementar excepciones donde sea necesario para evitar los errores.
Siempre se debe programar pensando en que el usuario utilizará el programa de toda las
formas posibles, sobre todo mal.
Depuración en VS Code
Una de las herramientas importantes que nos entrega VS Code es la depuración del código.
Esta nos permite revisar lo que está sucediendo en nuestro programa paso a paso mientras
se ejecuta. Para hacer esto, debemos seguir los siguientes pasos:
1. Debemos configurar los puntos de interrupción. Estos puntos indican las lı́neas de
código donde el programa se detendrá. Para hacerlo, debemos marcar los puntos rojos
que están situados alado de los indicadores de las lı́neas.
3. Una vez iniciado, podemos controlar la ejecución con las flechas de la parte superior.
Esto nos muestra como avanza el programa y como se van cargando las variables.
Veamos un ejemplo de como depurar un programa que no está funcionando bien para
identificar el problema.
La parte izquierda nos va indicando como se modifican las variables y que valores toman.
Esto nos permite saber si estas están tomando los valores que realmente deben tomar o si,
en su defecto, tenemos un error de semántica.
Notemos que los puntos rojos del lado izquiero son los puntos donde el programa se inte-
rrumpe y el triángulo amarillo indica donde se está ejecutando.
61
Una vez identificados los problemas del prograba, se procede a arreglar para que este fun-
cione como nosotros queremos.
Indent - rainbow agrega bloques de colores para marcar la indentación del código.
Better - comments crea tipos de comentarios, cambiando colores para que sea más
facil entender lo que queremos programar.
Error - lens muestra errores de sintáxis a lo largo del código. Es muy util para
depurar mientras se programa.
Onedark pro cambia el color del visual studio code. Uso el estilo dark.
Estas extensiones nos ayudan a mejorar nuestro programa para que se vea mejor y nos
permita programar de mejor manera.