Mi experiencia en Python, primeros pasos.

Wilmer Mogollon
Sep 3, 2018 · 12 min read

Un poco de contexto.

El siguiente artículo, es un recuento de mi experiencia aprendiendo Python, todo bajo el pretexto del curso del Simulación y Modelaje de la Maestría en Economía de la Universidad de los Andes de la Facultad de Ciencias Económicas y Sociales, con la tutoría del Profesor Francisco Palm (Activista de la comunidad Medium), con miras de sintetizar parte de los conocimientos aprendidos, para el desarrollo del curso, se utilizó el libro Modeling and Simulation in Python, de Allen B. Downey, dejo la información en las referencias.

Mis primeros pasos en Python.

Instalación.

Puede sonar cliché, pero una de las cosas que más costo fue instalar el software Anaconda 3, en primer lugar por la imperiosa tarea de descargar un archivo de 437MB, en una de las peores conexiones de internet del mundo, cerca de 1,8Mbps o menor, que puede sonar dramático, pero si se le suma inestabilidad de conexión, fallos de luz, y error humano (tener una arquitectura del sistema distinta al que descargaste), te puede traer muchos dolores de cabeza, sin embargo después de varios días de lucha, se pudo instalar el tan ansiado programa.

Anaconda 3, trae consigo una serie de paquetes para usar (Spyder, Jupiter Notebook, Anaconda Cloud, Anaconda Navigator, Anaconda Prompt, IPython), cada uno con sus características, pero en esencia permite correr código Python con un sin fín de ventajas (paquetes más usados preinstalados, ambiente interactivo, posibilidad de asociar kernel de otros lenguajes de programación como R o Julia, gran disponibilidad de herramientas de formación, soporte, entre otras), para el desarrollo del curso se utilizó el cuaderno de Jupiter, ya que las lecciones del libro estaban en formato .ipynb lo que permitía con ejemplos prácticos e interactivos correr códigos del libro, que opino es una forma muy certera de aprender haciendo.

Lo necesario.

Para empezar fue necesario comprender algunos conceptos básicos, incursionar en un nuevo aprender implica, desglosar lo que quería aprender y para que quiera aprenderlo es decir un plan de acción, corregir en los errores que podía incursionar, eliminar las barreras que impedían que practicara, muchas horas de dedicación y la voluntad necesaria para lograrlo.

Falta no me quedaban, en Venezuela, existen incentivos suficientes para reinventarse y porque no obtener algún dinero extra y más si es en moneda dura, por lo que las ganas no me faltaban, pero como todo, si no conoces el lenguaje necesario es imposible entender lo que se está haciendo por lo que fundamental comprender las categorías básicas.

Variables. En programación, una variable es un espacio de memoria reservado para almacenar un valor determinado que corresponde a un tipo de dato soportado por el lenguaje de programación en el cual se trabaja (Alegsa, 2015), en el caso de Python este es un lenguaje orientado a objetos, por lo que la definición de variables es imprescindible en la creación de código útil, una variable puede ser del tipo booleano, entero, decimal de coma flotante, carácter, cadena de texto, arreglo, matriz, tipo definido por el usuario, en el siguiente ejemplo le he asignado a la variable X el valor 12312312334243.

X = 12312312334243
print(“X”)

12312312334243

Tipos de datos. un tipo de dato es una restricción impuesta para la interpretación/manipulación/representación de datos (Codigoprogramacion, 2012), los tipos de datos comunes en lenguajes de programación son los tipos primitivos (enteros, caracteres, etc.), las tuplas, los conjuntos o booleanos, tipos abstractos de datos, tipo de funciones y clases, etc. Podemos preguntar el tipo de dato a nuestro Python con el siguiente comando, en nuestro caso indica que es un valor entero.

type(“X”)
str

Operadores aritméticos. Los operadores aritméticos son los más sencillos de todos, se utilizan para realizar operaciones aritméticas básicas, es decir sumas, restas, multiplicación división, modulo/residual, y exponenciales, veamos lo ejemplos.

