Enunciado Proyecto N4 IP 20221

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 10

Proyecto de Nivel 4

Calidad de aire en Colombia


Objetivo general
El objetivo de este proyecto es crear una aplicación para analizar las estadísticas de calidad de aire en Colombia y sus
variables climatológicas. En el desarrollo de esta aplicación pondrá en práctica los conceptos del nivel 4.
Objetivos específicos
1. Implementar algoritmos para construir y recorrer matrices.
2. Utilizar las librerías pandas y matplotlib, así como consultar los sitios web oficiales donde se encuentra la
documentación.
3. Descomponer un problema en subproblemas e implementar las funciones que los resuelven.

Instrucciones generales
Esta sección le permitirá conocer el alcance, las funcionalidades esperadas y lo que debe realizar en este proyecto.
Tenga en cuenta que, a lo largo de dicha sección encontrará el título "ATENCIÓN" con indicaciones para conseguir que
el resultado de su proyecto corresponda con lo esperado. Es importante que las siga cuidadosamente. Antes de
empezar, le sugerimos leer con atención todo el proyecto. Mientras lo lee, trate de reconocer los conceptos del curso
que tendrá que poner en práctica. Recuerde que este proyecto debe realizarse de forma completamente individual.
Con el fin de monitorear la situación ecológica del país, se han dispuesto diferentes dispositivos a lo largo del territorio
nacional para medir la calidad del aire y otras variables climatológicas. La calidad ambiental del país es un tema de vital
importancia para la toma de decisiones de planeación territorial tanto en las zonas urbanas como rurales. Con este
propósito, el país ha invertido en un sistema de medición de estas variables desde el año 2011 para poder cumplir los
estándares de la Organización Mundial de la Salud. Estos datos son públicos y se han puesto a la disposición de la
ciudadanía de manera libre y abierta.
En este proyecto, trabajará con datos de calidad del aire en Colombia para el periodo entre 2011 y 2018. Estos datos
se encuentran registrados en el portal de datos del gobierno colombiano (https://www.datos.gov.co/Ambiente-y-
Desarrollo-Sostenible/DATOS-DE-CALIDAD-DEL-AIRE-EN-COLOMBIA-2011-2018/ysq6-ri4e). En el archivo
“calidad_aire.csv” encuentra una versión simplificada y filtrada de los datos originales: suprimimos algunas entradas
incompletas y columnas que no vamos a utilizar en este proyecto. Con este conjunto de datos podrá analizar
información esencial para entender cómo ha evolucionado la situación ambiental en el territorio nacional.

¡Le deseamos la mejor de las suertes explorando estos datos!

Su aplicación debe tener las siguientes partes:


Parte 1: Leer la información del archivo
Requerimiento 0: Cargar datos
Lo primero que debe hacer es permitir que se carguen los datos de un archivo csv a un DataFrame. Le debe preguntar
al usuario el nombre del archivo, es decir que, la función que implemente este requerimiento debe recibir como
parámetro el nombre del archivo y debe retornar un DataFrame.

Las columnas del archivo y sus significados son los siguientes:


• Anio: Año en la cual se realizó la medición.
• Nombre de la estación: Nombre que identifica la estación de monitoreo de la calidad del aire.
• Departamento: Nombre del departamento.
• Tipo de estación: Clasificación de la estación según la duración del monitoreo.
• Tiempo de exposición: Periodo normativo en el cual se toma la medición.
• Variable: Parámetro climatológico o de contaminación ambiental evaluado por la estación de monitoreo de
la calidad del aire. Puede ser CO, O3, NO2, SO2, PM10 y PM2.5.
• Concentración: Valor obtenido durante la realización de la medición.
• ICA: Calidad del parámetro climatológico o de contaminación ambiental medido. Puede ser Buena, Aceptable,
Dañina a la salud, Dañina a la salud para grupos sensibles, Muy dañina a la salud y Peligrosa.

ATENCIÓN: cuando esté estudiando el problema y el archivo, recuerde que las funciones describe(), unique() y filter()
pueden serle de utilidad. La función describe() aplicada sobre un DataFrame retorna información estadística de todas
las columnas numéricas. La función unique() aplicada sobre una columna retorna una lista con los valores únicos que
aparezcan en esa columna.

Parte 2: Análisis de la distribución de los datos en las mediciones


