You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: Notas/07_Plt_Especificacion_y_Documentacion/05_Especificacion_y_Documentacion.md
+25-15Lines changed: 25 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -273,33 +273,43 @@ _Ayuda: Estas sumas se pueden escribir como diferencia de dos [números triangul
273
273
274
274
## Invariantes de ciclo
275
275
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.
277
277
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.
279
279
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.
287
281
288
282
```python
283
+
import math
284
+
289
285
defmaximo(lista):
290
-
'Devuelve el elemento máximo de la lista o None si está vacía.'
291
-
ifnot lista:
292
-
returnNone
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
294
292
for elemento in lista:
295
293
if elemento > max_elem:
296
294
max_elem = elemento
297
295
return max_elem
298
296
```
299
297
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.
301
298
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.
303
313
304
314
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.
Copy file name to clipboardExpand all lines: Notas/08_Fechas_Carpetas_y_Pandas/00_Resumen.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,9 +1,9 @@
1
1
# 8. Fechas, Carpetas y Pandas
2
2
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).
3
3
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).
5
5
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.
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`.
Copy file name to clipboardExpand all lines: Notas/08_Fechas_Carpetas_y_Pandas/04_Ordenando_archivos.md
+32-4Lines changed: 32 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,16 +1,36 @@
1
1
# 8.4 Ordenar archivos en Python
2
2
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.
4
4
5
5
Esta sección tiene un ejercicio para entregar y luego otro más complejo que es optativo.
6
6
7
7
### 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.
9
9
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__'`.
11
28
12
29
Guardá el script resultante en un archivo `listar_imgs.py`.
13
30
31
+
Probá el programa desde la terminal, pasándole distintos directorios como parámetro.
32
+
33
+
14
34
### Ejercicio 8.6: Ordenar el árbol de archivos (optativo)
15
35
Escribí un programa que te permita ordenar las imágenes PNG de esta carpeta. Guardalo en un archivo `ordenar_imgs.py`.
16
36
@@ -31,7 +51,15 @@ _Observación:_ Este tipo de tareas se repite con mucha frecuencia. Tener la cap
31
51
32
52
**Algunos puntos importantes:**
33
53
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.
* Usá docstrings y comentarios en tu código de manera que sea legible.
36
62
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.
Copy file name to clipboardExpand all lines: Notas/08_Fechas_Carpetas_y_Pandas/06_Series_Temporales.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -452,7 +452,7 @@ Guardá lo que hayas hecho hasta acá en el archivo `mareas_fft.py` para entrega
452
452
### Ejercicio 8.14: Otros períodos
453
453
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.
454
454
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?
456
456
* ¿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?
457
457
458
458
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.
Copy file name to clipboardExpand all lines: Notas/08_Fechas_Carpetas_y_Pandas/07_Cierre.md
+5-4Lines changed: 5 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,10 +9,11 @@ Para cerrar esta clase te pedimos dos cosas:
9
9
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).
10
10
4. El archivo `mareas_a_mano.py` del [Ejercicio 8.10](../08_Fechas_Carpetas_y_Pandas/06_Series_Temporales.md#ejercicio-810).
11
11
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
+
16
17
* 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.
17
18
18
19
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).
0 commit comments