a=10
b= 3
#realizar una suma de 2 numeros
resultado = a + b

#restar 10 - 3 = 7
resultado = a - b

#realizar una suma
resultado = a + b

#multiplicacion de 10*3 = 30
resultado = a * b

#division natural resultado = 10/3 que es aprox 3.333
resultado = a / b

#division con floor/piso, el resultado se redondea hacia abajo
resultado = a // b #resultado = 3, no 3.3333

#modulo/residuo, el residuo de una division
resultado = a % b #resultado es 1

#exponencial, eleva a la potencia de
resultado = a **3 #10 elevado a 3 = 1000

Operadores de comparación. Los operadores de comparación se usan para evaluar expresiones que solo pueden tener 2 resultados, estos resultados son verdadero o falso (true o false), también se cuentan con los operadores de asignación se utilizan para básicamente asignar un valor a una variable, así como cuando utilizamos el “=” (Alegsa, 2015).

== , evalúa como verdadero si 2 variables son iguales
!= ,evalúa como verdadero si 2 variables son diferentes
<> , lo mismo que !=
> , verdadero si el operador a la izquierda es mayor que el de la derecha
< , verdadero si el operador a la izquierda es menor que el de la derecha
>= verdadero si el operador a la izquierda es mayor o igual al de la derecha
<= verdadero si el operador a la izquierda es menor o igual al de la derecha

Estructuras de selección. Es un algoritmo que al ser ejecutado toma una decisión, ejecutar o no ciertas instrucciones si se cumplen o no ciertas condiciones, las condiciones devuelven un valor, verdadero o falso, determinado así la secuencia a seguir (Alegsa, 2015).

Básicamente hay tres tipos de estructuras de selección: Estructura de selección simple: if; Estructura de selección doble: if-else; Estructura de selección múltiple: case o switch. Ejemplo

a = 7
if ( a > 5) : print("La variable es mayor a 5!")
print("fin")

La variable es mayor a 5!
fin

Bucles. Un bucle es un tipo de estructura de control que permite repetir una o más sentencias múltiples veces (Alegsa, 2015), Los bucles más generales en los lenguajes de programación son WHILE, FOR y REPEAT. Por ejemplo

for letra in 'Hola!':
print ('Estamos en la letra :', letra)

Estamos en la letra : H
Estamos en la letra : o
Estamos en la letra : l
Estamos en la letra : a
Estamos en la letra : !

Funciones. No debe ser confundida con la composición de objetos, es un acto o mecanismo para combinar funciones simples en complejas; tal como las composiciones de funciones en matemática, el resultado de cada función es pasada como argumento a la siguiente y el resultado de la última función es el de todas (Codigoprogramacion, 2012).

def sumar():
print 5 + 10
_________________________________________________________________________
sumar()

Programación orientada a objetos. Es la representación detallada y particular de algo de la realidad, todo objeto tiene un identidad o nombre, estado (características definidas generalmente en variables) y comportamiento (sus funciones o procedimientos), una forma de alterar el estado de un objeto es a través de sus funciones (Alegsa, 2015).

En marcha…

Teniendo todos los ingredientes ya podía empezar a hacer el pastel, sin embargo hubo cosas durante el proceso que me impactaron, uno es el desarrollo del software libre, siempre he sido un fiel observador, y un admirador pasivo en todos los avances en el aréa, sin embargo, nunca me había atrevido a dar ese paso gigante que representa el software libre, consolas, comandos, instalación manual, software nuevos, arquitectura distinta, sentenciaron mi comienzo a un nuevo mundo, debo agradecer a mi profesor Palm por recomendarme Manjaro (Estabilidad y un ambiente Pacman me enamoraron), porque la verdad es que el Ubuntu y el Linux Mint por más que los había instalado no me habían terminado de convencer, de momento sigo aprendiendo, en un próximo articulo hablare sobre mis avances, sin embargo confieso, que aún me mantengo que las terribles garras del Windows, pero estoy en esa transición.

