Giter VIP home page Giter VIP logo

pmp_iv's Introduction

Repositorio PMP_IV en el curso 22-23

馃挱 Problema a resolver

  1. Empatizar. Problema a resolver

Predecir la probabilidad de que sufran incendios las zonas forestales y residenciales con una escala de niveles del plan INFOEX obteniendo un documento en formato PDF con los datos estudiados y gr谩ficas del riesgo.

  1. Definir. 驴Cu谩l es el problema exactamente?

Durente el 2022 hasta la fecha del 30 de agosto, han habido 63 grandes incendios seg煤n muestra esta noticia

Para poder intentar solventar este problema, la idea ser铆a poder predecir en qu茅 zonas forestales puede generarse m谩s riesgo de incendio.

Tratando los siguientes puntos:

  • 驴Qui茅n usar谩 esta aplicaci贸n?

Analista de datos del gobierno, ya que con el informe que se le da, puede tomar acciones con las autoridades. Estos reciben un documento con el nivel alerta de incendio y los gr谩ficos, para tomar las medidas necesarias.

  • 驴Sirve su despliegue en la nube?

Si, ya que se tratar铆a de un software para distintos clientes y no puede estar centralizado en un s贸lo sitio.

  1. Idear. Pensar en qu茅 productos solucionar谩 este problema.

Un software capaz de predecir, el nivel de riesgo que puede haber en las zonas en las que est谩.

Para ello se usar谩n datos de un csv (estos datos son validos), se transforman para posteriormente con una IA estimar la probabilidad de incendio que puede tener en esa zona y determinar las zonas que pueden tener vecinos con riesgo de incendio, una vez se ha estimado los vecinos, se decide el nivel de incendio. Tanto la recopilaci贸n de datos, como transformaci贸n e IA se especifican en los milestones.


Documentos:

鉁旓笍 Instalaci贸n, check testeo.

  • Install.

    invoke install
    
  • Test.

    invoke test
    
  • Check.

    invoke check
    
  • Demostraci贸n.

    Comprobaci贸n

馃悑 Docker.

  • Descargar el repositorio.
  • Ejecutar
    docker run -u 1001 -t -v `pwd`:/app/test mauronmp/pmp_iv
    

pmp_iv's People

Contributors

arsa-dev avatar mauronmp avatar

Watchers

 avatar

Forkers

arsa-dev jj

pmp_iv's Issues

Typo Readme.md

Typo en la secci贸n de install, check y test de la documentaci贸n

Necesito elegir un sistema de integraci贸n continua

Como parte del desarrollo del #7 y del objetivo 6, se tienen que elegir un sistema de integraci贸n continua.

Criterios a tener en cuenta

  • Gratuito o freemium
  • Compatible con github check api.
  • Pueda servir para poder testear lo realizado previamente con docker en el objetivo 5 y se puedan lanzar los tests con las distintas versiones.

Algunos de los sistemas de integraci贸n continua:

  • Github actions: Tiene un nivel gratuito, sirve con github check y es 煤til porque se puede usar con Docker y con python, la documentaci贸n adem谩s es muy extensa y buena.
  • CircleCi: Compatible con muchos lenguajes, entre los cuales python, tiene como control de versiones Github, es una de las herramientas m谩s tulizadas de DevOps, no es gratuita, pero ofrece un nivel gratuito que nos sirve para el desarrollo de la pr谩ctica.
  • Jekins: Tiene el inconveniente de que requiere de una instalaci贸n de hardware propio, automatizaci贸n de c贸digo abierto para integraci贸n continua, simple instalaci贸n y actualizaciones, pero es de pago si se quieren hacer scripts personalizados.
  • AppVeyor: Compatible para python, sirve para entorno de trabajos como es el caso de Github, es gratuita para proyectos de c贸digo abierto, pero tiene un l铆mite de 14 d铆as.

Finalmente, se ha decidido por emplear CircleCI con docker y Github Actions para el control de versiones del proyecto.

Actualizar poetry.lock

Debido a lo realizado en #39, al iniciar compilar docker genera el siguiente warning:

Warning: poetry.lock is not consistent with pyproject.toml. You may be getting improper dependencies. Run `poetry lock [--no-update]` to fix it.

Para ello se ha ejecutado para quitar este mensaje de warning.

poetry lock --no-update

Qu茅 algoritmos de regresi贸n deber铆a de usar

