Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CLASE 1 – 18/08
Parciales suelen ser en 3 instancias: teórico, practico y a la semana siguiente defender lo que
hicimos
o Primer parcial Unidad 1 y 2 paradigma orientado a objetos
o Segundo parcial Unidad 3 y 4 paradigma funcional
Trabajo de investigación Unidad 5 Elegir entre estos temas de investigación para
presentarlo y defenderlo en la semana 15: Introducción al machine learning. Introducción al Deep
learning. Algoritmos de redes neuronales. Práctica de generación de red neuronal sobre placa
microbit y/o simulación. Framework Anaconda y miniconda, descripción y uso práctico.
Final va a ser presencial. Si vamos a coloquio, el final es una presentación sobre el trabajo de
investigación.
Python es un lenguaje multiparadigma (estructurado, orientado a objetos, funcional). Sin embargo, hay
ciertas características del POO que no las respeta, por ejemplo: no se puede tener métodos y estados
privados. Este lenguaje permite hacer todo tipo de programas: programas comunes, videojuegos,
Inteligencia Artificial, Machine Learning, programa de un sistema de gestión, páginas web, etc.
Python tiene un tipado dinámico: no es necesario declarar el tipo de dato para crear una variable. Si no
soy prolijo programando puedo hacer un desastre. Una variable tipo int puede cambiar a string. Los tipos
de datos pueden ser simples o complejos. Dentro de los tipos de datos simples: int, string, float y bool.
Acuerdos/normas específicas: todas las variables se van a tener que escribir siempre en minúscula.
Si la variable tiene mas de una palabra, se debe colocar guion bajo (ej.: “edad_del_perro”). Python no
tiene constantes (un espacio en memoria que mantiene siempre el mismo valor), son todas variables. Sin
embargo, las constantes las vamos a declarar como variables en mayúscula.
Estructuras de decisión: Python no tiene swich, solo tenemos el if. Instrucciones simples y
compuestas. Instrucción compuesta: conjunto de instrucciones simples, en C# se escriben entre “{ }”.
Sirven para que se ejecuten un bloque de instrucciones. En Python se escriben con tabulaciones
(seleccionándolo, asegurarse de que se tabulo mirando
los “….” que representan 4 espacios). En Python, “else if”
pasa a ser “elif”. Si tengo 3 opciones/condiciones por lo
menos necesito 2 if. Siempre es 1 if menos a la
cantidad de condiciones que hay.
Un algoritmo debe respetar: ser preciso (orden), ser definido (resultado) y ser finito. Un algoritmo
debe describirse en tres partes: entrada, proceso y salida.
Una variable es un espacio en memoria. Es una manera de identificar un dato que no conocemos y vamos
a usarlo en el algoritmo. Definen un tipo de dato: entero, decimales, texto. Cada variable guarda solo un
dato a la vez.
CLASE 2 – 25/08
Una forma de abrir una carpeta en VSCode es ir a la ventana de comandos (Windows+GIT), luego
ingresar la dirección de la carpeta a la que se quiere acceder (C:\Users\Natasha Belen Luna\OneDrive\
Escritorio\JUEVES-PROG.2\PYTHON + ENTER), y por ultimo escribir “code .”.
En caso de estar trabajando con muchas versiones de Python, o con distintas aplicaciones, o de querer
armar espacios distintos, la librería “virtualenv” permite crear una carpeta virtual. Se puede tener
espacios con distinta configuración de librerías dependiendo el proyecto que se esté haciendo. Ingresando
por la terminal “Python -m virtualenv” + un nuevo nombre, se genera una carpeta con un montón de
librerías. Dentro de “Lib”, se cargan todos los comandos y la configuración de Python como si tuviese una
sola versión, quedando una especie de maquina virtual con esa configuración. En la parte de “Scripts”, se
puede deshabilitar y habilitar esa maquina virtual. Colocando en la terminal “.\JUEVES\Scripts\activate” se
crea una especie de espacio virtual. La diferencia con el espacio por default: cuando coloco “pip list”, se
ve que el espacio es distinto, si se instalan librerías, aplicaciones, etc., va a quedar todo configurado en esa
máquina virtual. No se instalarán todas las librerías en máquina de forma global.
En Python, “import” es como el “using” de C#. Si coloco la instrucción “os.system(“cls”)”, se limpia la
pantalla de la terminal. Se pueden renombrar las librerías colocando “as”.
https://docs.python.org/3/library/math.html
Python tiene una ejecución secuencial. A su vez, tiene muchas permisiones que otros lenguajes no tienen,
por ejemplo: la primera función no necesariamente tiene que ser “def main():”, arriba de ella puedo
escribir otras instrucciones. Se desordena bastante el código. Es por
eso que al final del código ponemos: if __name__=="__main__":
Al trabajar con funciones trigonométricas Python trabaja con radianes, por lo tanto, hay que hacer la
conversión de radianes (3*pi/4) a grados.
En Python podemos crear “módulos” (librerías) de funciones e importarlos a cualquier archivo para poder
reutilizar esas funciones. Para poder lograrlo se crea una carpeta llamada “lib” con los siguientes archivos:
“funciones.py” (que será el archivo con las funciones), “__ini__.py” (un archivo vacío). Para luego
importarla: “import lib0610.funciones as fun” (importas de la carpeta un archivo de funciones y luego
llamamos a esas funciones a través del punto)
CLASE 3 – 01/09
Python solo maneja 2 instrucciones de repetición. El for tiene vueltas finitas (en Python, es parecido al
foreach). El while tiene una cantidad de vueltas desconocida.
Python es de tipado dinámico. Las comillas simples y dobles las toma como semejantes.
Cuando escribimos una función, el tabulador sirve para indicar que la instrucción está dentro del bloque
de la función.
El if es una construcción rudimentaria, genera mucha carga. En vez de trabajar con if, debería trabajar
con tipos. La complejidad siplomatica define el grado de complejidad que tiene un código. Si cuento
la cantidad de regiones y le resto 1, me devuelve el grado de complejidad. Si la cantidad esta cerca del 10
es muy complejo y del 1 es muy bajo. Otra forma es contando la cantidad de if y restarle 1. Cuantos
mas if hay dentro de un código, el código es menos mantenible ya que el grado de complejidad va
aumentando. Es por eso que se debe evitar el uso del if.
Si en C# quiero recorrer una lista con distintos tipos de objetos podría realizarse usando el tipo de dato
“object”. En Python es más fácil, no tan rudimentario.
En Python tenemos los tipos de datos simples (int, float, string, bool) y los complejos. Dentro de los
complejos tenemos 3 elementos que se conforman como cadenas de nodos que tienen valores: las tuplas,
las listas y los diccionarios. La tupla es inmutable, funciona como una constante de c#, le asigno valores
que luego no los puedo cambiar. Los caracteres que representa la tupla son (). Las listas son mutables, le
puedo cambiar valores, las modifico libremente, son dinámicas. Los caracteres que las representa son [].
Los diccionarios tienen en cada nodo una dupla de clave (key, números o strings) y valor (lo que quiera).
Los caracteres que los representa son {}.
Los caracteres son los constructores que le dicen a Python como lo tiene que construir (tupla, lista o
diccionario). En caso de querer agregar un solo nodo dentro de una tupla siempre tengo que acompañarlo
de una “,”. Una tupla se ejecuta más rápido que una lista.
CLASE 4 – 08/09
Los argumentos son los valores que estoy pasando al llamar a una función y van a ser recibidos como
parámetros.
En una tupla, el constructor es la coma. “Las properties en C# no/si son parte del estado” pregunta
tramposa de examen.
Python hace parecer que dentro de una función se permite devolver más de un valor de retorno. Pero en
realidad, lo que se está devolviendo es una tupla.
En vez de importar una librería completa, Python permite importar una librería en forma parcial. Por
ejemplo, una sola función (y la puedo renombrar tambien).
A una función recursiva se le debe poner una marca para decir en qué momento termina. Si no tiene un
corte de control, estoy saturando el stack de llamadas que tiene el lenguaje y en un momento me da
overflow.
Los parámetros pueden tener un valor por defecto. Esto se hace poniendo al lado del parámetro “=” + el
valor que se le quiere asignar.
En Python no tenemos sobrecarga, es decir, en la misma clase 2 métodos iguales con distinta firma. Esto
no es lo mismo que una sobreescritura. Si queremos hacer sobrecarga, tenemos que importar una librería
que nos permita hacerlo. La librería dispatch me permite hacer una sobrecarga. (Ejemplo en
lib0809/mislib.py).
Los try – except van de lo mas particular a lo más general. También se puede tener un else, que se
ejecuta cuando hay un error y un finally, que se ejecuta siempre.
Pero en Python, el concepto de privado no existe. No puedo tener métodos que no tengan parámetros.
Como mínimo, el parámetro que deben tener es “self”. El “self” representa lo que en C# es el “this”. El
“self” permite poder tener acceso a todos los valores internos.
En C# el constructor debe tener el mismo nombre que la clase. En Python, el constructor tiene un
nombre especifico: “def __init__(self):” y el destructor: “def __del__(self):”
En Python puedo declarar variables globales. Estas pueden estar fuera de una función (por ejemplo de
la función main()) declaradas arriba de todo el código. Pero también pueden estar dentro de una función
acompañadas de la palabra “global”.
CLASE 8 – 06/10
Python, además de tener los tipos de datos simples (int, float, string) y complejos (colecciones: listas,
tuplas, diccionarios), tiene un tipo de dato que es un conjunto, un “set”. Este tiene las mismas
características que una tupla (es inmutable) pero se declara como un diccionario (con llaves), pero sin
darle valores a las llaves. Dentro de un set, no se reconocen valores repetidos, no los muestra. Si son de
distinto tipo los toma diferentes (por ejemplo, si tiene un 4 y un “4” se mostrarán ambos). El boleano no lo
toma en cuenta si no se encuentra al principio del set.
La librería “numpy” nos permite trabajar con vectores multidimensionales (matrices), que sería lo
mismo que trabajar con listas, pero los vectores son más livianos, por lo tanto, más rápidos.
La librería “pandas” nos permite manipular los datos de un dataset o de distintos archivos como las
fuentes de orígenes. Es la herramienta con la que vamos a poder traccionar (tratar) con esos datos.
Proceso de TL (bases de datos aplicada): extraer los datos y transformarlos para poder utilizarlos.
La librería “scipy” extiende las funciones de numpy agregando características más particulares con
funciones matemáticas o algorítmicas. Probablemente se necesite importar la librería math.
La librería “matplotlib” nos permite hacer gráficos. Transforma los datos que leemos y los muestra en
un entorno gráfico.
La librería “sklearn” es más cercana al machine learning. Nos permite trabajar con algoritmos
supervisados (bases de datos aplicada 1 y 2). Tratamiento con respecto a los datos.
Con Python no se puede respetar fielmente la teoría de objetos. En POO, todas las clases tienen un estado
(siempre privado) y un comportamiento (privado o público). La única manera de modificar el estado es
utilizando los métodos. Python no tiene el concepto de privado, pero vamos a hacer convenciones para
simular un privado comenzando las variables con “_”. Python si tiene el concepto de herencia. El
constructor se declara como una función siempre con la palabra reservada “__init__” (def __init__():).
También se puede poner el destructor con la palabra reservada “__del__” (def __del__(self):).
Big data es la ciencia que evalúa la transferencia de datos. Importar y exportar gran cantidad de datos. El
concepto nació con Youtube (no podía mover tanta información). Bases de datos en SQL son bases de
datos en archivos planos. Motor de datos.
Data Warehouse es un esquema de modelo que tiene como fin algo diferente a la base de datos
relacional. Esta ultima tiene como fortaleza poder manejar muchas transacciones diarias y guardar la
información completa que necesito para alimentar mi sistema de información en ese movimiento de
transacciones cotidianas. En cambio, el Data Warehouse tiene como fin guardar gran cantidad de datos. Se
tiene una base de datos con información actual y otra con información vieja. Fuente de datos para que
alguien los pueda tomar, analizarlos y encontrar patrones de comportamiento para poder predecir datos
que no tengo.
Data Mining, extracción de datos de una fuente de origen (generalmente un Data Warehouse). En esta
materia estamos a esta altura. Base de datos aplicada 2.
Una vez que hago la extracción de datos, voy a tener dos variantes del análisis. Primero, una
transformación del Data Mining que se da cuando se trata de buscarle sentido a los datos pero expresados
dentro de un entorno controlado de un área de negocios. Cuando el análisis de los datos lo hago en
función de un área de negocios (área particular de una empresa) se denomina Business Intelligence
(BI).
El Machine Learning se produce cuando se trata de hacer un análisis por medio de un conjunto de
patrones/algoritmos supervisados y no supervisados. Intento de encontrar un patrón que todavía no
conozco. En cambio, en el BI, mientras se produce el análisis de los datos buscando un patrón, el patrón
que estoy buscando lo conozco.
Data Science. El técnico de datos es una persona que conoce todas estas temáticas y puede aplicar esa
experiencia en el análisis de los datos. Cuando se hacen esas comparaciones/análisis de los datos,
buscamos estadísticas. La estadística es una disciplina científica que se ocupa de redactar datos y
manipularlos. Existen dos tipos de estadísticas: la descriptiva y la inferencial. La estadística descriptiva
tiene como propósito describir y analizar un determinado conjunto de datos sin sacar conclusiones. Esto es
lo que vamos a hacer en el trabajo practico grupal: buscar cierta información y mostrarla en un gráfico. La
estadística inferencial se refiere a los métodos que usamos para poder hacer predicciones. Obtener
conclusiones en función del análisis de los datos.
El conjunto de datos representa una muestra de un conjunto de datos que puede tomar una variable en
toda una población. Una vez que tengo los datos parciales de la muestra, debo analizar algunas variables.
Existen distintos tipos de variables: algunas van a ser cuantificables, es decir, poder medirlas en valores y
otras cualitativas, las voy a poder representar en forma comparativa (no numérica).
Dentro de las variables cuantitativas, están las variables cuantitativas discretas que son aquellas
que toman valores fijos (no pueden tomar valores con decimales). Ejemplo: cantidad de hijos. También
están las variables cuantitativas continuas, que son aquellas que pueden tomar un numero infinito no
numerable de valores. Ejemplo: temperatura máxima. La diferencia entre estos dos tipos de variables está
en los decimales: las discretas son números enteros mientras que las continuas pueden ser números con
decimales.
Dentro de las variables cualitativas, están las variables cualitativas nominales, que son aquellas que
no se pueden ordenar. Ejemplo: nacionalidad. Y también están las variables cualitativas ordinales, que
si se pueden ordenar, pero que no tienen una clasificación numérica. Ejemplo: grado de satisfacción
(malo/bueno/excelente).
Puedo mostrar la información en informes, tablas y gráficos. La tabla de frecuencias muestra los datos
ordenados, con columnas como: la puntuación (la variable), la absoluta, absoluta acumulada, relativa,
relativa acumulada. Paradoja de Simpson. Hay que tener mucho cuidado con el análisis de los datos. A
veces conviene hacer el análisis por totales y otras veces por sectores.
Hay distintos tipos de gráficos. Los gráficos de barras son representaciones entre dos variables (una en
el eje x y otra en el y). Cuando las columnas se representan con las frecuencias ordenadas de mayor a
menor se lo conoce como diagrama Pareto. También existe el diagrama de sectores, el pictograma
(se usan dibujos) y los histogramas (para variables continuas). Para cada tipo de variable conviene usar
gráficos determinados. Variable cuantitativa discreta: histograma/barras. Variable cuantitativa continua:
torta/líneas. Variable cualitativa nominal: pictograma. Variable cualitativa ordinal: barra/tortas. Variable
cualitativa discreta: barras acumuladas/dispersión.
En POO tenemos la creación de la clase y de la instancia de la clase. Con Python tenemos muchas
limitaciones en comparación con C#. El estado privado de una clase se debe modificar solamente por
medio de los métodos. En C# construimos “properties” con doble tabulación, mientras que en Python
tenemos que construir “a mano” los getters y setters y luego la property (C9-13-10_1.py). Dentro de
los métodos de las clases siempre debemos agregar el parámetro/atributo “self” que es una
pseudoclase que hace referencia a si mismo (“this” de C#). Podemos definir herencias. En Python
tenemos herencia múltiple pero no es una buena práctica. No tenemos la opción de sobrecarga. El
“super()” es una pseudoclase como el “self” que sirve para llamar al método de la clase base. El
constructor no se hereda. Para agregar clases abstractas e interfaces se deben agregar determinadas
librerías. Se puede importar librerías que contengan archivos con conjunto de clases. Incluso se puede
importar esas librerías de forma parcial de modo que se importen clases específicas. Existe el
polimorfismo por sobreescritura (tener un método que se sobrescribe) o polimorfismo paramétrico
(le paso un parámetro y tengo un if dentro del método).
Al diseñar un programa orientado a objetos, es recomendable colocar una clase que tenga que ver con el
negocio. Por ejemplo, si se está diseñando un sistema para bancos, la primera clase a crear será “Banco”.
El constructor solo lo pongo si quiero que haga algo especifico. Si quiero el constructor vacío no lo
declaro, no hago nada.
Cuando en un ejercicio una variable tiene un tipo de dato especifico, como estamos trabajando con Python,
no hace falta ponerle tipo de dato. Pero con la librería Pandas, vamos a tener que empezar a indicar tipos
de datos.
Consulta, la clase cuenta, en este caso, sería abstracta. ¿Existe en Python? Sí, pero el conceto no es el
mismo. La podrían instanciar si el programador no entiende el modelo. Referencia para crear una clase
abstracta docs.python.org/es/dev/library/abc.html
Property:
TP6.pdf
1. ¿Cuál podría ser el enunciado de este diagrama de clases? El enunciado del diagrama de clases
presentado podría ser el siguiente: …
5. ¿Se puede obtener una carpeta desde un objeto imagen? Justifique Si/No, ya que …
7. ¿Por qué contacto no hereda de adjunto? Justifique Contacto no hereda de Adjunto porque …
TP7.pdf + TP8.pdf
ABRIR C9-13-10_4.py
CLASE 11 – 27/10
Trabajo practico: descargar un archivo de algún repositorio de archivos. En español: nación, provincia,
capital. https://datos.gob.ar/dataset. Va a premiar el ingenio del trabajo.
Tres librerías que vamos a trabajar: pandas, numpy y matplotlib.pyplot. Con numpy tenemos la
posibilidad de crear vectores (estructuras multidimensionales). Con pandas tenemos la posibilidad de
trabajar con 2 tipos de datos específicos: series y dataframes. Con matplotlib podemos generar
gráficos tomando esos insumos.
Puedo trabajar con pandas traccionando cualquier insumo de datos. Las series están numeradas por
número de fila. Los dataframes automáticamente genera una tabla y lo trabaja como una matriz
dimensional.
Los dataframes son un conjunto de datos organizados en tablas. Tienen un índice formado por la fila y la
columna. Se puede crear desde otras estructuras. Se puede crear de archivos externos.
Recorrer un dataframe:
Acceso al valor:
Gráficos. Con los ylabel y xlabel me pone las leyendas en los costados del gráfico. En un gráfico de
barras, coloco kind='bar' para que se muestren las barras en vertical y 'barh' en horizontal. kind='pie'
para generar un grafico circular. kind='scatter' para generar un grafico de dispersión. También puedo
generar gráficos con datos mas específicos directamente desde la librería matplotlib. Por ejemplo puedo
directamente escribir mp.pie() indicando el dataframe respectivo.
Notes:
17/11/2022 entrega TP
24/11/2022 segundo parcial
01/12/2022 recuperatorios