Por otra parte debo destacar el impacto positivo que obtuve la conocer los repositorios git hub y las comunidades colaborativas, al principio no entendía como personas dedicaban horas y horas de trabajo, publicaban en código abierto, libros, programas completos, sin temor a ser plagiados, pero entre tantas discusiones personales comprendí que compartiendo se gana más, no solo desde el punto de vista de influencia, es que mundo está cambiando y si no nos adecuamos a esa realidad no seremos competitivos, hoy se valora más el saber hacer para solucionar problemas, que la falsa meritocracia que otorga privilegios sin destacar el verdadero aporte, por lo que me invito a la reflexión, además las comunidades colaborativas, son inspiradoras, la tecnología al servicio de la gente, todo en función de la construcción de un mundo mejor, por lo que me dio esperanza y encontré un espacio con mucho en común, para aprender y para aportar.

Es increíble como un curso de Simulación puede llevarte a conocer tanto.


La simulación y yo.

Particularmente ya había tomados algunas lecciones de un curso sencillo de simulación, por lo que algunos conceptos como sistema, estructura, sujeto, objeto, actividades, entidades, atributos, variables de estado ya eran familiares para mí, para desarrollar el curso es necesario tener buenas bases de algebra, estadística, buena intuición y mucho método para definir bien lo que se quiere desarrollar, en aquel momento utilizamos el software Arena para simular el comportamiento de unos sujetos basados en teoría de colas, pero la verdad no profundice más allá de lo evidente.

Por lo que para el nuevo curso representaba mucha expectativa, y si le sumamos que la condición para aprender era utilizar python, ya me daba por bien correspondido, si bien aprender tiene sus altos costos de aprendizaje, no dudo que es la mejor forma de entender lo que se está haciendo, por lo que lo recomiendo, una de las primeras barreras que se enfrentan, son las del idioma, existe mayor probabilidad de encontrar mejor material en el idioma de la ciencia, por lo que representa un esfuerzo adicional, la traducción e interpretación suman a las horas de estudio, en definitiva es necesario aprenderlo, sin embargo el libro está en un lenguaje sencillo con muchos ejemplos interactivos, lo que facilita el proceso.

El libro está pensando para realizar modelado y simulación progresiva, empieza por preparar el ambiente del trabajo en júpiter, los conceptos básicos en que pensar, pero los enseña con ejemplos interactivos paso a paso como se hace programándolo en python, un aspecto interesante es que en los cuadernos de júpiter está presente asignaciones que en la medida que vas leyendo el libro te muestran ejemplos y puedes practicar al instante, lo que lo hace intuitivo, muy manejable y pertinente en proceso de aprendizaje, cada capítulo representa un ejemplo en que van aumentando la dificultad, y están pensados en ejemplos intuitivos relacionados con la realidad, con muchos casos de estudio, ver el índice el libro.

1) Modelado; 2) bicicletas compartidas; 3) Modelado iterativo; 4) parámetros de barrido; 5) población mundial; 6) Modelando el crecimiento; 7) crecimiento cuadrático; 8) Predicción; 9) análisis; 10) casos de estudio; 11) Epidemiología; 12) Optimización; 13) Barriendo dos parámetros; 14) análisis; 15) Calor; 16) Mezcla; 17) Farmacocinética; 18) Métodos numéricos; 19) Casos de estudio; 20) proyectiles; 21) resistencia al aire; 22) Proyectiles en 2-D; 23) Optimización; 24) rotación; 25) Par; 26) Estudios de caso.

Aqui les traigo un ejemplo sencillo de lo que es pobabilidad de lanzar una moneda.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Ejemplo probabilidad de lanzamiento de una moneda
# moneda p=1/2 cara=1 seca=0
resul = []
for lanzar in range(1,10000):
lanzar = np.random.choice([0,1], lanzar)
caras = lanzar.mean()
resul.append(caras)

# graficamente
df = pd.DataFrame({ 'lanzar' : resul})

