Apuntes Data Scien
Apuntes Data Scien
¿Por qué Python? ¿Cuáles son las razones para aprender este lenguaje?
Ya que conocemos como funcionan las variables en el mundo real, vamos a ver
¿Cómo funcionan en el mundo de Python? Entonces una vez que tengamos abierta
nuestra aplicación Jupyter vamos a ir a los cuadernos del material del curso.
Estos, en nuestro caso, los tenemos en el escritorio en la carpeta de cuadernos y
vamos a abrir lo que se llama tipos de variables. Esto lo vamos a hacer en
Jupyter donde vamos a buscar: La carpeta
Escritorio/Cuadernos/Tipos de Variables Una vez abierto
podemos ver que ya el cuaderno está preparado, entonces lo vamos a ir
analizando poco a poco. Entonces Python es un lenguaje de tipeado dinámico (Dynamic
Typing)
eso implica que no hay que decirle, de que tipo son las variables, Python es
lo suficientemente inteligente para deducir de qué tipo son. Esto lo hace
viendo que hay a la parte de la derecha del igual,
analizándolo y guardandolo en la variable. Entonces aquí hay un Ejemplo:
' x = 12 ' en otros lenguajes como en Java tendríamos algo similar a esto
" int x = 12 " en Python simplemente lo ponemos
"x = 12" y lo podemos empezar a utilizar esa variable llamada 'x' y le
imprime sin ningún problema. Ahora, ¿Cómo sabemos que Python dedujo correctamente
el tipo de variable? Bueno, podemos imprimir el tipo, utilizamos la función
'print' seguida de una función llamada 'type' y ponemos la variable elemento,
ejecutamos y nos dice: "Clase Tipo Entera" Ahora en Python
a diferencia de otros lenguajes, podemos utilizar números enteros tan largos como
queramos, solamente limitados por la Memoria RAM de nuestra máquina. Por ejemplo,
tenemos un número increíblemente grande aquí. Incluso le hacemos una operación
le sumamos un '+ 1' y Python lo ejecuta sin ningún problema. Ahora, aparte del entero
utilizamos variables de tipo 'flotante'. Por ejemplo, tenemos aquí ' f = 5.26 '
La podemos imprimir al igual que al entero y nos va a imprimir de que tipo
es, sin ningún problema. Nos va a decir " Clase Tipo Float " y el flotante nos lo va a
poder que es ' 5.26 ' De forma similar podemos utilizar
Notación Científica, tenemos ' 12.2e4 ' esto implica que a partir del 12.2 el
punto lo va a dejar recorrer ¿Cuántas veces? pues el número de veces que le
indiquemos. Entonces nos da este valor. A parte de los enteros y los flotantes
podemos utilizar números imaginarios esto lo hace con una notación semejante
a esta, donde tenemos el valor de la parte entera y seguido de la parte imaginaria
separados por un operador (+) Entonces tenemos: " 2 + 4 "
Lo que comúnmente sería ' 4 ' y aquí lo manejamos como ' 4j ' y podemos
imprimir el tipo de variable. Esto nos indica que la variable " i " es de tipo
Compleja y podemos hacer operaciones con números
imaginarios, de forma como lo haríamos con cualquier 'entero' o 'flotante'. Otro tipo
de dato muy interesante Python, son las 'Cadenas de Texto' en este ejemplo tenemos
una 's' que es igual a " Hola Mundo " (s = Hola Mundo) si nosotros imprimimos el tipo de esa
variable nos lo imprime correctamente, que es de clase
' str ' siendo una abreviación de la palabra " String "
Además podemos hacer uso de valores 'Booleanos' Tenemos 'b = True'
donde 'True' la primera letra tiene que llevar Mayúscula, de forma similar puede
ser 'False', donde la 'F' tiene que ser Mayúscula. Son los únicos 2 valores que
pueden contener un valor booleano y los procesa sin ningún problema
Entonces, los invito a hacer el siguiente Reto. Determinar el tipo de variable de
los siguientes elementos e imprimirlos en pantalla, si alguno no es posible
indicar ¿Por qué no es posible? Una vez concluido el reto los esperaré en el
Tipos de variables en python
1. Numéricos
Enteros (int): Números sin decimales.
python
Copiar código
edad = 26 # Ejemplo de entero
●
● Números complejos (complex): Números con parte real e imaginaria.
python
Copiar código
numero_complejo = 3 + 4j # Ejemplo de número complejo
1. float (Flotante)
● Significa: Números con decimales.
Ejemplo:
python
Copiar código
temperatura = 36.5 # Número con decimales
precio = 19.99 # Precio de un producto
●
● Dato curioso: Aunque no lo veas, los números flotantes tienen más precisión de la
que se muestra (internamente Python guarda más decimales).
Ejemplo:
python
Copiar código
nombre = "José"
saludo = "Hola, ¿cómo estás?"
numero_como_texto = "1234" # Aunque parece un número, es texto
porque está entre comillas.
●
● Dato curioso: Las cadenas pueden ser entre comillas simples (') o dobles (").
Ambas funcionan igual.
3. bool (Booleano)
Ejemplo:
python
Copiar código
es_mayor_de_edad = True
tiene_licencia = False
●
● Dato curioso: Los booleanos se usan mucho en decisiones y condiciones (como en
if, while).
4. list (Lista)
● Significa: Una colección ordenada de datos que pueden ser de cualquier tipo
(pueden ser mezclados).
Ejemplo:
python
Copiar código
frutas = ["manzana", "pera", "naranja"] # Lista de cadenas
numeros = [1, 2, 3, 4.5] # Lista de números
combinada = [1, "hola", True] # Lista con datos de
diferentes tipos
●
● Dato curioso: Las listas son mutables, es decir, puedes modificar sus valores.
5. tuple (Tupla)
● Significa: Una colección ordenada, pero inmutable (no puedes cambiar sus
valores después de crearlas).
Ejemplo:
python
Copiar código
coordenadas = (10, 20) # No puedes cambiar estos valores
colores = ("rojo", "azul", "verde")
●
● Dato curioso: Se usan cuando los datos deben ser constantes (por ejemplo, las
coordenadas de un mapa).
6. set (Conjunto)
● Significa: Una colección desordenada de elementos únicos (no puede haber
duplicados).
Ejemplo:
python
Copiar código
colores = {"rojo", "azul", "verde"}
numeros = {1, 2, 3, 3, 2} # Automáticamente elimina duplicados → {1, 2,
3}
●
● Dato curioso: No puedes acceder a elementos por su posición como en una lista,
porque no tienen un orden.
python
Copiar código
parte_real + parte_imaginaria*j
Ejemplo básico:
python
Copiar código
numero_complejo = 3 + 4j
print(type(numero_complejo)) # Esto imprimirá: <class 'complex'>
● 3: Es la parte real.
● 4j: Es la parte imaginaria.
Si estás trabajando con una lista y ya la has creado, puedes realizar las siguientes
operaciones sin tener que redefinirla cada vez:
python
Copiar código
# Crear la lista
numeros = [10, 20, 30, 40, 50]
1.
Estructuras de
control
Las estructuras de control nos permiten controlar el flujo de ejecución de nuestros
programas. En Python, las estructuras de control más comunes son las estructuras
condicionales y los bucles. Estas estructuras nos permiten tomar decisiones y
repetir bloques de código según ciertas condiciones.
Las estructuras condicionales nos permiten ejecutar diferentes bloques de código
según se cumpla o no una determinada condición. En Python, las estructuras
condicionales más utilizadas son if, if-else y if-elif-else.
● IF
La estructura if se utiliza para ejecutar un bloque de código si una condición es
verdadera. La sintaxis básica es la siguiente:
if condicion:
instrucciones
Ejemplo:
edad = 18
● IF-ELSE
La estructura if-else nos permite especificar un bloque de código alternativo que se
ejecutará si la condición del if es falsa. La sintaxis básica es la siguiente:
edad = 15
else:
● IF-ELIF-ELSE
La estructura if-elif-else nos permite especificar múltiples condiciones y bloques de
código alternativos. La sintaxis básica es la siguiente:
if condicion1:
instrucciones
elif condicion2:
instrucciones
else:
Ejemplo
calificacion = 75
if calificacion >=90:
print("excelente")
print("muy bueno")
print("bueno")
else:
print("debe mejorar")
En este ejemplo, se evalúan múltiples condiciones en orden. Si la variable
calificación es mayor o igual a 90, se imprime "Excelente". Si no se cumple la
primera condición, pero calificación es mayor o igual a 80, se imprime "Muy bueno".
Si no se cumplen las condiciones anteriores, pero calificación es mayor o igual a 70,
se imprime "Bueno". Si ninguna de las condiciones anteriores es verdadera, se
ejecuta el bloque else y se imprime "Necesita mejorar".
Bucles /loops
For
El bucle for se utiliza para iterar sobre una secuencia (como una lista, una tupla o
una cadena) o cualquier objeto iterable. La sintaxis básica es la siguiente:
instrucciones
Ejemplo:
print(fruta)
En este ejemplo, el bucle for itera sobre la lista frutas. En cada iteración, la variable
fruta toma el valor de un elemento de la lista, y se ejecuta el bloque de código
dentro del bucle. En este caso, se imprime cada fruta en una línea separada.
While
El bucle while se utiliza para repetir un bloque de código mientras una condición sea
verdadera. La sintaxis básica es la siguiente:
while condicion:
instrucciones
Ejemplo:
contador = 0
print(contador)
contador += 1
En este ejemplo, el bucle while se ejecuta mientras la variable contador sea menor
que 5. En cada iteración, se imprime el valor de contador y luego se incrementa en 1
mediante la instrucción contador += 1. El bucle se detendrá cuando contador
alcance el valor de 5.
Control de bucles
Python proporciona algunas instrucciones especiales para controlar el flujo de
ejecución dentro de los bucles:
● Break
La instrucción break se utiliza para salir prematuramente de un bucle,
independientemente de la condición. Cuando se encuentra un break, el bucle se
detiene y el flujo de ejecución continúa con la siguiente instrucción fuera del bucle.
contador = 0
while True:
print(contador)
contador += 1
if contador == 5:
break
En este ejemplo, el bucle while se ejecuta indefinidamente debido a la condición
True. Sin embargo, dentro del bucle se utiliza una estructura condicional if para
verificar si contador es igual a 5. Cuando se cumple esta condición, se ejecuta la
instrucción break, lo que hace que el bucle se detenga y el flujo de ejecución
continúe con la siguiente instrucción fuera del bucle.
● Continue
La instrucción continue se utiliza para saltar el resto del bloque de código dentro de
un bucle y pasar a la siguiente iteración.
Ejemplo:
for i in range(10):
if i % 2 == 0:
continue
print(i)
n este ejemplo, el bucle for itera sobre los números del 0 al 9 utilizando la función
range(). Dentro del bucle, se verifica si el número es divisible por 2 utilizando el
operador de módulo %. Si el número es divisible por 2 (es decir, si es par), se
ejecuta la instrucción continue, lo que hace que se salte el resto del bloque de
código y se pase a la siguiente iteración del bucle. Como resultado, solo se
imprimirán los números impares.
● Pass
La instrucción pass es una operación nula que no hace nada. Se utiliza como
marcador de posición cuando se requiere una instrucción sintácticamente, pero no
se desea realizar ninguna acción.
Ejemplo:
for i in range(5):
pass
En este ejemplo, el bucle for itera sobre los números del 0 al 4, pero no se realiza
ninguna acción dentro del bucle debido a la instrucción pass. Esto puede ser útil
cuando se está desarrollando un programa y se desea reservar un bloque de código
para implementarlo más adelante.
Listas
Una lista es una estructura de datos mutable y ordenada que permite almacenar una
colección de elementos. Los elementos de una lista pueden ser de diferentes tipos
de datos y se encierran entre corchetes [], separados por comas.
● Creación y acceso
Para crear una lista, simplemente encierra los elementos entre corchetes:
● Métodos de listas
Las listas en Python tienen varios métodos incorporados que nos permiten
manipular y modificar los elementos de la lista. Algunos métodos comunes son:
● append(elemento): agrega un elemento al final de la lista.
● insert(indice, elemento): inserta un elemento en una posición específica
de la lista.
● remove(elemento): elimina la primera aparición de un elemento en la lista.
● pop(indice): elimina y devuelve el elemento en una posición específica de
la lista.
● sort(): ordena los elementos de la lista en orden ascendente.
● reverse(): invierte el orden de los elementos en la lista.
frutas = ["manzana", "banana", "naranja"]
frutas.append("pera")
frutas.insert(1, "uva")
frutas.remove("banana")
frutas.sort()
frutas.reverse()
● Listas de comprensión
Las listas de comprensión son una forma concisa de crear nuevas listas basadas en
una secuencia existente. Permiten filtrar y transformar los elementos de una lista en
una sola línea de código.
numeros = [1, 2, 3, 4, 5]
4.1. Tuplas
Una tupla es una estructura de datos inmutable y ordenada que permite almacenar
una colección de elementos. Los elementos de una tupla se encierran entre
paréntesis (), separados por comas.
● Creación y acceso
punto = (3, 4)
Para acceder a los elementos de una tupla, utiliza el índice del elemento entre
corchetes, similar a las listas:
print(punto[0]) # Imprime 3
print(punto[1]) # Imprime 4
A diferencia de las listas, las tuplas son inmutables, lo que significa que no se
pueden modificar una vez creadas. No se pueden agregar, eliminar o cambiar
elementos en una tupla existente.
Las tuplas son útiles cuando necesitas almacenar una colección de elementos que
no deben modificarse, como coordenadas o datos de configuración.
● Métodos de tuplas
Aunque las tuplas son inmutables, Python proporciona varios métodos útiles para
trabajar con ellas:
4.2. Diccionarios
Un diccionario es una estructura de datos mutable y no ordenada que permite
almacenar pares de clave-valor. Cada elemento en un diccionario consiste en una
clave única y su valor correspondiente. Los diccionarios se encierran entre llaves {},
y los pares clave-valor se separan por comas.
● Creación y acceso
Para crear un diccionario, utiliza llaves y separa las claves y valores con dos puntos.
print(persona["edad"]) # Imprime 25
4.3. Conjuntos
(set)
Un conjunto es una estructura de datos mutable y no ordenada que permite
almacenar una colección de elementos únicos. Los conjuntos se encierran entre
llaves {} o se crean utilizando la función set().
conjunto1 = {1, 2, 3}
conjunto2 = {3, 4, 5}
● Métodos de conjuntos
Definición y llamada de
funciones
Para definir una función en Python, utilizamos la palabra clave def seguida del
nombre de la función y paréntesis. Opcionalmente, podemos especificar parámetros
dentro de los paréntesis. El bloque de código de la función se indenta después de
los dos puntos.
def saludo():
print("¡Hola, mundo!")
Parámetros y argumentos
Las funciones pueden aceptar parámetros, que son valores que se pasan a la
función cuando se la llama. Los parámetros se especifican dentro de los paréntesis
en la definición de la función.
def saludo(nombre):
print(f"¡Hola, {nombre}!")
Al llamar a la función, proporcionamos los argumentos correspondientes a los
parámetros:
Valores de retorno
Las funciones pueden devolver valores utilizando la palabra clave return. El valor de
retorno puede ser utilizado por el código que llama a la función.
return a + b
resultado = suma(3, 4)
print(resultado) # Imprime 7
cuadrado = lambda x: x ** 2
print(cuadrado(5)) # Imprime 25
Alcance de las variables (local
vs. global)
Las variables definidas dentro de una función tienen un alcance local, lo que
significa que solo son accesibles dentro de la función. Por otro lado, las variables
definidas fuera de cualquier función tienen un alcance global y pueden ser
accedidas desde cualquier parte del programa.
def funcion():
variable_local = 10
variable_global = 20
def funcion2():
funcion() # Imprime 10
funcion2() # Imprime 20
print(variable_global) # Imprime 20
print("Hola")
print(variable_no_definida)
resultado = 5 + "10"
lista = [1, 2, 3]
Try
El bloque try contiene el código que puede generar una excepción. Si ocurre
una excepción dentro del bloque try, el flujo de ejecución se transfiere al
bloque except correspondiente.
try:
print(resultado)
except ZeroDivisionError:
Except
El bloque except especifica el tipo de excepción que se desea capturar y
manejar. Puedes tener múltiples bloques except para manejar diferentes tipos
de excepciones.
try:
print(resultado)
except ZeroDivisionError:
except ValueError:
Finally
El bloque finally es opcional y se ejecuta siempre, independientemente de si
ocurrió una excepción o no. Se utiliza comúnmente para realizar tareas de
limpieza o liberación de recursos.
try:
except FileNotFoundError:
finally:
def funcion():
if condicion:
try:
funcion()
except Exception as e:
print(f"Error: {str(e)}")
En este ejemplo, se define una función llamada funcion(). Dentro de la función,
se verifica una condición y, si se cumple, se genera una excepción utilizando
la declaración raise. En lugar de crear una clase personalizada, se utiliza
directamente la clase base Exception para generar la excepción.
else:
print("Eres menor de edad.")
En este ejemplo, se solicita al usuario que ingrese su edad y se convierte el valor
ingresado a un número entero utilizando int(). Luego, se utiliza una estructura
condicional para verificar si la edad es mayor o igual a 18 y mostrar un mensaje
correspondiente.
Salida de datos
Para mostrar información en la pantalla, utilizamos la función print(). Esta función
toma uno o más argumentos y los muestra en la consola.
nombre = "Juan"
edad = 25
Lectura de archivos
Para leer el contenido de un archivo, primero debemos abrirlo utilizando la función
open() en modo de lectura ("r"). Luego, podemos leer el contenido del archivo
utilizando métodos como read() o readlines().
contenido = archivo.read()
print(contenido)
archivo.close()
En este ejemplo, se abre el archivo "datos.txt" en modo de lectura utilizando open().
Luego, se lee todo el contenido del archivo utilizando el método read() y se
almacena en la variable contenido. Finalmente, se muestra el contenido en la
pantalla y se cierra el archivo utilizando el método close().
Escritura de archivos
Para escribir datos en un archivo, lo abrimos en modo de escritura ("w") utilizando la
función open(). Si el archivo no existe, se creará automáticamente. Si el archivo ya
existe, su contenido se sobrescribirá.
archivo.write("Hola, mundo!")
archivo.close()
En este ejemplo, se abre el archivo "datos.txt" en modo de escritura utilizando
open(). Luego, se escribe la cadena "¡Hola, mundo!" en el archivo utilizando el
método write(). Finalmente, se cierra el archivo utilizando el método close().
contenido = archivo.read()
print(contenido)
En este caso, el archivo se abre utilizando la declaración with y se cierra
automáticamente una vez que se sale del bloque with, incluso si ocurre una
excepción
Importación y
creación de
módulos
En Python, un módulo es un archivo que contiene definiciones de funciones, clases
y variables que se pueden utilizar en otros programas. La importación de módulos
nos permite acceder a la funcionalidad definida en otros archivos y reutilizar código
de manera eficiente. Además, podemos crear nuestros propios módulos para
organizar y modularizar nuestro código.
Importar módulos
Para utilizar un módulo en nuestro programa, debemos importarlo utilizando la
declaración import. Podemos importar un módulo completo o funciones específicas
de un módulo.
import math
resultado = math.sqrt(25)
resultado = sqrt(25)
Funciones y clases de
módulos estándar
La biblioteca estándar de Python ofrece una amplia gama de módulos con funciones
y clases útiles. Algunos ejemplos comunes incluyen:
Math:
Proporciona funciones matemáticas, como sqrt() (raíz cuadrada), sin() (seno), cos() (coseno),
entre otras.
Random:
Ofrece funciones para generar números aleatorios, como random() (número aleatorio entre 0 y
1), randint() (número entero aleatorio en un rango), entre otras.
Datetime:
Permite trabajar con fechas y horas, como datetime.now() (fecha y hora actual), datetime.date()
(fecha), datetime.time() (hora), entre otras.
import random
import datetime
fecha_actual = datetime.datetime.now()
Creación de
módulos propios
Además de utilizar los módulos estándar de Python, también podemos crear
nuestros propios módulos para organizar y reutilizar nuestro código.
#mi_modulo.py
def saludar(nombre):
print(f"Hola, {nombre}!")
return a + b
Luego, podemos importar y utilizar las funciones definidas en mi_modulo.py en otro
archivo Python.
import mi_modulo
resultado = mi_modulo.calcular_suma(5, 3)
print(resultado) # Imprime 8
En este ejemplo, se importa el módulo mi_modulo y se utilizan las funciones
saludar() y calcular_suma() definidas en él.
# operaciones.py
def sumar(a, b):
return a + b
return a - b
# utilidades.py
def imprimir_mensaje(mensaje):
print(mensaje)
def obtener_nombre_usuario():
import operaciones
import utilidades
resultado = operaciones.sumar(5, 3)
nombre = utilidades.obtener_nombre_usuario()
utilidades.imprimir_mensaje(f"Hola, {nombre}!")
Al organizar nuestro código en módulos, podemos reutilizar funciones y mantener un
código más estructurado y agrupado en módulos.
Paquetes
Un paquete es una forma de organizar módulos relacionados en una estructura
jerárquica de directorios. Los paquetes nos permiten agrupar módulos relacionados
y evitar conflictos de nombres entre módulos.
mi_paquete/
__init__.py
modulo1.py
modulo2.py
Luego, podemos importar y utilizar los módulos del paquete en nuestro programa.
modulo1.funcion1()
modulo2.funcion2()
En este ejemplo, se importan los módulos modulo1 y modulo2 del paquete
mi_paquete y se utilizan las funciones definidas en ellos.