-
Notifications
You must be signed in to change notification settings - Fork 2
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
Conversation
…adida pytest-tap en .toml
…rerías para jupyter
…proyectos en jupyer
…Añadidas dependencias con poetry
…Añadidas dependencias con poetry
There was a problem hiding this 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
Ya he hecho que no se hagan los tests con los notebooks, sino en ficheros '.py', funcionando correctamente |
There was a problem hiding this 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.
pmp_iv/segmentacionCSV/Datos.py
Outdated
class Datos(): | ||
|
||
def __init__(self): | ||
self.df = pd.read_csv('data/incendiosForestales.csv') |
There was a problem hiding this comment.
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.
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 |
There was a problem hiding this 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.
docs/Test_runner.md
Outdated
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. |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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.
tests/test_Datos.py
Outdated
@@ -0,0 +1,22 @@ | |||
from hamcrest import * |
There was a problem hiding this comment.
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" |
There was a problem hiding this comment.
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?
pmp_iv/segmentacionCSV/Datos.py
Outdated
filter_column.append(data[i][column]) | ||
return filter_column | ||
|
||
def diagramaDispersion(self,data,area,image_name): |
There was a problem hiding this comment.
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)
pmp_iv/segmentacionCSV/Datos.py
Outdated
class Datos(): | ||
|
||
def size_of_CSV(self): | ||
with open('data/incendiosForestales.csv', 'r', newline='') as file: |
There was a problem hiding this comment.
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?
pmp_iv/segmentacionCSV/Datos.py
Outdated
|
||
def by_date_property(self, mes, dia, propiedad=None): | ||
mes_dia = [] | ||
with open('data/incendiosForestales.csv', 'r', newline='') as csvfile: |
There was a problem hiding this comment.
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?
tests/test_Datos.py
Outdated
import os | ||
|
||
def test_sizeOf_CSV(): | ||
assert_that(Datos().size_of_CSV(), equal_to(517)) |
There was a problem hiding this comment.
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.
There was a problem hiding this 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
pmp_iv/forest_prediction/eda.py
Outdated
return list_property | ||
|
||
def weather(self): | ||
all_propierties = [] |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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?
There was a problem hiding this 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): |
There was a problem hiding this comment.
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(): |
There was a problem hiding this comment.
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): |
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
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?
tests/test_pmp_iv.py
Outdated
import pmp_iv.models.fecha | ||
import pmp_iv.models.estado | ||
import pmp_iv.models.fwi | ||
import pmp_iv.enums.day |
There was a problem hiding this comment.
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.
tests/test_pmp_iv.py
Outdated
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) |
There was a problem hiding this comment.
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)
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. |
There was a problem hiding this 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.
pmp_iv/models/coordenada.py
Outdated
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 |
There was a problem hiding this comment.
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.
pmp_iv/models/correlacion_area.py
Outdated
return self.numerador | ||
|
||
def den_coeficiente_x_y(self): | ||
cuadrado_x = 0 |
There was a problem hiding this comment.
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.
pmp_iv/models/eda.py
Outdated
self._datos_csv = self.get_data_values() | ||
self._area = self.by_property('area') | ||
|
||
def get_data_values(self): |
There was a problem hiding this comment.
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
pmp_iv/models/eda.py
Outdated
|
||
def by_date_property(self, mes, dia, propiedad): | ||
data_by_property = [] | ||
for i in self.valores: |
There was a problem hiding this comment.
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.
pmp_iv/models/fecha.py
Outdated
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 |
There was a problem hiding this comment.
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") |
There was a problem hiding this comment.
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.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
usuario que desarrolla, pasando por el mensaje de commit y el issue
correspondiente?
esté desarrollando?
este objetivo?
módulos o paquetes más fundamentales frente a otros, movidos a otro
PMV/Hito?
de test runner?
test runners lo son realmente y tienen la misma funcionalidad? ¿O estás poniendo
unittest
como test runner ypytest
como biblioteca de aserciones?búsqueda para las diferentes opciones?
se ha documentado cómo se ha hecho?
considere viable?