Bienvenido al curso Introducción con Python a Data Science¶

Objetivos¶

  • Reconocer los usos del lenguaje python.
  • Comprender los conceptos y funcionalidades básicas de Python
  • Desarrollo de código para el diseño de soluciones.

Indice¶

Inicio ▲

  1. Hola Python
  2. Funciones
  3. Booleanos y condicionales
  4. Listas
  5. Ciclos
  6. Diccionarios
  7. Trabajando con librerias
  8. Libreria Numpy
  9. Libreria Plotly
  10. Scikit-Learn

Hola Python 🚀¶

Inicio ▲

Este curso introductorio cubre los aspectos básicos del lenguaje Python, que necesitaras para iniciar en el área de Data Science.Este curso esta dedicado principalmente para aquellos que ya tienen experiencia con código o incluso otro lenguaje como R,Julia,Matlab,entre otros.

Primero comenzaremos con la sintáxis de Python,asi como la asignación de variables y operaciones aritméticas.

Generalmente en un proyecto de data science,necesitamos exponer resultados de modelos,gráficos y/o análisis.De esta forma un primer mensaje que podriamos desarrollar,seria que nuestro proyecto fue exitoso,para esto debemos definir la variable en donde guardaremos el mensaje "El proyecto fue exitoso".

In [51]:
mensaje="El proyecto fue exitoso"
print(mensaje)
El proyecto fue exitoso

Como pueden ver exponer resultados en python,no es tan difícil como podriamos pensar.

Asi como en el bloque de código anterior,en Python se puede trabajar con distintos tipos de variables: Númericas,String,entre otros subtipos.Pero cabe destacar que cuando hablamos de variables numéricas,con ellas podemos realizar todo tipo de operaciones aritméticas y con las variables de tipo String podemos generar textos que muestren la salida de un proceso exitoso o incluso generar documentación.

A continuación podemos ver un ejemplo de una variable numérica que almacena el valor 33 y un variable de tipo string que guarda el texto "Esta es mi edad"

In [52]:
numero=33
frase="Esta es mi edad"

Sin embargo podriamos trabajar con ambas variables en conjunto y mostrarlo como una salida,como se muestra continuación con la variable print()

In [53]:
print(frase,numero)
Esta es mi edad 33

Ya hemos visto dos tipos de variables,sin embargo si tenemos dudas acerca de la definción podemos verificar el tipo de variable con que estamos trabajando.

In [54]:
type(numero)
Out[54]:
int
In [55]:
type(frase)
Out[55]:
str

Como podemos ver en la salida del bloque,la variable que almacena el valor número es de tipo "int",esto es una abreviación para "integer" o "entero",en cambio para la variable frase el tipo es "str" haciendo referencia a "string" o cadena de texto. Sin embargo,tambien podriamos definir una variable que almacene un valor numérico como texto,en este caso no podriamos realizar operaciones aritmeticas con el

In [56]:
otro_numero="28.2"
type(otro_numero)

print("La variable otro_numero,almacena el valor",otro_numero)
La variable otro_numero,almacena el valor 28.2

Sin embargo si quisieramos trabajar con variables numéricas con valores decimales como "30.2" "23.4" u otros podemos definir variable de tipo float.

In [57]:
numero_decimal=30.2

print("La variable numero_decimal,tiene el valor ",numero_decimal,
      "y es de tipo",type(numero_decimal))
La variable numero_decimal,tiene el valor  30.2 y es de tipo <class 'float'>

De esta forma si quisieramos realizar operaciones aritmeticas con variables de tipo entero o float,podemos realizar las operaciones listadas en la siguiente tabla.

Sintaxis Operación Descripción
x + y Adición La suma de x e y
x - y Sustracción La diferencia entre x e y
x * y Multiplicación El producto entre x e y
x / y División El cuociente entre x e y.
x % y Modulo El valor entero restante,luego de dividir x entre y.
x ** y Potenciación El resultado de elevar x a y.
-x Negación El valor negativo de x.

De acuerdo a lo anterior,podriamos realizar algunas operaciones básicas como suma,resta,división y multiplicación... definiendo previamente las variables x e y.

In [58]:
x=10
y=2
In [59]:
print(x+2)
12
In [60]:
print(x-2)
8
In [61]:
print("La división de x entre y es:",x/y)
La división de x entre y es: 5.0
In [62]:
print("La multiplicacion entre las variables x e y es:",x*y)
La multiplicacion entre las variables x e y es: 20

Pero tambien podriamos realizar algunos cálculos un poco mas complejos,como determinar volúmenes de cubo,conos,u otras figuras.

In [63]:
lado=5
print("Un cubo de lado",lado,"tiene un volumen de:",lado**3,"cm^3")
Un cubo de lado 5 tiene un volumen de: 125 cm^3
In [64]:
alto=2
ancho=4
largo=7

print("El volumen de un paralelepipedo que tiene alto",alto,"ancho",ancho,"y largo",largo,"es de: ",alto*ancho*largo,"cm^3")
El volumen de un paralelepipedo que tiene alto 2 ancho 4 y largo 7 es de:  56 cm^3

Funciones 🎸¶

Inicio ▲

Asi como en la sección anterior vimos como definir,manipular algunos tipos de variables e incluso definir algunas fórmulas,en otros casos necesitaremos definir procedimientos más complejos y/o que requieren de varios pasos para su ejecución y para esto utilizaremos funciones,las cuales las podemos utilizar cada ves que deseemos.

Como una primera función podríamos definir una función simple que imprima por pantalla algunos valores

In [65]:
def funcion_saldo(nombre):
    "Esta es la ayuda de la funcion"
    
    saldo=100
    return print("Buen dia: ",nombre,"su saldo en cuenta es de:",saldo)

funcion_saldo(nombre="juan")
Buen dia:  juan su saldo en cuenta es de: 100

Toda funcion en Python,parte con la palabra reservada def,luego el nombre que en este caso es funcion_saldo y dentro de paréntesis las variables que acepta la función.Una vez que la variable acepta la variable nombre,se genera un saldo de 100 y se guarda en la variable saldo,finalmente la funcion retorna un mensaje para el usuario.

