Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[IV-22-23] Objetivo 4 PMP_IV #23

Merged
merged 43 commits into from
Nov 21, 2022
Merged

[IV-22-23] Objetivo 4 PMP_IV #23

merged 43 commits into from
Nov 21, 2022

Conversation

MauronMP
Copy link
Owner

@MauronMP MauronMP commented Nov 9, 2022

  • ¿Hay un camino claro que permita ir desde el código hasta la historia de
    usuario que desarrolla, pasando por el mensaje de commit y el issue
    correspondiente?
  • ¿Se ha intentado cubrir con tests una parte de la lógica de negocio que se
    esté desarrollando?
  • ¿Hay un producto mínimamente viable que describa lo que se va a entregar en
    este objetivo?
  • ¿En este producto mínimamente viable se han priorizado unas clases,
    módulos o paquetes más fundamentales frente a otros, movidos a otro
    PMV/Hito?
  • ¿Se han documentado las elecciones de biblioteca de aserciones y del
    de test runner?
  • ¿Te has asegurado que lo que mencionas como biblioteca de aserciones y
    test runners lo son realmente y tienen la misma funcionalidad? ¿O estás poniendo
    unittest como test runner y pytest como biblioteca de aserciones?
  • ¿Esa documentación incluye criterios de aceptación y también criterios de
    búsqueda para las diferentes opciones?
  • ¿Se han seguido los principios F.I.R.S.T. en la creación del test y
    se ha documentado cómo se ha hecho?
  • ¿Se describe claramente en el PMV los tests que hay que pasar para que se
    considere viable?
  • ¿Se han testeado también las excepciones?

@MauronMP MauronMP added 🙋 user-stories Etiqueta de historias de usuarios Objetivo_6 🦜 labels Nov 9, 2022
@MauronMP MauronMP added this to the [M1] Transformación de los datos por medio de algoritmos para obtener un perímetro de riesgo de incendio. milestone Nov 9, 2022
Copy link

@JJ JJ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

El problema principal es que tienes que seguir las mejores prácticas para colocar los ficheros y testearlos directamente sin notebook

@MauronMP
Copy link
Owner Author

MauronMP commented Nov 10, 2022

El problema principal es que tienes que seguir las mejores prácticas para colocar los ficheros y testearlos directamente sin notebook

Ya he hecho que no se hagan los tests con los notebooks, sino en ficheros '.py', funcionando correctamente

@MauronMP MauronMP requested a review from JJ November 10, 2022 15:38
@MauronMP MauronMP requested review from JJ and removed request for JJ November 11, 2022 11:56
Copy link

@JJ JJ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Os dije desde el principio que tenéis que implementar vosotros la lógica de negocio, para testear todo lo que necesitéis e incluir sólo las funciones que requiera vuestro proyecto. Por tanto, no puedes usar ni pandas ni numpy, al menos en este milestone, donde lo importante es que tengáis la funcionalidad adecuada.
Además, CSV es una biblioteca core en Python, así que tampoco necesitar cargar con esas librerías sólo para leer un CSV.
La elección de herramientas parece adecuada, pero el desarrollo del código no ha seguido la metodología correcta.

class Datos():

def __init__(self):
self.df = pd.read_csv('data/incendiosForestales.csv')
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aparentemente, gran parte o todo este fichero está desarrollado refiriéndote a issues que hablan sólo de elegir bibliotecas.
Es funcionalidad nueva. Siendo así, tienes que crear issues y referirte a las HUs correspondientes.

@MauronMP
Copy link
Owner Author

Buenas, he cambiado la clase Datos para que use el módulo csv de python y no use pandas, de igual modo los test se han cambiado, creado un issue para este problema y funcionando correctamente. Listo para revisar

Copy link

@JJ JJ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aparte de las cosas adicionales que te comento, ¿filtrar es toda la parte de la lógica de negocio que vas a testear? ¿No habría que meter algo realmente de cálculo? Os advertí desde el principio que la lógica de negocio había que programarla, y testearla... En concreto, no parece que sólo filtrar satisfaga de alguna forma #7 o de qué forma contribuye al mismo.

