Skip to content

Commit 68d9366

Browse files
committed
de manu
1 parent c5cd849 commit 68d9366

15 files changed

+68
-29
lines changed

Notas/07_Plt_Especificacion_y_Documentacion/05_Especificacion_y_Documentacion.md

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -273,33 +273,43 @@ _Ayuda: Estas sumas se pueden escribir como diferencia de dos [números triangul
273273

274274
## Invariantes de ciclo
275275

276-
Los invariantes se refieren a estados o condiciones que no cambian dentro de un contexto o porción de código. Hay invariantes de ciclo, que son los que veremos a continuación, e invariantes de estado, que se verán más adelante.
276+
Los invariantes se refieren a estados o situaciones que no cambian dentro de un contexto dado. Hay diferentes tipos de invariantes. A continuación veremos los invariantes de ciclo que nos ayudan a llegar desde las precondiciones hasta las postcondiciones.
277277

278-
Un invariante de ciclo es una aseveración que debe ser verdadera al comienzo de cada iteración del ciclo y al salir del mismo.
278+
Un _invariante_ de ciclo es esencialmente una aseveración que debe ser verdadera al final de cada iteración. Pensar en términos de invariantes de ciclo nos ayuda a reflexionar y comprender mejor qué es lo que debe realizar nuestro código y nos ayuda a desarrollarlo.
279279

280-
Por ejemplo, si el problema es ir desde el punto A al punto B, la precondición dice que tenemos que estar parados en A y la poscondición que al terminar estaremos parados en B. En este caso las siguientes aseveraciones son invariantes: "estamos en algún punto entre A y B", "estamos en el punto más cercano a B que estuvimos hasta ahora". Son aseveraciones que podría tener nuestro código (y dependen exclusivamente de cómo lo programamos).
281-
282-
Pensar en términos de invariantes de ciclo nos ayuda a reflexionar y comprender mejor qué es lo que debe realizar nuestro código y nos ayuda a desarrollarlo.
283-
284-
Por ejemplo, para la función `maximo`, que busca el valor más grande de una lista desordenada, podemos enunciar:
285-
- precondición: la lista contiene elementos que tienen una relación de orden (son comparables con <)
286-
- poscondición: se devolverá el elemento máximo de la lista, si es que tiene elementos, y si no se devolverá None.
280+
Veamos un ejemplo: supongamos que analizamos un ciclo que buscar el máximo en una lista no necesariamente ordenada. La precondición es que la lista es no vacía y contiene elementos que son comparables y la postcondición es que se devuelve el elemento máximo de la lista. Por convención, diremos que el máximo de una lista vacía es menos infinito.
287281

288282
```python
283+
import math
284+
289285
def maximo(lista):
290-
'Devuelve el elemento máximo de la lista o None si está vacía.'
291-
if not lista:
292-
return None
293-
max_elem = lista[0]
286+
'''
287+
Pre: La lista contiene elementos comparable entre sí y con math.inf
288+
Pos: La función devuelve el elemento máximo de la lista.
289+
'''
290+
291+
max_elem = -math.inf
294292
for elemento in lista:
295293
if elemento > max_elem:
296294
max_elem = elemento
297295
return max_elem
298296
```
299297

300-
En este caso, el invariante del ciclo es que `max_elem` contiene el valor máximo de la porción de lista que ya fue analizada.
301298

302-
Los invariantes son de gran importancia al momento de demostrar formalmente que un algoritmo funciona, pero aún cuando no hagamos una demostración formal resulta útil tener los invariantes a la vista, ya que de esta forma es más fácil entender cómo funciona un algoritmo y encontrar posibles errores.
299+
En este caso, el invariante del ciclo es la siguiente afirmación: "max_elem contiene el valor máximo de la porción de lista analizada".
300+
301+
**DEMOSTRACIÓN (aburrida) DE QUE SE MANTIENE VERDADERO ESTE INVARIANTE:** Veamos que este invariante se mantiene verdadero a lo largo de las iteraciones. Es evidente que es verdadera antes de entrar al ciclo ya que no se ha analizado ningún elemento por lo que se considera que la lista analizada es vacía y, como se dijo antes, por convención, el máximo es menos infinito.
302+
303+
Ahora procedemos por inducción en la cantidad de iteraciones: supongamos que para i iteraciones (`i>=0`) el invariante se ha mantenido verdadero y que entramos en la iteración `i+1`. Entonces, la variable `max_elem` vale el máximo de la lista entre la posición `0` y la posición `i` (considerando el valor menos infinito si `i==0`). Luego analizamos si el (`i+1`)-ésimo elemento es mayor que `max_elem` y si así fuera redefinimos esta variable, haciendo que se mantenga verdadero el invariante pues, evidentemente, `max_elem` será el máximo entre los primeros `i+1` elementos de la lista analizada.
304+
305+
Concluímos, por inducción, que el invariante se mantiene verdadero a lo largo de todas las iteraciones
306+
**FIN DE LA DEMO**
307+
308+
Este caso es relativamente sencillo, pero nos permite concluir que, al terminar las iteraciones la variable `max_elem` toma como valor el máximo de toda la lista (volver a leer el invariante, considerando el caso cuando se hace la última iteración), que es lo que afirma la postcondición. Es decir, nos permite demostrar matemáticamente que el algoritmo hace lo que decimos que hace.
309+
310+
Además, nos permite ver cómo lo hace: lo hace asegurándose que al ir recorriendo la lista se guarda el máximo hasta ese momento.
311+
312+
En conclusión: los invariantes de ciclo son fundamentales para poder demostrar formalmente que un algoritmo hace lo que decimos que hace. Pero incluso si no estamos buscando una demostración formal de la correctitud de nuestro algoritmo, el concepto de invariante es útil para entender cómo funciona un algoritmo y encontrar posibles errores.
303313

304314
Los invariantes, además, son útiles a la hora de determinar las condiciones iniciales de un algoritmo, ya que también deben cumplirse para ese caso. Por ejemplo, consideremos el algoritmo para obtener la potencia `n` de un número.
305315

Notas/08_Fechas_Carpetas_y_Pandas/00_Resumen.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# 8. Fechas, Carpetas y Pandas
22
En esta clase introducimos el módulo `datetime` para manejar datos relacionados con el tiempo (Sección 2) y un par de funciones del módulo `os` para leer directorios, procesar archivos y realizar algunas tareas relacionadas con el sistema operativo (Sección 3). Luego te proponemos integrar esto para hacer un script que corra desde línea de comandos y te permita ordenar los archivos de cierto tipo (Sección 4).
33

4-
En la segunda mitad introducimos el módulo Pandas y el tipo `DataFrame` así como algunos de sus métodos elementales. Usamos pandas para analizar dos datasets de Arbolado Porteño graficando algunos de sus datos. En esta parte tenés que comparar caracterísiticas de árboles que crecen en los parques con otros que crecen en las veredas (Sección 5 y ejercicio de revisión por pares).
4+
En la segunda mitad introducimos el módulo `pandas` y el tipo `DataFrame` así como algunos de sus métodos elementales. Usamos pandas para analizar dos datasets de Arbolado Porteño graficando algunos de sus datos. En esta parte tenés que comparar características de árboles que crecen en los parques con otros que crecen en las veredas (Sección 5 y ejercicio de revisión por pares).
55

6-
En la última parte te proponemos análizar ondas de mareas en el Río de la Plata como excusa para introducir el procesamiento de series temporales. Nos metemos un poco en temas específicos con una última parte optativa que incluye un breve análsis de la transformada de Fourier para medir el tiempo que tarda esta onda de marea en trasladarse de un puerto a otro.
6+
En la última parte te proponemos analizar ondas de mareas en el Río de la Plata como excusa para introducir el procesamiento de series temporales. Nos metemos un poco en temas específicos con una última parte optativa que incluye un breve análsis de la transformada de Fourier para medir el tiempo que tarda esta onda de marea en trasladarse de un puerto a otro.
77

88

99
* [8.1 Introducción](01_Intro.md)

Notas/08_Fechas_Carpetas_y_Pandas/02_Fechas.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ Visitá [la documentación](https://docs.python.org/3/library/datetime.html#strf
357357
## Ejercicios:
358358

359359
### Ejercicio 8.1: Segundos vividos
360-
Escribí una función a la que le pasás tu fecha de nacimiento como cadena en formato 'dd/mm/AAAA' (día, mes, año con 2, 2 y 4 dígitos, separados con barras normales) y te devuelve la cantidad de segundos que viviste (asumiendo que naciste a las 00:00hs de tu fecha de nacimiento).
360+
Escribí una función llamada `vida_en_segundos(fecha_nac)` a la que le pasás tu fecha de nacimiento y te devuelve la cantidad de segundos que viviste (asumiendo que naciste a las 00:00hs de tu fecha de nacimiento). La función debe tomar como entrada una cadena en formato 'dd/mm/AAAA' (día, mes, año con 2, 2 y 4 dígitos, separados con barras normales) y devolver un `float`.
361361

362362
Guardá este código en el archivo `vida.py`.
363363

Notas/08_Fechas_Carpetas_y_Pandas/03_Archivos_y_Directorios.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ import os
215215
import datetime
216216
import time
217217

218-
camino = './rebotes.py'
218+
camino = '../Clase06/rebotes.py'
219219

220220
stats_archivo = os.stat(camino)
221221
print(time.ctime(stats_archivo.st_atime))
@@ -231,6 +231,6 @@ stats_archivo = os.stat(camino)
231231
print(time.ctime(stats_archivo.st_atime))
232232
```
233233

234-
Si mirás la información del archivo `./rebotes.py` desde tu gestor de archivos deberías ver las modificaciones.
234+
Si mirás la información del archivo '../Clase06/rebotes.py' desde tu gestor de archivos deberías ver las modificaciones.
235235

236236

Notas/08_Fechas_Carpetas_y_Pandas/04_Ordenando_archivos.md

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,36 @@
11
# 8.4 Ordenar archivos en Python
22

3-
En esta sección vamos a integrar las últimas dos secciones con lo que veníamos viendo antes del parcial. La idea es que descomprimas [este archivo](./ordenar.zip) en tu carpeta `../Data/` y escribas un script que trabaje con estos archivos.
3+
En esta sección vamos a integrar las últimas dos secciones con lo que veníamos viendo antes del parcial. La idea es que descomprimas [este archivo](./ordenar.zip) en tu carpeta `../Data` y escribas un script que trabaje con estos archivos.
44

55
Esta sección tiene un ejercicio para entregar y luego otro más complejo que es optativo.
66

77
### Ejercicio 8.5: Recorrer el árbol de archivos
8-
Escribí un programa que dado un directorio, imprima en pantalla los nombres de todos los archivos `.png` que se encuentren en *algún* subdirectorio del él.
8+
Definí una función llamada `archivos_png(directorio)` que arme una lista de todos los archivos .png que se encuentren en algún subdirectorio directorio dado.
99

10-
_Observación:_ Al final, tu script debería poder ejecutarse desde la línea de comandos recibiendo como parámetro el directorio a leer original. En la [Sección 7.3](../07_Plt_Especificacion_y_Documentacion/03_Modulo_principal.md#modelo-de-script-con-parámetros) dimos un modelo de script que te puede servir.
10+
Probá tu función con distintos directorios. Por ejemplo
11+
12+
```python
13+
>>> archivos_png('../Data/ordenar')
14+
['good_code_20190621.png',
15+
'git_20190503.png',
16+
'correlation_20200924.png',
17+
'duty_calls_20180321.png',
18+
'pregnant_20200102.png',
19+
'ppx_20180917.png',
20+
'twitter_bot_20181225.png',
21+
'standards_20190421.png',
22+
'unicode_20200718.png',
23+
'sandwich_20201002.png',
24+
'python_20190812.png']
25+
```
26+
27+
Escribí un programa que dado un directorio, imprima en pantalla los nombres de todos los archivos `.png` que se encuentren en *algún* subdirectorio del él. Tu programa debe poder ejecutarse desde la línea de comandos recibiendo como parámetro el directorio a leer original. Para esto, organizá tu código como lo indicamos en la [Sección 7.3](../07_Plt_Especificacion_y_Documentacion/03_Modulo_principal.md#modelo-de-script-con-parámetros). Primero los imports, luego las funciones (en este caso solamente la función `archivos_png()`), y luego el bloque con las instrucciones para el caso `__name__ == '__main__'`.
1128

1229
Guardá el script resultante en un archivo `listar_imgs.py`.
1330

31+
Probá el programa desde la terminal, pasándole distintos directorios como parámetro.
32+
33+
1434
### Ejercicio 8.6: Ordenar el árbol de archivos (optativo)
1535
Escribí un programa que te permita ordenar las imágenes PNG de esta carpeta. Guardalo en un archivo `ordenar_imgs.py`.
1636

@@ -31,7 +51,15 @@ _Observación:_ Este tipo de tareas se repite con mucha frecuencia. Tener la cap
3151

3252
**Algunos puntos importantes:**
3353

34-
* Te recomendamos que modularices el procesamiento de los archivos `png`. Podés, por ejemplo, escribir una función que manipule strings (que tome el nombre de un archivo y devuelva la fecha y el nombre corregido) y otra función que precese cada archivo (que use la función anterior para renombrar, mover y modificar la fecha de cada archivo). La modularización del código es clave para que otras personas lo puedan entender y que sea sencillo de mantener.
54+
* Te pedimos que modularices el procesamiento de los archivos `png`. Para eso, definí por un lado una función `procesar_nombre(fname)` que tome el nombre de un archivo y devuelva la fecha y el nombre corregido, y por el otro una función `procesar(fname)` que procese cada archivo (que use la función anterior para renombrar, mover y modificar la fecha de cada archivo). La modularización del código es clave para que otras personas lo puedan entender y que sea sencillo de mantener.
55+
56+
```python
57+
>>> procesar_nombre('correlation_20200924.png')
58+
('correlation.png', datetime.datetime(2020, 9, 24, 0, 0))
59+
```
60+
3561
* Usá docstrings y comentarios en tu código de manera que sea legible.
3662

63+
* Al terminar de usar el código, comentá todas las instrucciones salvo los imports y las definiciones de funciones, para poder entregarlo al cierre de la clase.
64+
3765

Notas/08_Fechas_Carpetas_y_Pandas/06_Series_Temporales.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ Guardá lo que hayas hecho hasta acá en el archivo `mareas_fft.py` para entrega
452452
### Ejercicio 8.14: Otros períodos
453453
El primer análisis se realizó con el primer semestre del 2014 ya que no tiene ni datos faltantes ni outliers. Este ejercicio es una invitación a explorar estos problemas tan frecuentes.
454454

455-
* ¿Se puede comparar Zárate con San Fernando usando todos los datso de Zárate? ¿Cómo se comporta San Fernando en esas fechas?
455+
* ¿Se puede comparar Zárate con San Fernando usando todos los datos de Zárate? ¿Cómo se comporta San Fernando en esas fechas?
456456
* ¿Se pueden usar las series completas de BA y SF para calcular el desfasaje de la onda de mareas? ¿Qué son las alturas negativas? ¿Tienen sentido?
457457

458458
La siguiente función completa datos faltantes y corrige pequeños problemas en los índices. Es un poco brutal tratar así un DataFrame: es conveniente mirar los datos antes de completar faltantes. Lo dejamos como puntero a diferentes métodos muy útiles para la limpieza de series.

Notas/08_Fechas_Carpetas_y_Pandas/07_Cierre.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ Para cerrar esta clase te pedimos dos cosas:
99
3. El archivo `arbolado_parques_veredas.py` del [Ejercicio 8.9](../08_Fechas_Carpetas_y_Pandas/05_Pandas.md#ejercicio-89-comparando-especies-en-parques-y-en-veredas).
1010
4. El archivo `mareas_a_mano.py` del [Ejercicio 8.10](../08_Fechas_Carpetas_y_Pandas/06_Series_Temporales.md#ejercicio-810).
1111

12-
Te proponemos además dos optativos:
13-
1. El archivo `ordenar_imgs.py` del [Ejercicio 8.6](../08_Fechas_Carpetas_y_Pandas/04_Ordenando_archivos.md#ejercicio-86-ordenar-el-arbol-de-archivos-optativo).
14-
2. El archivo `mareas_fft.py` del [Ejercicio 8.13](../08_Fechas_Carpetas_y_Pandas/06_Series_Temporales.md#ejercicio-813-otros-puertos).
15-
12+
Te proponemos además dos optativos:
13+
14+
- El archivo `ordenar_imgs.py` del [Ejercicio 8.6](../08_Fechas_Carpetas_y_Pandas/04_Ordenando_archivos.md#ejercicio-86-ordenar-el-arbol-de-archivos-optativo).
15+
- El archivo `mareas_fft.py` del [Ejercicio 8.13](../08_Fechas_Carpetas_y_Pandas/06_Series_Temporales.md#ejercicio-813-otros-puertos).
16+
1617
* Que completes [este formulario](https://docs.google.com/forms/d/1haqMkdYb-jYXS-lwjUdkLP2P_HoIM0ev0LypW_0Z4Dc) usando tu dirección de mail como identificación. Al terminar vas a obtener un link para enviarnos tus ejercicios.
1718

1819
La corrección de pares de esta semana será con el archivo `arbolado_parques_veredas.py` del [Ejercicio 8.9](../08_Fechas_Carpetas_y_Pandas/05_Pandas.md#ejercicio-89-comparando-especies-en-parques-y-en-veredas).
66.6 KB
Loading
9.68 KB
Loading
9.53 KB
Loading

0 commit comments

Comments
 (0)