df.plot(title='Probabilidad de lanzar una moneda',color='r',figsize=(8, 6))
plt.axhline(0.5)
plt.xlabel("Número de lanzamientos")
plt.ylabel("frecuencia caras")
plt.show()

Ademas incluyo otro ejemplo, un problema de optimización con dos variables y tres restricciones en el que se plantea maximizar de la producción de dos bienes con la siguiente funcion objetivo 2000x1+2200x2, con restricciones 6x1+8x2≤450; 5x1+2x2≤200; x2>10; x1 ≥0; x2 ≥0. Para realizar este ejemplo se usaran las librerias matplotlib, numpy y cvxopt, por lo que debemos instalar las librerias e importalas.

# importando modulos necesarios
import matplotlib.pyplot as plt
import numpy as np
import cvxopt

Una vez importadas se procede a construir las respectivas matrices para resolver nuestro problema, notese que se ha creado tres objetos (A,b,c) cada uno de ellos contiene la información de la columna por variable de nuestras restricciones, es importante colocar los valores de nuestros restricciones principales en negativos. El objeto b contiene los resultados de nuestras restricciones, y el objeto c, los datos de nuestra funcion objetivo.

Por ultimo se llama los resultados, obteniendo….

# Ejemplo programación lineal con CVXopt

# Resolviendo el problema con cvxopt
A = cvxopt.matrix([[-6., -5., 1., 0.], # columna de x1
[-8., -2., 0., 1.]]) # columna de x2
b = cvxopt.matrix([450., 200., 0., 0.]) # resultados
c = cvxopt.matrix([2000., 2200.]) # funcion objetivo

# resolviendo el problema
sol=cvxopt.solvers.lp(c,A,b)

# imprimiendo la solucion.
print('{0:.2f}, {1:.2f}'.format(sol['x'][0]*-1, sol['x'][1]*-1))
_________________________________________________________________

25.00, 37.50

Lo que indica que se deben producir con las condiciones establecidas, 25 unidades del bien x1 y 37,5 unidades del bien x2, ahora procedemos a graficar.

# Resolviendo la optimizacion graficamente.
x_vals = np.linspace(0, 80, 10) # 10 valores entre 0 y 80
y1 = ((450 - 6*x_vals)/8) # 6x1+8x2≤450
y2 = ((200 - 5*x_vals)/2) # 5x1+2x2≤200
y3 = ((10 - 0*x_vals)) # x2>10

plt.figure(figsize=(10,8))
plt.plot(x_vals, y1, label=r'$6x_1 + 8x_2 \leq 450$')
plt.plot(x_vals, y2, label=r'$5x_1 + 2x_2 \leq 200$')
plt.plot(x_vals, y3, label=r'$2x_2 \geq 10$', color='green')
plt.plot(25, 37, 'c*', markersize=20)

# Región factible
y4 = np.minimum(y1, y2)
plt.fill_between(x_vals, 0, y4, alpha=0.15, color='yelLow')
plt.fill_between(x_vals, 0, y3, alpha=1, color='white')
plt.axis(ymin = 0)
plt.title('Optimización lineal')
plt.legend()
plt.show()

Grafico realizado con Python

La construcción del grafico esta conformador en tres partes, la primera la definición de nuestras restricciones para graficarlas, donde se crea un objeto (x_vals) que es una secuencia de números que luego conformaran los vectores, además de los objetos y1, y2 y y3 que representa el despeje de la restricción en función de x2; la segunda parte constituye graficar los objetos creados en el paso 1, notese que se establece la leyenda para cada restricción y se define el punto optimo, con la impresión de una estrella en los puntos respectivos; y la ultima parte, se refiere al establecimiento de la región factible, junto con la impresión final del grafico.

Notese que son multiples las tareas que se pueden realizar con python, una vez se cubren los costos de apredizaje lo demás estará definido por la creatividad y las ganas de probar y conocer nuevo codigo.

Comentarios finales.