Teniendo en cuenta que para el desarrollo del milestone 1 de la HU1 #7, se pide aplicar modelo de regresi贸n sobre los datos del issue #25, tengo que elegir distintos algoritmos de regresi贸n y atendiendo a los que se quiere hacer en #27, los elegidos son:

  • Lasso.
  • Ridge.
  • KNeighborsRegressor.
  • RandomForestRegressor.

Todos estos se pueden usar con la librer铆a elegida en #27

Gestor de dependencias.

Teniendo en cuenta #7, se necesita un gestor de dependencias como parte del objetivo 3.

Elecci贸n del gestor de dependencias.

Para qu茅 se necesita un gestor de dependencias.

Como bien se menciona aqu铆

Dependency management is like your city鈥檚 sewage system. When it鈥檚 working well, it鈥檚 easy to forget that it even exists. The only time you鈥檒l remember it is when you experience the agony induced by its failure.

Teniendo en cuenta el est谩ndar de la estructura de los proyectos en Python y este ejemplo de estructura de proyectos.

La estructura que buscamos tener ser铆a:

  • proyecto
    • pyproject.toml
    • README.md
    • proyecto/
      • init.py
    • tests/
      • init.py

Mejores pr谩cticas para la gesti贸n de dependencias de python.

  • Debe de ser estable en todos los entornos en los que se trabaje.
  • Debe de ser f谩cil de instalar, compilar y ejecutar.
  • Evitar el 'Dependency Hell', este concepto se asocia cuando se intenta resolver conflictos por dependencias. Esto ocurre cuando diferentes paquetes de Python tienen la misma dependencia, pero dependiendo de versiones distintas e incompatibles de un paquete compartido.
  • Creaci贸n de un fichero lock, para asegurar que las dependencias sigan fijadas a las versiones exactas en uso.
  • Tener todas las dependencias en un 煤nico fichero en lugar de tenerlo individualmente.
  • Seguir el est谩ndar de PEP 518.
  • En este caso seguir el est谩ndar PEP 621 para el fichero pyproject.toml

Gestores de dependencias.

  • PDM Instala y gestiona paquetes de manera similar a npm que no necesita crear un virtualenv. Soporta el PEP 582, sigue los est谩ndares de python. Sistema flexible y potente. Cache de instalaci贸n centralizado como pnpm. De igual modo, a la hora crear un proyecto sigue el est谩ndar y genera una estructura 煤til

  • hatch Es una herramienta 煤til para el aislamiento del entorno y destinado a administrar dependencias. Tiene un sistema de complementos que hace f谩cil su funcionalidad. Sistema de compilaci贸n estandarizado con compliaciones de manera predeterminada. Sigue el est谩ndar de la estructura de proyectos.

  • poetry Es una herramienta de dependencia y gesti贸n de python, usa sistema de archivos de bloqueo para compiladores. Garantiza que se est茅 usando un entorno virtual, por lo que evita errores de instalaciones globales. Puede declarar sus dependencias por medio de la shell o en el fichero pyproject.toml
    Las dependencias del proyecto se gestionan en el pyproject.toml, que se actualiza autom谩ticamente cada vez que se ejecuta el comando de instalaci贸n de poetry. Genera del mismo modo un fichero lock. Tiende a ser m谩s r谩pido. Sigue el estandar de la estructura de los projectos de python como se puede ver en este ejemplo a la hora de crear un proyecto con poetry, ya que genera un fichero .toml, Readme.md, directorio para los .py y otro para los test.

Se ha optado por poetry por:

  • Seguir el est谩ndar de la 'Specifying Minimum Build System Requirements for Python Projects'.
  • Documentaci贸n oficial muy sencilla.
  • Mejor visi贸n de las dependencias al usar un fichero(pyproject.toml).
  • Tiene un entorno virtual integrado.
  • Construcci贸n sencilla.
  • Permite cambiar f谩cilmente entre versiones.
  • Rendimiento.

[HU1] Como usuario, quiero conocer el nivel de riesgo de incendio.

Teniendo en cuenta los 4 niveles de incendios forestales que existen, siguiendo el Plan INFOEX los niveles son:

  • Incendios de nivel 0: los que no suponen peligro para bienes y personas y se considera que se controlar谩n con los medios del Plan INFOEX.
  • Incendios de nivel 1: los que pueden ser controlados por los medios del Plan, pero pueden afectar a personas o bienes de car谩cter no forestal.
  • Incendios de nivel 2: aquellos en los que se considera necesaria la intervenci贸n de medios estatales no asignados al Plan INFOEX o puedan comportar situaciones de emergencia de car谩cter nacional.
  • Incendios de nivel 3: los que as铆 sean declarados por el Ministerio del Interior por estar en juego el inter茅s nacional.

Se quiere obtener directamente el dato del nivel de riesgo de incendio que puede existir en la zona por medio de un documento en formato PDF con los gr谩ficos y estudios realizados demostrando el nivel de riesgo.

El nivel de riesgo se tiene que estimar estudiando la proximidad entre las cercan铆as de los incendios de la zona, ya que no es el mismo riesgo que haya un incendio en una zona en un punto 'a' y otro en un punto 'b' y haya una distancia muy grande a un incendio en un punto 'c' y otro 'd' que son puntos pr贸ximos entre si.

Para esto se necesita del milestone [M2] que a su vez. depende del 1 y del 0.

Evitar warning por intentar escribir ficheros con Docker.

Una vez creada la imagen de docker #34 y funcionando los tests genera un aviso de que intenta escribir ficheros, pero no tiene permitido, estos son los de cach茅, pero para ello se ha arreglado en el issue #38, para evitar que aparezca este mensaje en el fichero pyproject.toml:

[tool.pytest.ini_options]
filterwarnings = [
    "ignore::UserWarning",
]

Versi贸n de invoke con python para el uso de docker image

Al usar la 煤ltima versi贸n de la imagen de python de docker genera el siguiente problema:

AttributeError: module 'inspect' has no attribute 'getargspec'. Did you mean: 'getargs'?

Visto lo mencionado el issue del github de invoke #833, la 煤ltima versi贸n con la que trabaja invoke es la 3.9, por lo que se usar谩 esta versi贸n para la imagen de Docker

Creaci贸n de la imagen

De acuerdo a la HU #7, y el objetivo 5 necesito crear una imagen bas谩ndose en los criterios establecidos en el objetivo y la elecci贸n hecha en el issue #33

Dado que se usa poetry con docker, se necesita crear un entorno virtual env como en el siguiente caso

Implementaci贸n de una clase para la fase EDA

Como parte de la HU0 #7, y el milestone 1, se necesita de una clase que maneje los datos del csv de incendios, siendo as铆 las necesidades principales:

  • Extraer datos de una columna espec铆fica dependiendo del d铆a y mes.
  • idem sin d铆a y mes.
  • Todos los datos relacionados con el clima(no se necesitan ni coordenadas ni mes y d铆a)

Todos estos datos sesgados son necesarios para el #26

Necesito usar integraci贸n continua con github actions usando workflows

Como parte del desarrollo de la #7 y del #46
Se debe implementar un workflow para github actions que maneje una matriz de versiones, en este caso se eligen la 3.7 y 3.8, no se usa la 3.9 porque es la que usa docker por defecto y versiones anteriores no se pueden emplear por incompatibilidades con los gestores de tareas y dependencias.

Definici贸n de tecnolog铆a a usar

Hola @MauronMP,

ya veo que est谩 aprobado el PR #4, por lo que puedes mergearlo aunque haya alg煤n punto que mejorar tal y como comenta @JJ.

Abro hilo de discusi贸n para definir la tecnolog铆a y comenzar el desarrollo del objetivo 2 en un nuevo PR. 驴En qu茅 tecnolog铆a crees que es mejor desarrollar tu proyecto? 驴Tienes alguna buena pr谩ctica o consideraci贸n a tener en cuenta de cara a la implementaci贸n adem谩s de lo que se especifica en el M0?

Gestor de tareas

Teniendo en cuenta #7, se necesita un gestor de tareas como parte del objetivo 3.

Elecci贸n del gestor de tareas.

Las opciones son Doit, Invoke y Pypyr.

  • Doit Tiene como idea usarse como un simple Task Runner que permita definir tareas 'ad hoc', unificando. Las dependencias y la creaci贸n de las tareas se pueden hacer din谩micamente durante su ejecuci贸n, lo que lo hace adecuado para conducir flujos de trabajo y pipelines complejas.

  • Invoke Como bien se menciona aqu铆, en los gestores de tareas hay distintos tipos, entre los que nos fijamos entre est谩ndar u opcionales. En el caso de python hace falta de una herramienta externa, como es el caso de invoke. Est谩 inspirado en varias fuentes como make/rake entre otros y tiene as铆 un conjunto de caracter铆sticas potentes y limpias. Con invoke se puede definir y ejecutar funciones de tareas, crear pre-tareas, ejecutar comandos de shell entre otras opciones.

  • Pypyr Permite definir y ejecutar pasos secuenciales en un pipeline. Como un script de shell ,m谩s sencillo que un archivo MAKE. Ejecuta pipelines definidas en yaml. Da una sencilla sustituci贸n de variables y gesti贸n de archivos de configuraci贸n para que se pueda leer, fusionar y escribir archivos de configuraci贸n desde y hacia yaml, json o simplemente texto.