Sin embargo, si queremos saber un poco mas acerca de la función podemos llamar a la ayuda de esta con la funcion help()

In [66]:
help(funcion_saldo)
Help on function funcion_saldo in module __main__:

funcion_saldo(nombre)
    Esta es la ayuda de la funcion

En este caso se entrega la información de ayuda de la función.Sin embargo,podemos agregar una información mas detallada para la descripción de la función utilizando dentro de ella la triple comillas """

In [67]:
def funcion_saldo(nombre):
    """Esta es la ayuda de la funcion.Esta función genera un 
    mensaje de salida con el nombre que se le entrega y el saldo que 
    por defecto se encuentra en 100"""
    
    saldo=100
    return print("Buen dia: ",nombre,"su saldo en cuenta es de:",saldo)

help(funcion_saldo)
Help on function funcion_saldo in module __main__:

funcion_saldo(nombre)
    Esta es la ayuda de la funcion.Esta función genera un 
    mensaje de salida con el nombre que se le entrega y el saldo que 
    por defecto se encuentra en 100

A diferencia del código anterior, ahora si se muestra de forma explícita que es lo que hace la función, lo cual se agrego en la nueva definición de la función "funcion_saldo".

Pero también podemos definir funciones que realicen algunas operaciones mas extensas,asi como operaciones matemáticas que tomen distintos valores segun las variables que se le definan a la función.

En este caso la funcion diferencia,determina las diferencias absolutas que existen entre 3 variables a,b y c.Asi, las diferencias se determinan al interior de la función y luego se retornan junto al texto que muestra entre que pares de variables se determinan las diferencias,cabe destacar que para esta función tambien se escribio la ayuda.

In [68]:
def diferencia(a,b,c):
    """ Esta funcion retorna la diferencia entre 3 valores que se le entregan"""
    dif1=abs(a-b)
    dif2=abs(a-c)
    dif3=abs(b-c)
    return print("La diferencia entre a y b es",dif1,"La diferencia entre a y c es",dif2,"y la diferencia entre b y c es",dif3)

help(diferencia)

diferencia(10,20,30)
Help on function diferencia in module __main__:

diferencia(a, b, c)
    Esta funcion retorna la diferencia entre 3 valores que se le entregan

La diferencia entre a y b es 10 La diferencia entre a y c es 20 y la diferencia entre b y c es 10

Pero aún se pueden complicar las cosas un poco mas...👀 En muchos casos utilizaremos funciones para tareas específicas,pero en otros podríamos necesitar aplicar a una función otra función de forma inmediata,de esa forma a la salida de la primera se le aplicara una nueva función.Si creamos una primera función multi_1(x), la que multiplica por 2 el valor de entrada podríamos modificar la salida con una nueva función multi_2(fn)

In [69]:
def multi_1(x=2):
    """Esta primera función solo multiplica por 2 la variable de entrada,por defecto el valor de entrada esta fijado en 2"""
    y=x*2
    return y

def multi_2(fn):
    """ Esta funcion toma la salida de otra funcion y la multiplica por 2"""
    z=fn*3
    return z


multi_2(multi_1(10))
Out[69]:
60

Asi podemos llamar a una función dentro de otra,en este caso al dar el valor de entrada como 10 a la función multi_1(),esta lo multiplica por 10 y devuelve un 20.Asi luego este valor 20 lo toma la función multi_2() y lo multiplica por 3,obteniendo asi el valor 60 que se muestra por pantalla.

Booleanos y condicionales 🕹¶

Inicio ▲

Ya vimos que en python existen distintos tipos de variables como "integer" y "string",pero no siempre trabajaremos con números o texto.Podemos utilizar las variables "bool",las cuales tienen 2 posibles valores "True" o "False".

Estas variables las podemos obtener como salida de otras funciones,pero tambien podemos definir y validar este tipo de variable cada vez que sea necesario.

In [70]:
x=True
print(x)
print(type(x))
True
<class 'bool'>

En este caso podemos ver que el valor de x,es "Verdadero" y al validar el tipo de variables que es x,nos devuelve por pantalla que es "bool" o "booleano".

También podemos definir otras variables y verificar si sus valores son iguales o distintos.

In [71]:
y=False

x==y
Out[71]:
False

En este caso al definir una nueva variable y como "False",podemos observar que al verificar con el signo "==" si son iguales,se nos devuelve el valor "False",debido a que x tiene asignado el valor Verdadero en cambio y tiene asignado el valor Falso.

Sin embargo podemos utilizar varios operadores entre variables booleanas según corresponda.

Operación Descripción
x == yx es igual y
x < yx es menor y
x <= yx es menor o igual que y
x != yx no es igual a y
x > yx es mayor que y
x >= yx es mayor o igual que y

Asi podemos integrar este tipo de variables y las operaciones ya definidas en alguna función que realice algun otro procedimiento mas extenso.

In [72]:
def cajero(tarjeta):
    """ La función permite validar si el tarjeta tiene saldo o no """
    
    saldo=100
    if tarjeta==True:
        return print("Su saldo es de",saldo)
    else: 
        return print("No se puede verificar su saldo en este momento")
              

cajero(tarjeta=True)
Su saldo es de 100

Asi se puede verificar que si la variable tarjeta tiene el valor verdadero en el cajero,la función cajero devuelve el mensaje "Su saldo es de 100" y en caso contrario no puede validar el saldo.

Funciones y condiciones¶

Como vimos en el código anterior podemos verificar el valor asignado a una variable numérica,booleana o string,mediante un operador y una condición. Esto debido a que si una variable cumple cierta condición,se ejecuta un bloque de código,sino se ejecuta otro bloque de código.

Aunque también podemos verificar si se cumple mas de una condición, como en la siguiente función inspector.

In [73]:
def inspector(x):
    if x==0:
        print(x,"Es cero")
    elif x>0:
        print(x,"Es positivo")
    else: 
        print(x,"Es negativo")

inspector(0)
inspector(-10)
0 Es cero
-10 Es negativo

En este caso la función una vez que se le entrega un valor numérico,es capaz de determinar si es igual a 0,mayor a 0 o incluso si es menor que 0.

Esto se realiza mediante la condición if,en donde esta condición if verifica que se cumpla la condición x==0,sino se cumple se utiliza la verificación de que sea mayor a 0 con elif y si no se cumple ninguna de las 2 anteriores se ejecuta el ultimo bloque de código correspondiente al print(x,"Es negativo").

Algunas últimas consideraciones para las variables booleanas.Podemos convertir casi cualquier tipo de dato a una variable booleana,de esta forma todo valor positivo o texto no vacío sera considerado en Python como un valor Verdadero y el valor 0 o texto vacío como Falso,como en el siguiente caso.

In [74]:
print(bool(12))
print(bool("hola"))
print(bool(0))
print(bool(""))
True
True
False
False

Listas 🏗¶

Inicio ▲

Las listas en python son una estructura de datos similar a lo que hacemos con las variables que ya conocemos,pero nos permiten realizar operaciones mas complejas.

De esta forma en una lista podemos almacenar una secuencia de valores, como las listas generadas para las variables primos y días a continuación.

In [75]:
primos=[2,3,5,7]

dias=["Lunes","Martes","Miercoles","Jueves","Viernes"]

Como se puede ver ambas son listas, sin embargo en la primera almacenamos solo valores númericos y en la segunda se guardan string.

Pero lo podemos llevar un poco más allá y crear una lista de listas 👀

In [76]:
cartas=[["j","q","k"],[2,3,5],[5,"A","K"]]

En este caso generamos una lista compuesta por 3 listas,sin embargo cada una de estas listas es diferente.La primera solo contiene valores string,la segunda solo valores numéricos y la tercera contiene tanto valores numericos como string.

Ya que tenemos una lista que tiene una estructura mas extensa,podríamos querer seleccionar alguno de sus valores y no siempre tratar con la lista cartas completa.Asi podriamos seleccionar

In [77]:
print(cartas[1])

print(cartas[2])
[2, 3, 5]
[5, 'A', 'K']

Asi podemos seleccionar la segunda lista de cartas o incluso seleccionar la tercera lista de cartas.Pero incluso podríamos seleccionar uno de los elementos de estas listas como en el siguiente bloque.

In [78]:
print(cartas[1][0])

print(cartas[2][2])
2
K

Ahi se puede ver como podemos seleccionar el primer elemento de la segunda lista obteniendo el valor de 2 o seleccionar el tercer elemento de la tercera lista obteniendo el string K.

Pero si una vez que definimos la lista carta,queremos agregar una nueva mano... perdón una nueva lista,podemos hacerlo con la siguiente asignación.

In [79]:
cartas[0]=["A","J","Q"]

cartas
Out[79]:
[['A', 'J', 'Q'], [2, 3, 5], [5, 'A', 'K']]

Ahora como era de esperar,también podemos utilizar algunas funciones sobre estas listas.En este caso podríamos querer determinar la cantidad de días que tiene la variable días 😅... o incluso ordenar los días de forma alfabética ... o incluso operaciones matemáticas como la suma de los números primos o determinar el máximo de ellos.

In [80]:
# Cuantos dias hay en una semana
print(len(dias))

# Ordenar los dias de forma alfabetica
print(sorted(dias))

# suma de los numeros primos
print(sum(primos))

# maximo de los numeros primos
print(max(primos))
5
['Jueves', 'Lunes', 'Martes', 'Miercoles', 'Viernes']
17
7

Métodos¶

A diferencia de las funciones que ya vienen creadas en python o las que podemos definir nosotros.También existen métodos que vienen ya creados en python Built-in,los que sin embargo dependen del tipo de variable con la que estemos trabajando

Algunas de los métodos que desarrollados en Python para distintos tipos de variables:

MétodoDescripción
capitalize()Convierte en mayuscula la primera letra del string.
index()Busca la posición de un caracter y la devuelve.
split()Divide un string,según el separador que se indique y lo convierte en lista.
upper()Convierte todas las letras de un string en mayusculas.
lower()Convierte todas las letras de un string en minusculas.
In [81]:
texto="este es un texto de prueba"
texto.capitalize()
Out[81]:
'Este es un texto de prueba'
In [82]:
texto.index("texto")
Out[82]:
11
In [83]:
texto.split()
Out[83]:
['este', 'es', 'un', 'texto', 'de', 'prueba']
In [84]:
texto.upper()
Out[84]:
'ESTE ES UN TEXTO DE PRUEBA'
In [85]:
texto.lower()
Out[85]:
'este es un texto de prueba'

Pero también podríamos utilizar métodos sobre variables numéricas,listas y otros.Sin embargo la diferencia principal entre un método y una función es que los métodos siempre seran parte de una clase,de otra forma son parte de las funcionalidades que le podemos dar a un objeto.

Tal vez hasta el momento no hemos hablando de objetos,sin embargo los objetos son una de las características principales de Python,ya que este es un software que soporta la Programación Orientada a Objetos (POO),en un posterior curso.

Tuplas¶

Las tuplas son similares a las listas,sin embargo tienen algunas diferencias con las listas.En un principio las podemos definir de forma similar la generada y guardada en la variable t

In [86]:
t=(1,2,3)
t
Out[86]:
(1, 2, 3)

En este caso solo cambiamos el tipo de parentesis para crear la tupla t,sin embargo si quisieramos cambiar alguno de los valores de la tupla como en los casos anteriores no podemos,a continuación se muestra un error forzado... 👀

In [87]:
t[0]=1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In [87], line 1
----> 1 t[0]=1

TypeError: 'tuple' object does not support item assignment

Pero como ya vimos,también podemos utilizar métodos sobre tuplas.En este caso si tenemos una variable tipo float,podemos utilizar el método as_integer_ratio() para devolver una tupla compuesta por el numerador y denominador de la variable float.

In [ ]:
x=0.125
numerador,denominador=x.as_integer_ratio()
print(numerador/denominador)

Ciclos 🎰¶

Inicio ▲

Todo en la vida es un ciclo... bueno no precisamente como los que vamos a ver ahora,pero sin duda que mucho tienen en común con la repetición de rutinas.Como hemos visto podemos definir listas de cadenas de texto,en este caso podemos definir una lista con los días de la semana.

Ciclo for¶

In [ ]:
dias=["Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"]

Y podríamos ir mostrando por pantalla cada uno de los días con un ciclo for

In [ ]:
for i in dias:
    print(i)

Como se puede ver el ciclo for itera la variable i sobre la lista días,asi va tomando cada uno de los valores e imprime el día por pantalla.

En cambio si tomaramos una lista numérica y la iteramos de igual forma,solo imprimiria los valores numéricos de esta lista.

In [ ]:
numeros=[1,2,3,4,5]

for j in numeros:
    print(j)    

Así podemos ver que en este caso cambiamos la lista para luego iterar con una nueva variable,en este caso j.

Además no solo podemos iterar los valores en una lista, también podriamos realizar alguna operación dentro del ciclo, en este caso definimos una nueva lista y luega la variable producto.

In [ ]:
multiplicativos=(2,2,2,3,3,5)
producto=1

for i in multiplicativos:
    producto=producto*i

producto

En este caso el ciclo for itera los valores de lista multiplicativos y luego en cada iteración multiplica el valor de la variable producto por el valor de multiplicativos y lo almacena.

In [ ]:
for i in range(5):
    print("Este i es el numero: ",i)

Retomando el primer ciclo,también podriamos utilizar la función range(), para optimizar la iteración de la variable i.Así no es necesario definir la lista a iterar y solo asignamos el valor hasta el que deseamos iterar a la función range().

Ciclo While¶

Además del ciclo for que vimos en la sección anterior,también podemos querer iterar una lista o un proceso mientras se cumpla una cierta condición.Para esto utilizamos el ciclo while,que a diferencia del caso anterior en donde iteramos una variable,para el ciclo while esperamos que mientras se cumpla una condición se ejecutaran las intrucciones que estan dentro de el.

Cabe destacar que para el ciclo while hay que tener una consideración especial,ya que si la condición que establecemos no se cumple nunca el ciclo while se ejecuta de forma infinita pudiendo ocasionar que el software o el pc consuma toda la memoria y teniendo que reinciar el proceso o incluso el pc.

A continuación se define el valor de la variable i=0,entonces el ciclo comienza validando esta condición,como es verdadera luego imprime el valor de la variable y luego i=i+1.Finalmente esta operación se repite hasta que i toma el valor 9,ya que al tomar el valor 10,la condición i<10 ya no es verdadera.

In [ ]:
i=0

while i<10:
    print(i,end=" ")
    i=i+1

En cambio si ejecutamos el siguiente bloque el ciclo se ejecuta de forma infinita ya que la condición siempre sera cierta,provocando que el software colapse y se cierre... 🔥

In [ ]:
i=True

while i==True:
    print(i)
    

Otro aspecto importante en Python,es que cuando definimos una lista es posible utilizar ciclos dentro de ellas.En algunos casos solo requerimos de algunos valores dentro de una lista,pero si buscamos crear una sucesión que tenga una mayor extensión,como tal vez una lista con los valores del 1 al 20 una forma sencilla de escribirla seria de la siguiente forma:

In [ ]:
serie_1=[n for n in range(1,21)]
serie_1

Recordar que en Python el límite superior esta especificado por el valor siguiente,es por eso que dentro de la función range() utilizamos 21 y no 20.

Pero no siempre necesitaremos crear las mismas listas en algunos casos podriamos necesitar que la lista comience o termine en valores distintos.Paro lo cual podríamos hacer uso de las funciones... las cuales son nuestro mejor aliado cuando queremos encapsular un proceso que realizamos con mucha frecuencia 📲

In [ ]:
def listas(inicio=1,termino=5):
    return [n for n in range(inicio,termino)]

l1=listas()
l1
In [ ]:
l2=listas(inicio=10,termino=21)
l2

Como se ve en el primer bloque,una vez que definimos la función listas y la llamamos para crear nuestra primera lista l1,se crea la lista con los valores por defecto.Sin embargo cuando la llamamos para crear la lista l2 con diferentes límites,inmediatamente se crea la lista con los valores que comienzan en el 10 y terminan en el 20.📌

Diccionarios 📗¶

Inicio ▲

Hasta este punto del curso,ya hemos visto la mayoría de los aspectos importantes para comenzar al menos a trabajar con Python,sin embargo uno de los puntos en donde Python es excelente es con la manipulación de strings o cadenas de texto.

Si bien ya hemos definido y realizado algunas operaciones con strings,siempre es bueno repasar antes de pasar a lo mas interesante de esta sección...los diccionarios. 📚

Habíamos visto que se podian definir algunas cadenas de texto y almacenarlas en variables como las que se muestran a continuación

In [ ]:
x="lunes es un dia"
y="Lunes es un dia"

Como podemos ver acá, en ambas variables aparantemente se guarda el mismo texto,pero la primera letra no se encuentra en mayúsculas en ambas variables,por lo tanto al momento de validar si son iguales se nos devolvera un False.

In [ ]:
x==y
In [ ]:
En cambio si definimos las cadenas de texto exactamente de la misma forma.
In [ ]:
x="Lunes es un dia"
y="Lunes es un dia"

x==y

Ahora si verificamos que ambas cadenas de texto son iguales.

En cambio tambien podríamos querer en algunos casos saltar una línea,como en lo siguiente.

In [ ]:
a=print("Lunes\nes un dia")
a

En este caso vemos que al agregar el "\n",inmediatamente todo lo que viene despues se escribe en la linea siguiente... y por supuesto podríamos volver a utilizarlo si quisieramos escribir cada palabra en una línea nueva

In [ ]:
a=print("Lunes\nes\nun\ndia")
a

Como ya hemos trabajado con la función,sabemos que esta automáticamente agrega una nueva línea,a menos que especifiquemos un valor de término.

In [ ]:
print("Martes es otro dia de la semana")
print("Miercoles es otro dia de la semana",end='')
print("Jueves es otro dia de la semana",end='')

Como se puede ver en el caso anterior si utilizamos el print de toda la vida,el siguiente texto que se imprime se va a la siguiente línea.Sin embargo cuando hacemos la segunda impresión agregamos el argumento end= '',el cual en este caso permite que una vez impreso el texto siga en la misma línea,a menos que usemos el valor \n que viene por defecto.

In [ ]:
print("Viernes es otro dia de la semana",end='\n')
print("El sabado no se trabaja")

Pero las cadenas de texto,no solo pueden ser un conjunto de palabras,sino que podemos separar estas en caracteres.

Si consideramos la ultima cadena de texto:

In [ ]:
sabado="El sabado no se trabaja"
sabado[3]

Como podemos ver,es posible almacenar una cadena de texto en una variable para luego ir seleccionado cada uno de los caracteres en ella,e ir poco a poco concatenando los caracteres de toda la cadena de texto.

In [ ]:
sabado="El sabado no se trabaja"
sabado[0]+sabado[1]+sabado[2]+sabado[3:9]

Incluso podríamos determinar la cantidad de letras que tiene la frase "El sábado no se trabaja"

In [ ]:
len(sabado)

Diccionarios¶

Hasta el momento hemos trabajado con characteres,cadenas de texto o strings y variables numéricas.Pero uno de los aspectos mas importantes en Python son los diccionarios,los cuales son estructuras de datos que permiten mapear claves a valores,esto implica que podemos indexar un conjunto de valores a otro conjunto de claves o llaves.

In [ ]:
numeros={"uno":1,"dos":2,"tres":3}
numeros
numeros["tres"]

En el caso del diccionario numeros,"uno","dos" y "tres" son las llaves y los valores 1,2 y 3 son los valores.

En este caso podemos acceder a cada uno de los valores mediante las llaves.

In [ ]:
numeros["uno"]

Asi podemos seleccionar el primer valor,pero también podríamos agregar otros valores mediante una nueva llave.

In [ ]:
numeros["cuatro"]=4
numeros

O incluso cambiando solo alguno de aquellos valores ya asociados a una llave.

In [ ]:
numeros["uno"]="Lunes"
numeros
In [ ]:
Así finalmente podríamos incluso iterar un diccionario mediante un ciclo for.
In [ ]:
for i in numeros:
    print(numeros[i])
In [ ]:
O incluso validar si una llave se encuentra en el diccionario.
In [ ]:
"uno" in numeros
In [ ]:
"cinco" in numeros
In [ ]:
numeros

Algunas otras operaciones que podemos hacer en Python,es renombrar los valores de un diccionario mediante una iteración de los valores de las llaves del mismo diccionario.

In [ ]:
dias=["lunes","martes","miercoles","jueves","viernes"]

dias_json={dia:dia[0] for dia in dias}
dias_json

En este caso, se creo un diccionario en donde sus llaves son los días de la semana y los valores corresponden a a cada uno de los primeros caracteres de las llaves.

Pero incluso el valor podría ser una versión mas corta del nombre de la llave o una pequeña descripción si fuera el caso.En este caso al cambiar la cantidad de caracteres a seleccionar de dia[0] a dia[0:3], se pasa de solo considerar la primera letra a las 3 primeras.

In [ ]:
dias=["lunes","martes","miercoles","jueves","viernes"]

dias_json={dia:dia[0:3] for dia in dias}
dias_json

Finalmente, si quisieramos podriamos utilizar métodos sobre los diccionarios que hemos creado para realizar algunas tareas sencillas.

In [ ]:
dias_json.values()

En este caso se utilizó el método .values() para mostrar por pantalla todos los valores del diccionario.

Trabajando con librerías 🎮¶

Inicio ▲

Y llegamos al último tópico de este curso introductorio 🎉

Hay varios temas que hemos tocado en este curso desde la declaración de variables numéricas,string y booleanas e incluso algunas estructuras de datos.Pero aún queda ver como podemos trabajar con librerías dentro del entorno de Python las cuales son muy importantes si queremos extender las capacidades de Python,si bien no veremos todas las librerías que se pueden utilizar en Python ya que son muchas,las cuales van desde la definición de variables numéricas,desarrollo de gráficas,conexión a bases de datos,desarrollo de interfaces de usuario e incluso el uso de modelos de machine learning,lo cual es suficiente contenido y material para un curso mas avanzado.Sin embargo, veremos 3 librerías ampliamente usadas tanto en la industria como en la academia.

La primera es Numpy la que es una librería especializada en cálculo numérico y el análisis de datos,uno de los aspectos mas importante es que se puede definir una estructura de dato llamada arrays los cuales se procesan mucho mas rápido que las listas que por defecto maneja Python 🙄.La segunda es Matplotlib que es una librería estándar para comenzar a desarrollar visualizaciones en Python y la tercera es Plotly otra librería de visualización,la que personalmente me gusta por su sintáxis, simplicidad y por que además tambien se encuentra implementada para el Software R.

Librería Numpy¶

Inicio ▲

Como ya habiamos dicho uno de los puntos fuertes de la librería Numpy son los objetos array,que se componen de elementos del mismo tipo y que pueden ser de 1,2 o n dimensiones.Así podriamos definir una lista o array de 1 dimensión,una matriz o array de 2 dimensiones o también un cubo que seria un array de 3 dimensiones.

Sin embargo primero deberiamos cargar la librería numpy

In [ ]:
import numpy

Una vez cargada ya podremos utilizar todas las funciones que vienen dentro de esta libreria.Cabe destacar que podremos cargar la libreria con su nombre por defecto o con una forma abreviada,lo cual nos servira cada vez que llamemos a las funciones dentro de ella.

In [ ]:
import numpy as np

A diferencia de las listas que podemos definir de forma regular en Python,para definir una lista o array de 1 dimension tenemos que

In [ ]:
a1=np.array([10,20,30,40])
print(a1)
In [ ]:
De la misma forma,si quisieramos definir un array de 2 dimensiones
In [ ]:
a2=np.array([[10,20,30,40],[50,60,70,80]])
print(a2)

Y siguiendo con la idea,entonces un array de 3 dimensiones lo podemos definir como sigue

In [ ]:
a3=np.array([[[10,20,30],[40,50,60]],[[70,80,90],[110,120,130]]])
print(a3)

Por tanto si queremos acceder a los elementos de cualquier tipo de array,debemos usar los índices al igual que accedemos a los elementos de una lista,pero seleccionando los índices de cada dimensión.

In [ ]:
#Para acceder al elemento de la fila 0 columna 0 del array de 2 dimensiones
print(a2[0,0])

#Para acceder al elemento de la fila 1 columna 2 del array de 2 dimensiones
print(a2[1,2])

Pero también podríamos utilizar algunos métodos para obtener algunas caracteristicas importantes de un array,como las que se muestran en la siguiente tabla.

AtributoMétodoDetalle
N° de Dimensióna.ndim()Devuelve el número de dimensiones del array a.
Dimensionesa.shape()Devuelve una tupla con las dimensiones del array a.
Tamañoa.size()Devuelve el número de elementos del array a.
Tipo de datoa.dtype()Devuelve el tipo de datos de los elementos del array a.
In [ ]:
# Número de dimensiones para cada uno de los arrays
print(np.ndim(a1))
print(np.ndim(a2))
print(np.ndim(a3))
In [ ]:
# Dimensiones para cada uno de los arrays
print(np.shape(a1))
print(np.shape(a2))
print(np.shape(a3))

Como se puede ver en el primer caso con el método a.ndim(), solo se nos muestra la cantidad de dimensiones,pero con el método a.shape() se muestran las dimensiones explícitas.

Pero incluso podemos realizar operaciones con arrays aunque estas tengan distintas dimensiones y valores en estas dimensiones,ya que operaran solo sobre aquellas dimensiones disponibles.

In [ ]:
print(a1*2)
In [ ]:
print(2*a2/a2)

De igual forma podríamos realizar operaciones algebraicas con vectores y matrices

In [ ]:
import numpy as np
b1=np.array([1,2,3])
b2=np.array([1,0,1])

#b1.dot(b2) determina el producto escalar entre los vectores b1 y b2
print(b1.dot(b2))

Asi también podríamos transponer una matriz mediante a.T.

In [ ]:
import numpy as np
a=np.array([[1,2,3],[4,5,6]])

print(a)
print(a.T)

Incluso podemos resolver sistemas de ecuaciones lineales mediante solve(a,b).

In [ ]:
import numpy as np

# El siguiente es un sistema de 2 ecuaciones lineales con 2 variables
#2x+3y=10
#4x+5y=8

a=np.array([[2,3],[4,5]])
b=np.array([10,8])
print(np.linalg.solve(a,b))

Algunas otras funciones para trabajar con algebra lineal son las siguientes:

MétodoOperación Descripción
dot(b)Producto escalarDetermina el producto escalar entre los vectores a y b.
norm(a)Módulo de un vectorDetermina el módulo del vector v.
a.dot(b)Producto de 2 matricesDetermina el producto matricial de las matrices a y b.
a.TMatriz traspuestaDetermina la matriz traspuesta de la matriz a.
a.trace()Traza de una matrizDetermina la suma diagonal principal de la matriz cuadrada a.
det(a)Determinante de una matrizEntrega el determinante de la matriz a.
inv(a)Matriz InversaDetermina la matriz inversa de la matriz cuadrada a.
eigvals(a)Autovalores de una matrizDetermina los autovalores de la matriz cuadrada a.
eig(a)Autovectores de una matrizDetermina los autovectores de la matriz cuadrada a.
solve(a,b)Solución de un sistema de ecuacionesDetermina la solución de un sistema de ecuaciones lineales.

Librería Matplotlib¶

Inicio ▲

Ha llegado el momento...🥁 hasta ahora hemos visto la definición de variables de distinto tipo asi como estruturas de datos,entre otros aspectos reelevantes en Python,incluso ya cargamos Numpy... nuestra primera libreria.

Pero ahora toca el turno de utilizar la librería Matplotlib,la cual esta desarrollada para la creación de gráficos.Cabe destacar que no es la unica librería para desarrollo de gráficos.

Alguno de los gráficos que se pueden desarrollar con Matplotlib y que veremos son los siguientes:

  • Diagramas de dispersión
  • Diagramas de lineas
  • Diagramas de cajas
  • Diagramas de barras
  • Histograma

Uno de los gráficos mas utilizados son los diagramas de dispersión,ya que rapidamente nos permite visualizar como se distribuyen los datos en el espacio.En algunos casos tendremos que utilizar otros gráficos para representar de mejor forma la información,pero es un buen punto de partida. 💡

In [ ]:
#Traemos el módulo pyplot de forma abreviada como plt
import matplotlib.pyplot as plt

#Se crea la figura y los ejes
fig,ax=plt.subplots()

#Se definen los puntos tanto del eje x como del y donde diagrama
ax.scatter(x=[1,1.5,2,2.5,3],y=[1,1.5,2,1.5,1])

#Opcionalmente podemos definir el tamaño de la figura
fig.set_size_inches(4,4)

#Finalmente mostramos el grafico
plt.show()

Sin embargo para realizar algunos gráficos como los ya mencionados,podemos utilizar funciones desarrolladas específicamente para esa tarea,a continuación se muestran:

Diagramas de dispersión¶

Para desarrollar un diagrama de dispersión,que nos permita visualizar los puntos con coordenadas en los eje x e y,debemos utilizar la función scatter(x,y) como en el caso anterior que vimos,pero sin duda que podríamos representar un mayor conjunto de datos.

In [ ]:
import matplotlib.pyplot as plt

fig,ax=plt.subplots()
ax.scatter([1,3,0.5,5,0.4,1.9,2.6],[0.9,3,5,2.5,7.6,4.3,7])

#Recordar que la definición del tamaño de la figura es opcional
fig.set_size_inches(4,4)

plt.show()

Diagramas de líneas¶

Con el diagrama de líneas buscamos representar nuevamente un conjunto de puntos que tengan coordenadas en x e y,sin embargo además se conectan las distancias entre cada par de puntos sucesivos con la función plot(x,y)

In [ ]:
import matplotlib.pyplot as plt

fig,ax=plt.subplots()
ax.plot([1.5,2,3,4],[1,0.75,1.5,0.5])

fig.set_size_inches(4,4)

plt.show()

Diagramas de cajas¶

A diferencia de los gráficos anteriores,en este caso el diagrama de cajas permite visualizar algunos estadísticos relevantes de una muestra.En este caso debemos utilizar la funcion boxplot(x)

In [ ]:
import matplotlib.pyplot as plt

fig,ax=plt.subplots()
ax.boxplot([2.3,4.5,1,8,10,4.5,5.6,7.6,3.4,2.4,20])

fig.set_size_inches(4,4)

plt.show()

Diagramas de barras¶

El gráfico de barras nos permite visualizar generalmente 2 ejes,en donde en el eje y posicionamos las categorías y en el eje x la magnitud contabilizada para cada categoría.

Así para desarrollar un diagrama de barras en Python usamos la sintaxis barh(x,y)

In [ ]:
import matplotlib.pyplot as plt

fig,ax=plt.subplots()
ax.barh([1,2,3],[3,2,1])

fig.set_size_inches(4,4)

plt.show()

Histograma¶

Finalmente uno de los gráficos mas utilizados en estadística descriptiva e inferencial junto al gráficos de cajas.El histograma nos permite visualizar la distribución de frecuencias una vez que agrupamos los datos en una muestra,cabe destacar que podemos definir la cantidad de columnas que queremos que tenga nuestro diagrama.

En este caso utilizaremos ademas la librería numpy para utilizar la generación de 1000 números aleatorias mediante una distribución normal con $\bar{X}=10$ y $\sigma=0.8$.

In [ ]:
import numpy as np
import matplotlib.pyplot as plt

fig,ax=plt.subplots()
x=np.random.normal(10,0.8,1000)
ax.hist(x,10)

fig.set_size_inches(4,4)

plt.show()

Librería Plotly¶

Inicio ▲

Asi como vimos con la librería Matplotlib,con Plotly también es posible el desarrollo de gráficos,sin embargo es posible el desarrollo de una mayor cantidad de gráficos que con matplotlib,pudiendo desarrollar gráficos de carácter estadístico,financiero,geográfico,científico y en 3 dimensiones.Cabe destacar que a pesar de presentar una mayor cantidad de graficos solo veremos los principales,ya que gráficos mas avanzandos requieren una mayor sintáxis de código y el uso de otras librerías en algunos casos.

Junto a lo anterior Plotly,permite el desarrollo de gráficos interactivos que pueden ser implementados en jupyter notebook como el presente,guardados en formato HTML o incluso en aplicaciones utilizando Dash,Shiny u otros frameworks

Asi como con matplotlib comenzamos viendo los gráficos de dispersión,en este caso tambien podemos desarrollar un primer gráfico de este tipo,teniendo la consideración que debemos cargar la libreria Plotly

In [ ]:
import plotly.express as px

#Se importa el submodulo .offline para luego usar plotly en el documento HTML
import plotly.offline as pyo
pyo.init_notebook_mode()

fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
fig.show()

Si bien visualmente tienen algunas diferencias mínimas los gráficos de dispersión desarrollados con Matplotlib y Plotly,tal vez uno de sus aspectos mas importantes radica es que al tener una sintáxis muy parecida ademas se incluye la posibilidad de interactuar con el gráfico,mediante herramientas como zoom,recortes e incluso la descarga del gráfico.

Algunos otros de los graficos que podemos desarrollar con la libreria Plotly son los siguientes:

  • Gráficos de líneas
  • Gráficos de barra
  • Gráficos de torta
  • Histogramas
  • Diagramas de cajas

Gráficos de líneas¶

Asi como vimos con el gráfico de dispersión tambien podemos desarrollar gráficos de líneas en donde podemos visualizar 1 o mas series si fuera necesario,a continuación se muestra la sintáxis para este tipo de gráfico

In [ ]:
import plotly.express as px
import pandas as pd

fig= px.line(
    x = [1, 2, 3, 4],
    y = [1, 2, 3, 4]
)
fig.show()

Gráficos de barra¶

Cuando realizamos un gráfico de barra,en el eje X se ordenan las categorías que queremos visualizar y en el eje y los valores o cantidades para cada una de estas categorías. Para el desarrollo de gráfico consideremos la siguiente tabla:

País Medallas Cantidad
Corea del Sur Oro 25
China Oro 10
Canada Oro 9
Corea del Sur Plata 13
China Plata 15
Canada Plata 12
Corea del Sur Bronce 11
China Bronce 8
Canada Bronce 12
In [ ]:
import plotly.express as px

#Aca estamos llamando al set de datos de la tabla,que viene precargado en la librería
long_df = px.data.medals_long()

fig = px.bar(long_df, x="nation", y="count", color="medal", title="Podio de medallas por país")
fig.show()

Gráficos de torta¶

A diferencia de los gráficos anteriores en donde tenemos los ejes x e y como categorías y valores.En el gráfico de torta buscamos representar un set de categorías con sus valores.

A continuación se puede ver la sintáxis para construir el gráfico

In [ ]:
import plotly.graph_objects as go

labels = ['Oxígeno','Hidrógeno','Dióxido de Carbono','Nitrógeno']
values = [4450, 2340, 1124, 670]

fig = go.Figure(data=[go.Pie(labels=labels, values=values)])
fig.show()

Histogramas¶

En comparación a los gráficos anteriores,el histograma es un diagrama que permite representar las frecuencias acumuladas en una determinada muestra al igual como lo vimos con la librería Matplotlib.

En este caso además utilizaremos la librería numpy,para generar una muestra mediante una distribución normal con parámetros $N~(\bar{X}=80,\sigma=110)$

In [ ]:
import plotly.express as px
import numpy as np

data = np.random.normal(100, 2, size=500) # replace with your own data source
fig = px.histogram(data, range_x=[90, 110])
fig.show()

Diagramas de Cajas¶

El diagrama de caja si bien no es homólogo al histograma,ya que este último no muestra las frecuencias acumuladas.En cambio el diagrama de cajas muestra una visualización condensada de las observaciones,en donde se pueden ver directamente algunos estadísticos relevantes como el $Q_{1}$, $Q_{2}$ o $Mediana$, $Q_{3}$,$Máximo$ y $Mínimo$ además de los outliers.

En este caso se muestra la sintáxis para representar una muestra generada con una distribución uniforme $U~(a=50,b=100)$ y además del gráfico de caja se habilita en la función el parametro points=all para además graficar todas las observaciones.

In [ ]:
import plotly.express as px
import pandas as pd

data = np.random.uniform(50,100, size=500)
fig = px.box(data,points="all")

fig.show()

Scikit-Learn 📀¶

Inicio ▲

La libreria Scikit-Learn es un modulo desarrollado en python para el diseño e implementación de modelos de Machine Learning(ML),cabe destacar que hoy en dia el ML abarca desde los modelos inferenciales clasicos hasta los mas avanzados....sin embargo en este curso solo abordaremos algunos de los modelos de inferencia.

A pesar de que existen diversas bibliotecas para la implementación de modelos de ML como: TensorFlow,Keras,Pytorch;Scikit-Learn es una de las librerias mas populares utilizadas para modelos de aprendizaje automatico,debido a la amplia variedad de algoritmos de regresión,clasificación,analisis entre grupos,entre otros.

A pesar de los distintos modelos que ofrece la biblioteca,solo veremos de forma introductoria 2 de los algoritmos clasicos,correspondientes a:

  • Regresión Lineal
  • Regresión Logistica

Regresión Lineal¶

Ahora a lo que vinimos... en estadistica inferencial uno de los modelos clasicos,es la regresión lineal, el cual es un modelo matematico que permite crear una relación aproximada entre distintas variables independientes $X_{i}$ y una variable dependiente $Y$,decimos que esta relación es aproximada por que ademas consideramos un termino de error $\epsilon$ dentro del modelo matematico.De esta forma podemos expresar el modelo de regresión lineal de la siguiente forma:

$Y=\beta_{0}+\sum_{i=1}^{n}\beta_{i}X_{i}+\epsilon=\beta_{0}+\beta_{1}X_{1}+...+\beta_{m}X_{m}+\epsilon$

Cabe destacar que aqui estamos generalizando el modelo de regresion lineal para $n$ variables,por tanto solo cuando la cantidad de variables independientes es $X_{i} \leq 2$ es posible graficar la función lineal,en cambio cuando $2 \leq X_{i}$ estamos hablando ya de un hiperplano,el cual no es posible graficar pero si podemos realizar cualquier tipo de operación y/o implementación del modelo lineal.

In [43]:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# Carga del set de datos iris
iris = datasets.load_iris()
iris_df=pd.DataFrame(iris.data)

# Se asignan los nombres para cada columna del dataset
iris_df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid']

# Se selecciona la variable "sepal_len" como la variable independiente y "petal_len" como la variable dependiente
datos_x = iris_df.iloc[:,[0]]
datos_y = iris_df.iloc[:,[2]]

# Se crea una instancia de un modelo de regresión lineal
regr = linear_model.LinearRegression()


# Se ajusta el modelo de regresion lineal con las variables x e y
regr.fit(datos_x, datos_y)

y_pred = regr.predict(datos_x)

# Coefieciente del modelo: $B0 y B1$
print("Coeficientes B0 y B1: \n", regr.intercept_,regr.coef_)
# Error cuadrado medio
print("Error Cuadrado medio: %.2f" % mean_squared_error(datos_y, y_pred))
# Coeficiente de determinación del modelo lineal: 
print("Coeficiente de determinación: %.2f" % r2_score(datos_y, y_pred))
Coeficientes B0 y B1: 
 [-7.10144337] [[1.85843298]]
Error Cuadrado medio: 0.74
Coeficiente de determinación: 0.76
In [48]:
# Dispersion de datos y modelo lineal
plt.scatter(datos_x, datos_y, color="blue")
plt.plot(datos_x, y_pred, color="red", linewidth=3)

plt.xticks(())
plt.yticks(())

plt.show()

Regresión Logistica¶

A diferencia del modelo de regresion lineal,el modelo de regresion logistica es utilizado para predecir variables categoricas,en función de una o mas variables independientes.Si bien este modelo asi como el de regresión lineal,se enmarcan dentro de la categoria de Modelos Lineales Generalizados y de sus distintas configuraciones que podemos definir,solo nos centraremos en la implementación de un modelo del siguiente tipo:

$Y=\frac{1}{(1+e^-{\beta_{0}+\beta_{1} X_{1}+...+\beta_{n} X_{n}})}$

Al igual que para el modelo de regresion lineal,aqui estamos generalizando en modelo de clasificación con $X_{n}$ variables independientes.Sin embargo el modelo que implementaremos a continuación solo considera 4 variables independientes y 3 categorias en la variable dependiente $Y$.

In [66]:
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

import warnings

# Se ignoran las advertencias
warnings.filterwarnings("ignore")

# Se carga set de datos iris
data = datasets.load_iris()
x = data.data
y = data.target

# Se crea una instancia de un modelo de regresión logística
modelo = LogisticRegression()

# Se ajusta el modelo a los datos
modelo.fit(x, y)

# Se realizan las predicciones
y_pred = modelo.predict(x)
In [68]:
# Calcular la precisión del modelo
accuracy = accuracy_score(y, y_pred)
print("Precisión del modelo:", accuracy)

# Mostrar la matriz de confusión
confusion = confusion_matrix(y, y_pred)
print("Matriz de confusión:")
print(confusion)

# Mostrar un informe de clasificación
report = classification_report(y, y_pred)
print("Informe de clasificación:")
print(report)
Precisión del modelo: 0.9733333333333334
Matriz de confusión:
[[50  0  0]
 [ 0 47  3]
 [ 0  1 49]]
Informe de clasificación:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        50
           1       0.98      0.94      0.96        50
           2       0.94      0.98      0.96        50

    accuracy                           0.97       150
   macro avg       0.97      0.97      0.97       150
weighted avg       0.97      0.97      0.97       150

Y llegamos al final de este curso introductorio con Python para Data Science.Este curso presenta una guía práctica de como empezar a trabajar con Python desde un punto de vista funcional,hay algunos conceptos que no se consideran en este curso pero que si se abordaran en cursos posteriores en donde se profundizara mucho más en temas como Programación Orientada a objetos,Algoritmos,Desarrollo de visualizaciones e incluso otros Modelos de Machine Learning.

Ante cualquier duda o comentario me puedes escribir a jvenegasg@docente.uss.cl o j.venegasgutierrez@gmail.com

Saludos 🧭