Requerimiento 1: Distribución de los tipos de estaciones
Para este requerimiento se quiere conocer la distribución de los tipos de estaciones de medición de las variables
climatológicas. La siguiente figura muestra la apariencia de la gráfica esperada.
Requerimiento 2: Tendencia del número de medidas realizadas en un rango de años
En este requerimiento se quiere conocer el número de medidas realizadas en un rango de años. El usuario debe
poder ingresar un límite inferior y un límite superior para determinar el intervalo de años que desea visualizar. Se
debe mostrar un diagrama de línea con el número de medidas realizadas en el rango de años. Por ejemplo, entre los
años 2014 y 2018, se obtiene una tendencia como se muestra a continuación:

ATENCIÓN: Tenga en cuenta que para el ejemplo se usó el rango de 2014 a 2018.
Requerimiento 3: Top 5 departamentos con mediciones de O3 mayores a un valor
En este requerimiento se quieren conocer los 5 departamentos con mayor número de mediciones de O3 superiores a
la concentración ingresada por el usuario. Por ejemplo, para una concentración de O3 de 100𝜇𝑔/𝑚3 se debe mostrar
un diagrama de barras horizontal como el que se encuentra a continuación:

ATENCIÓN: Tenga en cuenta que para el ejemplo se ingresó una concentración de O3 de 100𝜇𝑔/𝑚3.
Requerimiento 4: Diagramas de caja y bigotes de CO por año
En este requerimiento se quiere mostrar la distribución de las concentraciones de CO para un año ingresado por
parámetro. Para este requerimiento utilice únicamente las mediciones con un tiempo de exposición de 8. El diagrama
debe verse como el que se muestra a continuación:

ATENCIÓN: Tenga en cuenta que para el ejemplo se usó el año 2018.


Requerimiento 5: Concentración anual de PM10 por departamento
En este requerimiento se quieren identificar las concentraciones promedio anuales de material particulado menor a 10
micras (PM10) para un departamento ingresado por el usuario. Por el ejemplo, para el departamento Antioquia la
gráfica se debe ver como la que se muestra a continuación:

ATENCIÓN: Tenga en cuenta que para el ejemplo se usó el departamento de Antioquia.

Parte 3: Estudiar el Índice de Calidad del Aire (ICA)


En esta última parte no se trabajará directamente sobre el DataFrame original, sino que se creará una matriz a partir
de este. La matriz debe relacionar el Índice de Calidad de Aire (ICA) y los departamentos del territorio nacional.

Requerimiento 6: Construcción de la matriz de Departamento vs ICA


Este requerimiento consiste en construir una matriz que cruce el departamento en el que se tomaron las mediciones y
el ICA. La matriz tiene la siguiente estructura:

78 782 251 323 542 57


87 45 876 455 411 82
... … … … … …
75 211 575 532 552 400

NOTA: La matriz mostrada anteriormente es un ejemplo y NO hace referencia a los valores que usted obtendrá al
construir la matriz. Cada posición (f,c) en la matriz contiene el número de medidas tomadas que pertenecen al
departamento f y que tiene la calidad c (Buena, Aceptable, etc.). Por ejemplo, si Amazonas está en la fila 1 y Aceptable
en la columna 3, el número de medidas aceptables en el departamento de Amazonas sería el valor en la casilla (1,3).

Así mismo, se propone la construcción de 2 diccionarios para la referencia de las filas y las columnas. La llave de los
diccionarios hace referencia al índice de la fila o columna de la matriz y el valor hace referencia al departamento o ICA
correspondiente. A continuación, se muestran los diccionarios para las filas y las columnas.
Llave Valor
0 “Antioquia”
1 “Arauca”
2 “Atlántico”
… ...
22 “Valle del Cauca”

Llave Valor
0 “Aceptable”
1 “Buena”
... ...
5 “Peligrosa”
NOTA: El código para la creación de los dos diccionarios ya se encuentra en el esqueleto proporcionado.

ATENCIÓN:
• Recuerde que tiene a su disposición la función unique() para obtener todos los valores únicos de una columna en
un DataFrame.
• Para comprobar que los valores de la matriz creada son los correctos puede utilizar filtros, agrupaciones y sumas
sobre el DataFrame original y verificar que estos arrojen el mismo resultado que el almacenado en su matriz.
• Puede ser de mucha utilidad pensar en descomponer el problema en varios problemas más pequeños.

Nota importante: Dado que el tamaño del DataFrame es bastante grande, la construcción de la matriz podría tardar
más tiempo del que suelen tardar otras funciones. Si el tiempo supera los 2 minutos es muy probable que haya un
problema en el código. En ese caso, le recomendamos que detenga el programa y revise si existe algún error en sus
funciones.

La función para crear la matriz debe retornar una tupla que contenga la matriz creada y los diccionarios de filas y
columnas en el siguiente formato (matriz, dict_filas, dict_columnas). Tenga en cuenta que usted deberá implementar
los siguientes requerimientos utilizando como base la tupla anterior:

Requerimiento 7: Encontrar departamento con más mediciones


En este requerimiento se debe encontrar el departamento que ha registrado la mayor cantidad de mediciones sin
importar la calidad del ICA registrado en la medición. La función que implemente esta opción debe retornar el nombre
del departamento con mayor número de mediciones.

Requerimiento 8: Contar cantidad de mediciones con un ICA dado


En este requerimiento se debe calcular el número total de mediciones que tienen una clasificación ICA específica. Para
esto, el usuario debe indicar la clasificación ICA para la cual desea obtener el número total de mediciones. La función
que implemente esta opción debe retornar un entero que represente el número de mediciones que son clasificadas en
la categoría ingresada.

Requerimiento 9: Mayor departamento e ICA


En este requerimiento se debe determinar el departamento y el ICA en el que hubo mayor número de mediciones. La
función que implemente está opción debe calcular la fila y la columna en donde se registró el mayor número de
mediciones dentro de toda la matriz, y retornar una tupla de la forma (d,g), donde d es el nombre del departamento y
g es el ICA.

Requerimiento 10: ICA con más mediciones por departamento


Este último requerimiento de la aplicación consiste en determinar cuál fue la clasificación ICA que tuvo un mayor
número de mediciones en cada departamento. Para esto, debe mostrar la información sobre un mapa de Colombia.
Para esta visualización utilizaremos el archivo mapa.png (que se encuentra adjunto a este enunciado), el cual es una
imagen del mapa de Colombia en blanco y negro con resolución de 800x800 píxeles. La idea es indicar dentro de cada
departamento del mapa la clasificación ICA con mayor número de mediciones en ese departamento. Para cada uno de
estos departamentos, se pintará un pequeño cuadrado de 13x13 píxeles centrado en las coordenadas (en píxeles) del
departamento dentro el mapa. Las coordenadas de los 33 departamentos se encuentran en el archivo coordenadas.txt
(que se encuentra adjunto a este enunciado).

Para cargar el mapa como una matriz de píxeles y luego visualizarlo puede guiarse por el siguiente fragmento de código:

import matplotlib.image as mpimg


mapa = mpimg.imread(‘mapa.png’).tolist()
plt.imshow(mapa)
plt.show()

La siguiente función le permitirá cargar el archivo de coordenadas y retornar un diccionario, cuyas llaves son los
nombres de los departamentos y los valores son tuplas con las coordenadas (x,y) de cada departamento. El nombre del
departamento en este archivo es idéntico al que se encuentra en el DataFrame y en la matriz.

def cargar_coordenadas(nombre_archivo:str)->dict:
deptos = {}
archivo = open(nombre_archivo, encoding="utf8")
archivo.readline()
linea = archivo.readline()
while len(linea) > 0:
linea = linea.strip()
datos = linea.split(";")
deptos[datos[0].upper()] = (int(datos[1]),int(datos[2]))
linea = archivo.readline()
return deptos

Una vez cargado el mapa y construido el diccionario de coordenadas, el siguiente paso es utilizar dichas coordenadas
para pintar en el mapa varios puntos con un color que represente a cada clasificación ICA. Para ello, se han asignado
los siguientes colores a cada categoría:

Clasificación ICA Componente RGB


Buena 36/255,226/255,41/255
Aceptable 254/255,253/255,56/255
Dañina a la salud de grupos sensibles 252/255,102/255,33/255
Dañina a la salud 252/255,20/255,27/255
Muy dañina a la salud 127/255,15/255,126/255
Peligrosa 101/255, 51/255, 8/255

ATENCIÓN:
Tenga en cuenta que los valores de color deben ser valores entre 0 y 1 por la forma en la que matplotlib procesa los
valores de color. Por esta razón es que se representan como proporciones entre un número y 255.