Vamos a partir de las valoraciones de [esta página](https://snyk.io/advisor/python). Que hace una comparativa de cada librería para un proyecto para distintos lenguajes, en este caso python. La manera de evaluar cómo de bueno es un paquete es por:
- Popularidad.
- Mantenimiento.
- Seguridad.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

¿Qué tiene que ver la seguridad con un test runner? ¿Cómo la mides?

iv.yaml Outdated
@@ -9,3 +9,6 @@ automatizar:
fichero: tasks.py
orden: invoke

test:
- tests/test_Jupyter.py
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Este fichero ya no existe.

@@ -0,0 +1,22 @@
from hamcrest import *
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mira en errores frecuentes de la semana 10 lo que se dice sobre nombres de ficheros.

pyproject.toml Outdated
python = ">=3.6"
python = ">=3.8"
pyhamcrest = "^2.0.4"
matplotlib = "^3.6.2"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

¿Esto lo estás usando en producción?

filter_column.append(data[i][column])
return filter_column

def diagramaDispersion(self,data,area,image_name):
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Una clase "Datos" no puede incluir un diagrama de dispersión. Tampoco hay ninguna historia de usuario que lo pida, y menos para este milestone.
Si lo quieres usar para ilustrar el README.md, simplemente mételo en un subdirectorio con scripts, pero lo mejor sería mantenerlo fuera del repositorio (ya que no añade valor a ninguna historia de usuario y no lo estás testando)

class Datos():

def size_of_CSV(self):
with open('data/incendiosForestales.csv', 'r', newline='') as file:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

¿En qué issue dice que necesitas saber el tamaño del CSV? Y, sobre todo, ¿por qué es esto una función y no se mete en el constructor?


def by_date_property(self, mes, dia, propiedad=None):
mes_dia = []
with open('data/incendiosForestales.csv', 'r', newline='') as csvfile:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

¿Estás abriendo el fichero en cada función?
¿Seguro que no necesitas plantear un problema en un issue sobre este tema?

import os

def test_sizeOf_CSV():
assert_that(Datos().size_of_CSV(), equal_to(517))
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No debes usar literales en ningún test. En el momento que cambies el fichero esto va a petar.

Copy link

@JJ JJ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Por segunda vez, sólo se puede usar código propio en este objetivo, como se advirtió en el objetivo cero

return list_property

def weather(self):
all_propierties = []
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo: propierties

@@ -0,0 +1,47 @@
from sklearn.preprocessing import StandardScaler
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

¿Qué parte de "sólo puedes usar código propio" no has entendido?

@MauronMP MauronMP modified the milestones: [M2] Transformación de los datos por medio de algoritmos para obtener un perímetro de riesgo de incendio., [M1] Obtención de la correlación a partir de los datos sesgados del csv. Nov 16, 2022
@MauronMP MauronMP requested a review from JJ November 16, 2022 13:35
@MauronMP MauronMP removed the request for review from JJ November 17, 2022 10:51
@MauronMP
Copy link
Owner Author

@JJ

Copy link

@JJ JJ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ninguna de las objeciones es grave, pero acumuladas dejan el código en un estado que podría no ser adecuado para progresar a las siguientes fases.
Adicionalmente, no has puesto explícitamente los criterios que has usado para primero buscar y luego seleccionar ninguna de las herramientas, de acuerdo con lo que explicamos en clase. Implícitamente parece que estás usando la puntuación de snyk, pero no parece que eso sólo deba ser un criterio.

tasks.py Outdated

@task
def jupyter(c):
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esto ya no lo necesitas

from pmp_iv.forest_prediction.eda import *
from math import *

class correlacion_dato_area():
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Por favor, infórmate y sigue las buenas prácticas. Para empezar, la clase y el fichero deberían llamarse igual.
Una clase siempre se llama por los datos que contiene, no por lo que hace.

return self.denominador


def calculo_coeficiente(self):
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Estás haciendo un montón de cálculos sobre algo que no varía, puesto que se lee de un fichero.

class correlacion_dato_area():

def __init__(self, propiedad):
self.X = EDA().by_property(propiedad)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

¿Estás leyendo el mismo fichero 2 veces?

import pmp_iv.models.fecha
import pmp_iv.models.estado
import pmp_iv.models.fwi
import pmp_iv.enums.day
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sigue sin ser una buena práctica esta organización del repositorio, ya te lo dije.

assert_that(pmp_iv.models.estado.Estado(10,10,9,3,200).temperature, less_than_or_equal_to(MAXIMA_TEMPERATURA))

def test_month_filter():
filtrado_mes = EDA().by_date_property(MES_AGOSTO,DIA_LUNES)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Estás leyendo EDA múltiples veces. Deberías intentar usar las tres fases; Arrange, Act and Assert, y leer todo lo necesario (en Python se les llama Fixtures) en una primera fase (todas las bibliotecas de aserciones lo tienen)

@MauronMP
Copy link
Owner Author

Buenas @JJ, el test usa fixtures, Arrange, Act and Assert. He actualizado el directorio pmp_iv/ y no creo varias instancias de la clase EDA. Solicito revisión.

Copy link

@JJ JJ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

El objetivo 4 estaría bien, pero ahora no está bien el 3. Tienes que poner una tarea que compruebe la sintaxis.

from pmp_iv.config.model_validation import ModelValidation
from pmp_iv.utils.validation import Validation
from pmp_iv.validaciones.model_validation import ModelValidation
from pmp_iv.validaciones.validation import Validation
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Una vez más, la jerarquía de ficheros debe reflejar la de objetos. No veo por qué no tienen que estar estos en el directorio principal, incluso en el mismo fichero.

return self.numerador

def den_coeficiente_x_y(self):
cuadrado_x = 0
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ninguna de estas funciones son pesadas como para "retrasar" su uso. Poniéndolas en una función estás forzando a que se llamen múltiples veces, en vez de simplemente calcularlas en el momento que estén los datos disponibles, que es en la construcción.

self._datos_csv = self.get_data_values()
self._area = self.by_property('area')

def get_data_values(self):
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Igual que antes, mira errores frecuentes semana 11


def by_date_property(self, mes, dia, propiedad):
data_by_property = []
for i in self.valores:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Debes tratar de evitar los bucles for todo lo posible. Usa map o filter o construcciones similares.

from pmp_iv.enums.month import Month
from pmp_iv.utils.validation import Validation
from pmp_iv.validaciones.model_validation import ModelValidation
from pmp_iv.models.day import Day
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Una vez más, esto no es una arquitectura MVC. Si no es un modelo de datos, no lo metas en un subdirectorio models. De hecho, no lo metas en ningún subdirectorio, como te he dicho antes.

tasks.py Outdated

@task
def check(c):
run("poetry check")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esto ya te lo dije: poetry check no comprueba la sintaxis.
Esto no sé como te lo dejé pasar en #19 . Cupongo que lo habrás añadido ahora porque te dio error, porque borraste el que tenías originalmente.

@MauronMP
Copy link
Owner Author

Buenas @JJ, con inv check ya comprueba la sintaxis, el constructor de la correlación obtiene el cálculo directamente y uso map en la clase EDA, la verdad que está muy bien los cambios que me ha dicho, el test ha pasado de estar 10 segundos a 0.04s. Solicito revisión

Copy link

@JJ JJ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

closes #21, closes #22, closes #24, closes #25, closes #26
closes #27, closes #28, closes #29, close #30,closes #31,
closes #32
@MauronMP MauronMP merged commit 20ba587 into main Nov 21, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Objetivo_6 🦜 🙋 user-stories Etiqueta de historias de usuarios
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants