domingo, 2 de noviembre de 2014

Abastecimiento para damnificados por terremotos - Programación


Abastecimiento para damnificados por terremotos - Programación
Autor : René Curín
Competencia : Aplicacion ciencias de la ingenieria (nivel 1)
Asignatura: Programación 2
Palabras clave: Programación, Funciones, Python
Descripción de la actividad:

Este proyecto consistió en la elaboración de un programa que fuera capaz de extraer datos desde un archivo que contiene datos de personas damnificadas por lo terremotos y luego trabajar con sus datos para poder separar y ordenar las personas según su provincia en la región, además de entregar recursos o beneficios según sea pertinente para cada persona y finalmente generar reportes gráficos respecto a la totalidad de beneficios y afectados en la región.

Enunciado de la actividad: 
 Para poder dar una solución a una problemática como esta se solicita realizar los siguientes reportes respecto al potencial envío y entrega de alimentos:

1. Genere la carpeta llamada “Tarapacá”, la que a vez contienen un conjunto de subcarpetas llamadas según el nombre de sus provincias tal como se muestra en la Figura 2. Note que esto será generado en la misma ruta donde ejecutará su script de Python (nombre alumno.py (más detalles en la sección 3: normas de entrega)).

2. Por cada provincia (en su respectiva carpeta), genere el archivo llamado “nombre provincia.csv”, los cuales contienen los nombres (solo los nombres) de todos sus damnificados ordenados en orden creciente según apellido paterno.

3. Genere la carpeta “reportes” dentro de “Tarapacá”. Elabore un reporte (dentro de Tarapacá/reportes/) llamado “requerimientos.csv”, el cual muestra la cantidad de personas por provincia y las necesidades alimentarias requeridas, es decir, la cantidad de productos requeridos de acuerdo a la canasta básica. De acuerdo a lo anterior, el archivo contiene:
provincia:numero personas;agua,azúcar,arroz,té,pan,pasta.

4. Considerando la realización del punto anterior, cree la carpeta “graficos” dentro de Tarapacá/reportes/ y genere dentro de esta usando matplotlib lo siguiente:
    - a. Gráfico de torta que contenga la información referente a la distribución porcentual de damnificados por provincia respecto del total. Este gráfico debe ser guardado (no desplegado) con el nombre “damnificados.png”.
    - b. Gráfico de torta que contenga la información referente a los distribución porcentual de la cantidad de agua por provincia respecto del total. Este gráfico debe ser guardado (no desplegado) con el nombre “consumo_agua.png”.
    - c. Gráfico de barras que contenga la información referente al consumo de pan por provincia. Este gráfico debe ser guardado (no desplegado) con el nombre “consumo_pan.png”.

5. Suponga que azúcar es escasa y que solo un 20% de lo requerido es posible distribuir en las provincias. Construya el reporte (dentro de /Tarapacá/reportes/) llamado “provincia azucar.csv”, el cual contiene un listado de todas las personas (nombres:azúcar) las cuales están ordenadas en orden decreciente respecto de los kilos de azúcar solicitado. Recuerde que solo el 20% de la cantidad de azúcar está disponible para todas las provincia, por tanto, considere una distribución de azúcar ≤ 20%.

6. Suponga que solo es posible distribuir un 70% de todas las necesidades y que la provincia de Iquique fue la más afectada, por tanto, elabore el reporte (dentro de /Tarapacá/reportes/) llamado “beneficiados.csv”, el cual contiene todas las personas (toda la información disponible de necesidades.csv) que serán beneficiadas considerando que debe satisfacerse todas las necesidades de la provincia de Iquique. Por otra parte, elabore el reporte (dentro de /Tarapacá/reportes/) llamado “espera provincia.csv”, el que debe contener el nombre de todas las personas (ordenadas en orden decreciente según apellido paterno) que no hayan sido beneficiadas. Se considera una persona como beneficiada cuando todos sus requerimientos fueron cumplidos y si no es así, no sería beneficiada (no se toman casos parciales).

Se espera que en el informe se realice un análisis detallado sobre cómo es que usted decidió hacer esta distribución de ayuda, tomando en cuenta el código que usted utilice en su programa y lo revisado en la parte 5 y 6 de esta tarea.

Solución de la activida:
 Codigo del prohgrama:

# -*- encoding: utf-8 -*-
import os
import numpy as np
from pylab import*
import matplotlib.pyplot as plt

def obtener_provincias(x):
    archi = open(str(x),"r")
    prov = []
    cont = 0
    for k in archi:
        k = k.split(";")
        for i in range(len(prov)):
            if k[1] == prov[i]:
                cont = 1
        if cont == 0:
            prov.append(k[1])
        cont = 0
    archi.close()
    return prov

def ordenar(a):
    nombres = []
    for k in a:
        k = k.split(";")
        nom = k[0]
        nom = nom.split(" ")
        nombre = str(nom[2])+" "+str(nom[3])+" "+str(nom[0])+" "+str(nom[1])
        nombres.append(nombre)
    nombres = sorted(nombres)
    final = []
    for k in nombres:
        k = k.split(" ")
        nombre = str(k[2])+" "+str(k[3])+" "+str(k[0])+" "+str(k[1])
        final.append(nombre)
    return final

def crear(x):
    if (os.path.exists(x) == False):
        os.mkdir(x)

def sub_carpetas(x, provincias):
    crear(x)
    for C in provincias:
        crear(x + "/"+ str(C))

def graf_torta(valores,etiquetas,direccion):
    aficion = valores
    etiquetas = etiquetas
    ax = axes([0, 0, 0.8, 1])
    plt.pie(aficion, labels = etiquetas)
    legend()
    ylabel("Numero Personas")
    xlabel("Provincias")
    grid(True)
    plt.savefig(direccion)
    show()