El mapa resultante debe verse como el que se muestra a continuación:


ATENCIÓN:
Para poder crear las leyendas de la gráfica anterior se debe utilizar el paquete mpatches de la librería de matplotlib.
Para poder añadir las leyendas, haga uso del siguiente código (info_matriz es la tupla que contiene la matriz, y los
diccionarios de filas y columnas):

import matplotlib.patches as mpatches


colores = {"Buena":[36/255,226/255,41/255], "Aceptable":[254/255,253/255,56/255],
"Dañina a la salud de grupos sensibles":[252/255,102/255,33/255],"Dañina a la
salud":[252/255,20/255,27/255], "Muy dañina a la salud":[127/255,15/255,126/255],
"Peligrosa":[101/255, 51/255, 8/255]}
legends = []
for i in range(len(matriz[0])):
legends.append(mpatches.Patch(color = colores[info_matriz[1][i]], label=
info_matriz[1][i]))
plt.legend(handles = legends, loc = 3, fontsize='x-small')

Actividad 1: Preparación del ambiente de trabajo


1. Cree una carpeta para trabajar, poniéndole su nombre o login.
2. Descargue de Bloque Neón el archivo “calidad_aire.zip” que contiene el archivo “.csv” con los datos a procesar,
una imagen del mapa de Colombia, un txt con las coordenadas de los departamentos y un archivo .py que debe
usar como esqueleto para realizar el proyecto. Este archivo contiene el código para crear los diccionarios de las
filas y columnas de la matriz que usted debe construir.
3. Abra Spyder y cambie la carpeta de trabajo para que sea la carpeta donde descargó el archivo con los datos.

Actividad 2: Construir el módulo de funciones


4. Usando Spyder, cree en su carpeta de trabajo un nuevo archivo con el nombre “calidad_aire.py”. En este archivo
usted va a construir el módulo en el que va a implementar las funciones que responden a los requerimientos de la
aplicación. Defina, documente e implemente las funciones en su nuevo archivo. Usted puede crear
cuántas funciones considere necesarias dentro de su librería o módulo. Mínimo debe haber una función por cada
uno de los requerimientos del programa.
Actividad 3: Construir la interfaz de usuario basada en consola
5. Implemente la interfaz de la aplicación en un nuevo archivo llamado “consola_calidad_aire.py”. Esta interfaz debe
seguir la misma estructura de las consolas que hemos implementado en laboratorios y proyectos anteriores. Es
decir, debe existir una función llamada iniciar_aplicacion() para que muestre el menú usando la función
mostrar_menu() y permita al usuario seleccionar una opción. El menú que se despliegue debe permitir al usuario
ejecutar todas las acciones de la descripción de la aplicación, así como salir (terminar) del programa. Por cada una
de las funciones principales de su programa debe existir una función en la consola que la ejecute, pidiendo
previamente los datos necesarios al usuario (si aplica) e imprimiendo por pantalla el resultado de la función. Se
sugiere nombrar estas funciones como ejecutar_XX, donde XX es la respectiva función de su módulo. Cuando haya
implementado la función iniciar_aplicacion() corra su programa y verifique que: se comporta adecuadamente, le
permite al usuario seleccionar las opciones que quiere ejecutar, y termina el programa cuando se le indica.

Actividad 4: Probar el correcto funcionamiento de su programa


6. Ejecute el programa y pruebe cada una de las funciones para asegurarse que esté funcionando. Puede probar el
correcto funcionamiento de su programa cargando la información que se encuentra en el archivo “calidad_aire.csv”
o creando su propio archivo de prueba de menor tamaño (respetando el mismo formato) que le permita corroborar
que los resultados arrojados por su programa son correctos.
Entrega
7. Comprima dos archivos: calidad_aire.py y consola_calidad_aire.py en un solo archivo .zip. El archivo comprimido
debe llamarse “N4-PROY-login.zip”, donde login es su nombre de usuario de Uniandes (omita el punto del login
para evitar posibles problemas con la extensión de los archivos. Por ejemplo, si su login fuese “p.perez123”, nombre
el archivo como “N4-PROY-pperez123.zip”).
8. Entregue el archivo comprimido a través de Bloque Neón en la actividad designada como “Proyecto del Nivel 4”.

También podría gustarte