El libro es una buena herramienta si aprender a modelar y simular se quiere, es menester responder algunas preguntas que a esta altura puede surgir sobre el curso:

La simulación trae consigo la intención de brindar una serie de herramientas que logran reducir los costos, facilitan los cálculos, genera conclusiones con bastante certeza, reduce el tiempo de estudio, permite representar una gran cantidad de situaciones (Pérez, 1996) por lo que con él desarrollo de las nuevas tecnologías, la capacidad para tomar mayor cantidad de variables, para representar un sistema y la velocidad de los cálculos, hacen de la simulación una herramienta fundamental para minimizar la incertidumbre y utilizar eficientemente los recursos.

Para simular se deben respetar las siguientes etapas, dependerá de cada investigador la forma, pero en esencia terminan siendo las mismas: La primera fase está basada en el estudio del problema, sus detalles y todo lo referente a las hipótesis iniciales. La segunda fase verifica todo lo que tiene que ver con el sistema. La tercera fase se centra en el modelo, en este caso un modelo conceptual; el cual posee como función esencial brindarles a los profesionales una manera de plasmar sus ideas de forma compacta sin perder el carácter formal, este modelo se considera como una herramienta la cual posee un conjunto de elementos que permiten su construcción y a su vez son el punto de partida en la simulación (Pérez, 1996).

Por otro lado, están las últimas fases de la simulación, expresar el modelo en programa computacional, el análisis estadístico y un resumen de conclusiones o reporte de desempeño. Estas fases son de neta importancia porque es allí donde se centra el estudio y la verificación de hipótesis.

Para finalizar tanto la programación, como la simulación son herramientas invaluables para el investigador moderno, no cabe duda que aún queda mucho por aprender pero aprender simulación con python ha sido un abrebocas a un increíble mundo por conocer, me doy por bien retribuido.

Un poco más.

Python es un potente lenguaje de programación de fácil aprendizaje, son muchas las ventajas que presenta, y prácticamente sirve para todo, invito a todo aquel que quiera dar un paso gigante al mundo del crear que se inicie en este lenguaje, el hambre por el conocimiento demandara nuevas innovaciones, somos nosotros los que decidimos en que parte del mundo queremos estar, en el lado de los que lo construyen o en los que solo consumen.

Referencias.

Bender, Duane, y Kamran Sartipi. 2013. «HL7 FHIR: An Agile and RESTful approach to healthcare information exchange». En , 326–31. IEEE. https://doi.org/10.1109/CBMS.2013.6627810.

Allen B. Downey. (2018). Modeling and Simulation in Python. 2018, de greenteapress Sitio web: http://greenteapress.com/wp/modsimpy/

Jorgejuan. (2016). Jupyter Notebook Atajos de Teclado Keyboard Shortcuts. 2018, de cheatography Sitio web: https://www.cheatography.com/jorgejuan007/cheat-sheets/jupyter-notebook-atajos-de-teclado/

Alegsa. (2015). Definición de Variable. 2018, de Alegsa Sitio web: http://www.alegsa.com.ar/Dic/variable.php

Codigoprogramacion. (2012). Definición de Tipo de datos. 2018, de Codigoprogramacion Sitio web: http://codigoprogramacion.com/python

Alegsa. (2015). Definición de bucle. 2018, de Alegsa Sitio web: http://www.alegsa.com.ar/Dic/bucle.php

Codigoprogramacion. (2012). Definición de Funcion. 2018, de Codigoprogramacion, Sitio web: http://codigoprogramacion.com/python

Perez, Anavelyz. (2016). Introducción a la simulación. 2018, de Medium Sitio web: https://medium.com/datonautas/introducci%C3%B3n-a-la-simulaci%C3%B3n-8ed449c8099a

Camacho, Yurely. (2016). SIMULACIÓN: Construyendo modelos conceptuales. 2018, de Medium Sitio web: https://medium.com/datonautas/simulaci%C3%B3n-construyendo-modelos-conceptuales-5420d07381f0

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade