miércoles, 30 de septiembre de 2015

Programacion

Gestion de regiones

Autor : René Curín
Competencia : Gestion del conocimiento
Asignatura: Programacion II
Palabras claves: Python, Excel

Descripción de la actividad
Crear un programa que sea capaz de procesar un archivo excel que contiene datos sobre personas damnificadas por algun suceso extremo como son lo terremotos, tsunami, tornados, diluvios, destruccion del sistema solar, contraccion del universo o cualquier otro evento natural que cause graves daños, desde el cual se deben extraer los archivos para poder separarlos por regiones y ciudades.


Enunciado de la actividad:
 La fuerza de la naturaleza ha producido a lo largo de la historia del hombre múltiples situaciones catastróficas, causando cuantiosos daños socio-económicos. En el último tiempo, se han registrado continuamente movimientos telúricos, con intensidades de hasta 8 grados Richter de manera casi semanal, aunque por suerte no han sido de gran duración o se podrían dar situaciones lamentables, como la ocurrida el pasado 1 de Abril, cuando un fuerte movimiento telúrico 8.3 Richter produjo fuertes daños en las provincias de la región de Tarapacá. Debido al fuerte sismo, muchas personas perdieron sus viviendas y vivieron (e incluso viven) en albergues provisionales . Se estima que existían sobre 300 mil damnificados en toda la región, esparcidos de acuerdo a la densidad poblacional de cada una de sus provincias.
 
 Tomando en cuenta esta situación como base, pensaremos que para una situación como esta, se podría elaborar una canasta básica de sobrevivencia, la cual contemplaría los siguientes alimentos: agua (litros), azúcar (kilos), arroz(kilos), té (bolsitas), pan (kilos) y paquetes de pasta. 
 Consideraremos dentro de la situación, un reporte de necesidades de cada damnificado entregado por las autoridades pertinentes en su momento (necesidades.csv), en el cual se considera la siguiente información: nombre;provincia;agua,azúcar,arroz,té,pan,pasta.
Debido a la distancia respecto de las otras regiones del país, se entiende que el alimento debería ser distribuido en cada provincia por medio de camiones y que a pesar de los esfuerzos que puedan realizar las autoridades competentes, no es posible entregar a toda la ciudadanía todo lo necesario a la vez, por tanto, los alimentos son entregados parcialmente de acuerdo al arribo de los camiones a cada zona afectada

Objetivos principales
- Aprender extraer informacion de un archivo excel
- Aprender a procesar la informacion y catalogarla
- Diseñar un programa que sea utilizable para diversos casos

Desarrollo de la actividad:
     Estrategia de Trabajo: Comenzamos por analizar los datos que se van a extraer y en la forma que se van a almacenar dentro del programa, luego diseñamos la forma en que separaremos los diferentes datos para luego poder utilzarlos.

    Modelo de Solución: iniziamos leyendo el archivo y extrayendo los diferentes campos en arreglos, lo primero que extrajimos fueron las ciudades, para poder separar los demas datos, luego las personas segun su ciudad, y finalmente los recursos destinados para cada persona, despues esto nos genero varios areglos, los cuales utilizamos para generar graficos y poder asignarle una equvalencia de recursos a las personas que mas necesitaban, y lo que sobraba se lo dejabamos a las personas con mas recursos, generabamos un archivo por cada ciudad que contenia cada persona respecto a su ciudad y el total de personas, ademas de sus necesidades, y luego generamos un grafico de torta para ver que tantas personas damnificadas hubieron por ciudad. 

Codigo Fuente 
 
# -*- 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(";")    # Separo la cadena 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 pocicion 1
                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("necesidades.csv")
 
 Imagen de dmostracion: 
 
 
 Descargas:
 
Archivo Excel -> https://mega.co.nz/#!mZ82jDwK!AnXPLSl4DnJIqyY_os3L0iM-4aOXNjZsFhvZTdiY8X8 
Codigo -> https://mega.co.nz/#!yN0nnDZa!1Uanrwzpam16mxaLQuORh0_sJWXlPRA4rzBl1K2d23c
 
 

No hay comentarios:

Publicar un comentario