Se ha optado por Invoke por su simplicidad y documentaci贸n.

Duplicado en fichero pyproject.toml

Dentro del fichero de poetry hay un duplicado de la l铆nea:

invoke = "^1.7.3"

en la l铆nea de

[tool.poetry.dependencies]

Tiene que estar solo en:

[tool.poetry.dev-dependencies]

Validaci贸n usando metaestructura

Tras hablar en clase con @JJ, hemos visto que ser铆a interesante sacar a un fichero de configuraci贸n todas las constantes que tenemos para validaci贸n en los modelos, as铆 se podr铆an ajustar esas constantes en diferentes instalaciones o si en alg煤n momento cambiara alg煤n valor, como por ejemplo el m谩ximo de 45潞 de temperatura en un verano intenso. 驴Que te parece si creo un fichero en el m贸dulo pmp_iv.config que contenga todas las constantes y luego se usen para la validaci贸n?

Elecci贸n de una biblioteca de aserciones.

Como parte del objetivo 4 y teniendo en cuenta la #7, se necesita una biblioteca de aserciones.

Elecci贸n de una biblioteca de aserci贸n.

Vamos a partir de las valoraciones de esta p谩gina. Que hace una comparativa de cada librer铆a para un proyecto para distintos lenguajes, en este caso python.

Opciones.

  • grappa Tiene como finalidad hacer que las pruebas sean m谩s sencillas. Tiene dos tipos de asserciones: "expect y should". Tiene un sistema detallado de informes de errores "amigable". Pero tiene una mala valoraci贸n y apenas hay documentaci贸n o ejemplos adem谩s de la oficial.

  • assertpy Tiene un buen soporte para poder trabajar con estructuras nativas de python como list, set o dict entre otros. Tiene personalizaci贸n de los mensajes de aserciones, aunque la valoraci贸n que tiene sigue siendo mala, aunque mejor que la anterior.

  • 馃弫 pyhamcrest Permite definir de manera clara las reglas, tiene un buen manejo de los mensajes de errores y ayuda as铆 a una mejor comprensi贸n. Tiene una amplia documentaci贸n y cuenta con muchos "matchers" predefinidos.

Elecci贸n biblioteca para extraer datos de los incendios.

A partir de los datos de la siguiente p谩gina, se necesita elegir una librer铆a y funcionalidades para poder extraer y sesgar todos los datos en distintos marcos para poder comenzar con el milestone M1 referente a las HU0 #7.

Partiendo de estas necesidades, python ya tiene un m贸dulo espec铆fico para ficheros csv, se usar谩 este.

Para leer los datos usando esta librer铆a se usar谩 con la opci贸n de 'DictReader', ya que permite trabajar con los nombres de las columnas como 铆ndices.

Elecci贸n test-runner

Como parte del objetivo 4 y teniendo en cuenta la #7, se necesita un test-runner.

Elecci贸n de un test runner.

Vamos a partir de las valoraciones de esta p谩gina. Que hace una comparativa de cada librer铆a para un proyecto para distintos lenguajes, en este caso python.

Opciones.

  • 馃弫 PyTest Partiendo que tiene la mejor valoraci贸n. Sigue el est谩ndar del formato TAP. Tiene como caracter铆sticas la b煤squeda autom谩tica de ficheros con nombre "test" o sufijo "_test.py", la creaci贸n de los test es bastante sencilla, permite parametrizaci贸n, tiene Hooks que son 煤tiles en las fases de setup y teardown.

  • Nose2 EL sucesor de nose, tiene buena valoraci贸n, pero es menor que la de pytest. Basado en unittest2 con mejores opciones de testeo, en este caso solo ejecutar谩 los ficheros que empiecen por "test_". Tiene menos popularidad, soporte y es como una "extensi贸n mejorada" de unittest.

Necesito segmentar en dos grupos los datos para el desarrollo de los algoritmos.

Como parte del #7, en el milestone 1 con los datos de la clase #25 y #26, tengo que dividirlos en dos partes, una como testeo y otra 'entrenada', para eso usando la librer铆a elegida en #27, en el constructor de la clase #26, tendr茅 sesgado por un lado el 20% de los datos para testear.

Una vez tenga los dos datos segmentados tengo que estandarizar los datos, eliminando la media y escalando los datos de forma que su varianza sea igual a 1. Para ello usar茅 de la librer铆a #27 'StandardScaler'