def graf_bar(valores,etiquetas,direccion):
    name =etiquetas
    values=valores
    pos = arange(len(name)) + .5
    plt.bar(pos, values, align='center', color='#b8ff5c')
    xticks(pos,name,rotation=30,size="small")
    plt.savefig(direccion)
    show()

def productos(alimentos):
    agua = []
    pan = []
    azucar=0
    total = 0
    for f in range(len(alimentos)):
        x = alimentos[f]
        total += x[0]+x[1]+x[2]+x[3]+x[4]+x[5]
        agua.append(x[0])
        pan.append(x[4])
        azucar+=int(x[1])
    return agua,pan,azucar,total

def graficos(direccion,personas,provincias,agua,pan):
    crear(direccion)  #"Tarapaca/Reportes/Graficos"
    graf_torta(personas,provincias,str(direccion)+"/damnificados.png")
    graf_torta(agua,provincias,str(direccion)+"/consumo_agua.png")
    graf_bar(pan,provincias,str(direccion)+"/consumo_pan.png")

def repor_requerimiento(direccion,provincias,personas,alimentos):
    crear(direccion)
    requisitos = open(str(direccion)+"/Requerimientos.csv", "a")
    for i in range(len(provincias)):
        requisitos.write(str(provincias[i]) + ";" + str(personas[i]) + ";")
        for n in range(6):
            requisitos.write(str(alimentos[i][n]) + ",")
        requisitos.write(";\n")
    requisitos.close()

def repor_azucar(direc,azucar,doc):
    archi = open(doc,"r")
    text = open(str(direc) + "/provincia_azucar.csv","a")
    disponible = (azucar / 100) * 20
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        line = str(i[0])+";"+str(ali[1])
        if disponible >=0:
            if int(ali[1]) == 3:
                num = int(ali[1]) - 3
                disponible = disponible - 3
                line = str(i[0])+";"+str(num)
        text.write(line+"\n")
        line = ""
    archi.close()

def repor_beneficiados(direc,doc,total,afectado):
    archi = open(doc,"r")
    text = open(str(direc) + "/beneficiados.csv","a")
    disponible = (total / 100) * 70
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        if i[1] == afectado.upper():
            text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5]))
            while int(ali[0]) > 0 or int(ali[1]) > 0 or int(ali[2]) > 0 or int(ali[3]) > 0 or int(ali[4]) > 0 or int(ali[5]) > 0 and disponible > 0:
                for k in range(6):
                    if disponible > 6:
                        if int(ali[k]) != 0:
                                ali[k] = int(ali[k]) - 1
                                disponible -= 1
                    else:
                        break
            #text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5])+"\n")
    archi.close()
    archi = open(doc,"r")
    true = True
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        cont = 2
        if i[1] != afectado.upper() and true == True:
            if int(ali[0]) >= cont and int(ali[1]) >= cont and int(ali[2]) >= cont and int(ali[3]) >= cont and int(ali[4]) >= cont and int(ali[5]) >= cont:
                text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5]))
                while int(ali[0]) > 0 or int(ali[1]) > 0 or int(ali[2]) > 0 or int(ali[3]) > 0 or int(ali[4]) > 0 or int(ali[5]) > 0:
                    if disponible > 6:
                        for k in range(6):
                            if int(ali[k]) != 0:
                                ali[k] = int(ali[k]) - 1
                                disponible -= 1
                    else:
                        true = False
        if i[1] != afectado.upper():
            text1 = open(str(direc) + "/espera_provincia.csv","a")
            text1.write(str(i[0]) +";"+str(i[1])+";"+str(i[2]))
            text1.close()

def terremoto(documento):
    provincias = obtener_provincias(documento)    # Variable para almacenar las provincias
    personas = [0] * len(provincias)    # Variable para almacenar la cantidad de personas
    alimentos = [[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]    # variable para almacenar la cantidad de alimentos
    archi = open(documento, "r")
    sub_carpetas("Tarapaca", provincias)    # Se crean las subcaprteas
    for linea in archi:
  linea = linea.split(";")#Separolacadena por ; y su resultado seria['Nombre','provincia','1,5,9,78,45,7']
        prod = linea[2].split(",")    # La pocision 2 de linea son los alimentos y los separo por una coma
        for i in range(len(provincias)):
            if provincias[i] == linea[1]:    # si provicnias(Mayusculas es igual a provincias de la pocicion1
                personas[i] += 1     # Sumo 1 a la cantidad de personas segun provincia
                text = open("Tarapaca/" + str(provincias[i])+ "/" +str(provincias[i]) + ".csv", "a")
                text.write(str(linea[0]) + ";\n")
                text.close()
                for ali in range(6):
                    alimentos[i][ali] += int(prod[ali])
    archi.close()

    agua,pan,azucar,total = productos(alimentos)   #Obtengo los alimentos
    repor_requerimiento("Tarapaca/Reportes",provincias,personas,alimentos)
    repor_azucar("Tarapaca/Reportes",azucar,documento)
    repor_beneficiados("Tarapaca/Reportes",documento,total,"Iquique")
    graficos("Tarapaca/Reportes/Graficos",personas,provincias,agua,pan)    # Se generan los graficos

#--------Main---------
terremoto("necesidades1.csv")
El codigo no es muy legible al momento de postearlo, por eso les dejo el link del codigo -> LINK

De que me sirvió esta activida:

La actividad me ayudo a la formulación de ideas para poder seperar las personas y además poder crear algunos cálculos para poder entregar los beneficios para cada persona, como fue una tarea un poco enredada tuve que imaginar completamente la estructura del programa para poder empezar a programar.

 

No hay comentarios:

Publicar un comentario