Elecci贸n de un contenedor base

De acuerdo a la HU #7, y el objetivo 5 necesito elegir un contenedor base.

Elecci贸n de la imagen de docker.

驴Qu茅 se busca en una imagen?

  • Estabilidad.
  • Tama帽o de la imagen.
  • Actualizado al d铆a con el lenguaje, en este caso python.
  • Actualizada las dependencias.

Partimos de dos caminos:

  • Oficiales de docker

    • Alpine. 脷til para im谩genes peque帽as, pero puede conllevar a errores de rendimiento y tama帽o por la gesti贸n de paquetes.
    • Slim. Carece de las capas en los paquetes comunes, por lo que hace que sea una imagen mucho m谩s peque帽a.
    • Bullseye. Tiene muchos paquetes instalados por capas de imagen que usan otras im谩genes de docker, lo que hace que el uso del disco sea bajo.
  • Otras

    • Ubuntu. Imagen muy pesada en comparaci贸n con las anteriores y tiene muchos paquetes instalados que no son necesarios para este proyecto.
    • Debian. M谩s liviana que la anterior, pero para usar Debian es m谩s conveniente usar una versi贸n de las oficiales de python que usan Debian de manera m谩s liviana, como el caso de la versi贸n bullseye.
    • bitnami Esta ser谩 la elegida. Adem谩s de que es una imagen m谩s ligera que las dem谩s mencionadas, buen rendimiento, muchas descargas en dockerhub, cuenta adem谩s con el 'VERIFIED PUBLISHER' de dockerhub en python. Otro motivo ajeno es diferenciarse de las oficiales de python que ser谩n elegidas por otros compa帽eros...

Finalmente, se ha elegido bitnami, en este caso la 3.9 ya que genera problemas con invoke, puesto que tanto invoke como nose2, opciones barajadas como tasks runners trabajan hasta las versiones 3.9 de python, pero las versiones de docker de python a partir de las 3.10 en adelante genera problemas por depenencias que los test runners no disponen.

Creaci贸n de un m贸dulo para definir correctamente el espacio de nombres de los imports

Adem谩s, en esta refactorizaci贸n, se ha eliminado el fichero main, para poder probar la instanciaci贸n de las clases se podr铆a a帽adir un main con nombre testmain_* (ignorado en el repositorio), como el siguiente:

from pmp_iv.models.fwi import FWI
from pmp_iv.models.fecha import Fecha,Months,Day
from pmp_iv.models.coordenada import Coordenada
from pmp_iv.models.estado import Estado

fwi_instance = FWI(34.4, 44.4, 17.7, 14.3)
print(fwi_instance)

fecha_instance = Fecha(Months.enero, Day.M)
print(fecha_instance)

coordenada_instance = Coordenada(3, 4)
print(coordenada_instance)

coordenada_instance = Estado(-7, 50, 7, 5, 17)
print(coordenada_instance)

Evitar ficheros basura en el docker

Se quiere evitar ficheros basura en el docker, en este caso el pyproject.toml y el poetry.lock.
Para ello se eliminar谩n una vez se instale las dependencias.

Como ejemplo de c贸mo lo har茅 ser谩 parecido al siguiente

Implementaci贸n de clases para el modelo

Related to #8. Cito discusi贸n sobre implementaci贸n

@arsa-dev

Hola @MauronMP, he implementado las clases definidas en el M0, aunque para las definiciones 4 a 8 no tengo muy claro que eso sean clases, parecen m谩s simplemente validaci贸n de valores pero no sabr铆a en que clase o lugar habr铆a que definirlos. O debo de crearlas como clases con una 煤nica propiedad por ejemplo value y que cuente con esa validaci贸n.

Quedo a la espera de si es necesario implementar esto, en caso de no serlo ya estar铆a el PR listo en #9

@MauronMP

Buenas @arsa-dev, he visto los ficheros que has creado, de momento me parece que est谩n bien, igualmente necesito comprobarlo y mirarlo con m谩s detenimiento. Respecto a los cambios que mencion贸 JJ, los cambiar茅.
Lo 煤nico que si me har铆a falta es que crees el issue como ha mencionado y respecto a lo que mencionas de las definiciones 4 a 8, siguiendo la manera del fwi.py que has creado podr铆as hacer algo parecido con las definiciones del 4 al 8.

Tras hablar presencialmente, se ha decidido crear una clase llamada estado con las propiedades de 4 a 8

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    馃枛 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 馃搳馃搱馃帀

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google 鉂わ笍 Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.