Skip to content

Los archivos en src

Edcana563 edited this page Feb 4, 2021 · 18 revisions

En esta parte del wiki se describirán los archivos encontrados en Replase/CMBTN/src

1. El primer archivo es: CMBTN.jl

Incluye las líneas de código fundamentales para que el Pkg funcione:

include("help.jl")
include("data.jl")
include("info.jl")
include("extracDatosNatyMor.jl")
include("migración.jl")
include("pobreza y extrema.jl")
include("idh.jl")

También va a devolver la información ya dividida según el valor que se desee obtener:

    value=deleteat!(value,1)
    pob=value[1:32]
    edad=value[33:64]
    fecun=value[65:96]
    naci=value[97:128]
    defun=value[129:160]
    dens=value[161:192]
    homb=value[225:256]
    muje=value[257:288]
    indi=value[193:224]

Este código hace una gran parte del trabajo que se realiza en el Pkg entero.

Lo siguiente pone los datos en un DataFrame, luego crea un archivo con el nombre "estados" junto con la fecha y hora en que se creó este archivo.

function Estado_data()
    V=apis
    ids=Vector()
    info=Vector()
    for x in V
        k=estadoid(x)
        v=downA(x)
        awa=inegi(v)
        push!(info,awa)
        push!(ids,k)
    end
    nine=Vector(undef,9)
    for n in 1:9
        data=Vector(undef,1)
        for x in info
            push!(data,x[n])
        end
        nine[n]=deleteat!(data,1)
    end
    data=DataFrame(id=ids,Estado=Estados,Poblacion_total=nine[1],Media_edad=nine[2],Fecundidad=nine[3],Nacimientos=nine[4],Defunciones=nine[5],Densidad_pob=nine[6],Hombres=nine[8],Mujeres=nine[9],indigena=nine[7])
    filecsv(data,"Estados")
end

Lo siguiente necesita el PATH del Pkg para poder usarse. Una manera de conseguir este PATH es con lo siguiente:

"C:\\Users\\ASUS\\.julia\\packages\\CMBTN"

Esta es la parte del código que tarda más tiempo. Esto se debe a que la INEGI bloquea las consultas tan continuas, por lo que el mismo código fue escrito para evitar esto, y en lugar de detener por completo el proceso, toma más tiempo.

function Municipio_Estado(path::String)                                        
#Tiene que insertar el path del package CMBTN
    m="\\src\\municipio.txt"
    p=path*m
    f=open(p)
    s=readlines(f)
    close(f)
    ide=Vector()
    idm=Vector()
    info=Vector()
    for (i,x) in enumerate(s)
        ids=municid(x)
        Dic=downA(x)
        awa=inegi(Dic)
        push!(info,awa)
        push!(ide,ids[1])
        push!(idm,ids[2])
        if i==500
            sleep(120)
            println("Seguimos haciendo las consultas...\n")
        end
        if i==1000
            sleep(120)
            println("Seguimos haciendo las consultas...\n")
        end
        if i==1500
            sleep(120)
            println("Seguimos haciendo las consultas...\n")
        end
        if i==2000
            sleep(120)
            println("Seguimos haciendo las consultas...\n")
        end
    end
    nine=Vector(undef,9)
    for n in 1:9
        data=Vector(undef,1)
        for x in info
            try
                push!(data,x[n])
            catch err
                push!(data,999)
            end
        end
        nine[n]=deleteat!(data,1)
    end
    data=DataFrame(id_Estado=ide,id_municipio=idm,Poblacion_total=nine[1],Media_edad=nine[2],Fecundidad=nine[3],Nacimientos=nine[4],Defunciones=nine[5],Densidad_pob=nine[6],Hombres=nine[8],Mujeres=nine[9],indigena=nine[7])
    filecsv(data,"MUNICIPIOS")
    println("Listo")
end

La última función de este código envía la ubicación del archivo de municipios o estados creados por estado_datay municipio_estado. Descarga los archivos referentes al covid, los carga y los une con los datos del archivo, luego crea un archivo llamado COVID19ESTADOS o COVID19MUNICIPIOS.

2. El segundo archivo es: apis.jl

En este archivo encontraremos las APIs a través de las cuales se extrae la información directamente del INEGI.

Nacimientos = 
[HTTP.get("https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000026,1002000027,1002000028/es/0700/false/BISE/2.0/5568de47-3c5d-eb22-1c3c-9d4294ee5b77?type=json"), 
<...>
HTTP.get("https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000026,1002000027,1002000028/es/07000032/false/BISE/2.0/5568de47-3c5d-eb22-1c3c-9d4294ee5b77?type=json")]

Muertes = 
[HTTP.get("https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000030,1002000031,1002000032/es/0700/false/BISE/2.0/5568de47-3c5d-eb22-1c3c-9d4294ee5b77?type=json"),
<...>
HTTP.get("https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000030,1002000031,1002000032/es/07000032/false/BISE/2.0/5568de47-3c5d-eb22-1c3c-9d4294ee5b77?type=json"),]

3. El tercer archivo es: data.jl

Esta función sirve para retornar un vector con los datos pedidos.

function inegi(dic::Dict)::Vector
      a=get(dic,"Series",3)
      vector=Vector{Dict{String,Any}}(undef,1)
      for x in a
            obs=get(x,"OBSERVATIONS",3)
            data=get(obs[1],"OBS_VALUE",3)
            ind=get(x,"INDICADOR",3)
            dic2=Dict("INDICADOR"=>ind,"OBS_VALUE"=>data)
            push!(vector,dic2)
      end

Esta función parsea un URL y regresa f la cual es un identificador para el estado con el cual se quiera trabajar.

function estadoid(url::String)::Int64
      a=url[182:189]
      f=parse(Int64,a)
      f=f-7000000
      return f
end

Obtiene un ID de un estado y su municipio según el API que se mande. Se inserta un vector y luego retorna ese vector.

function municid(url::String)::Vector
      a=url[187:189]
      g=parse(Int64,a)
      f=url[190:193]
      f=parse(Int64,f)
      vec=Vector()
      push!(vec,g)
      push!(vec,f)
      return vec
end

Esta función verifica si se desea trabajar con un indicador o con un valor.

function dataind(vect::Vector,g::Bool)::Vector
      vec=Vector(undef,1)
      if g                                                                              ### true indicadores
            for x in vect
                  push!(vec,get(x,"INDICADOR",0))
            end
      else                                                                                ##false valores
            for x in vect
                  push!(vec,get(x,"OBS_VALUE",0))
            end
      end
      deleteat!(vec,1)
      return vec
end

4. El cuarto archivo es: extracDatosNatyMor.jl

Esta función se encarga de acceder a la información de natalidad o mortalidad según se pida, para después ingresar el año con el que se desea trabajar (en un rango de 1994-2019). Luego se convierte a JSON, se pasa a un string, el cual se parsea y regresa un diccionario.

Se llama la función, y se ingresa el año que se desea (1994-2019). Se convierte a JSON, se pasa a un string, se parsea, regresa un diccionario. indice es el verificador para determinar si se encuentra o no el año solicitado.

function Cantidad_total_de(categoria::String,anio::String)::Int
    if lowercase(categoria) == "natalidad"
        a = Nacimientos[1]
    elseif lowercase(categoria) == "mortalidad"
        a = Muertes[1]
    end
    b = convertir_a_json(a)
    indice = 0
    if convert_string_to_int(anio) >=1994 && convert_string_to_int(anio) <=2019
        for i in 1:length(b.vals[14][1]["OBSERVATIONS"])
            if anio == b.vals[14][1]["OBSERVATIONS"][i]["TIME_PERIOD"]
                indice = i
            end
        end
        if indice != 0
            dato = b.vals[14][1]["OBSERVATIONS"][indice]["OBS_VALUE"]
            dato = convert_string_to_int(dato)
            return dato
        end
        println("Año no encontrado")
        return 0
    end
        println("No se tiene registro de natalidad en éste año")
        return 0
end

Un ejemplo:

#Ejemplos de uso
a = Cantidad_total_de("natalidad", "1996")
b = Cantidad_total_de("mortalidad", "2019")
c = Cantidad_total_de("natalidad", "campeche", "2019", "total")
d = Cantidad_total_de("natalidad", "campeche", "2001", "hombre")
e = Cantidad_total_de("mortalidad", "veracruz", "2019", "mujer")
f = vector_x_anio_de_nacimientos()
g = vector_x_anio_de_muertes()
df = df_nacimientos_x_anio()
dfm = df_muertes_x_anio()

5. El quinto archivo es: help.jl

Esta función, entre otras cosas, se encarga de descomprimir un archivo .zip para después guardarlo en la dirección actual donde se esté trabajando (se puede utilizar pwd() para ver la dirección actual).

function decompress(zipp::String,dir::String)  #Descomprime un .zip dando su direccion y donde cae
    InfoZIP.unzip(zipp,dir)
end
function decompress(zipp::String) #descomprime un .zip y lo guarda el la direccion actual
    InfoZIP.unzip(zipp,pwd())
end

DFCSV Para pasar de un CSV a un DataFrames, si es true es CSV con punto y coma, si es false entonces es CSV con comas.

function DFCSV(csvv::String,g::Bool)::DataFrame
    if g
        f=DataFrame(load(csvv,delim=';'))  #Lee un archivo csv si manda true esta divido por ; si no es ,
    else
        f=DataFrame(load(csvv))
    end
    return f
end

filecsv Envía un Dataframe y guarda en un CSV en donde estás trabajando

function filecsv(file::DataFrame)
    a=save("file.csv",file)                  #crea un arhchivo csv en el directorio base
end

downl Envía un string de un URL de un archivo y su dirección donde quieres que se guarde, va a devolver el string donde está guardado. Si no le mandas dirección se guarda donde estás trabajando. a=HTTP Descarga un archivo y lo guarda en la dirección que lo mandaste.

function downl(url::String,dir::String)::String
        a=HTTP.download(url,dir)                            #Descarga un archivo y si es un zip lo descomprime
        #b=sizeof(a)
        #c=b-2
        #tipo=a[c]*a[c+1]*a[c+2]
        tipo=a[end-2:end]
        if tipo == "zip"
            decompress(a,dir)
            return ""
        end
        return a
end
function downl(url::String)::String
    a=HTTP.download(url,pwd())
    #b=sizeof(a)
    #c=b-2
    #tipo=a[c]*a[c+1]*a[c+2]
    tipo=a[end-2:end]
    if tipo == "zip"
        decompress(a,pwd())
        return pwd()
    end
    return a
end

downA Envías API y devuelve un diccionario, pasa la API a un string

function downA(API::String)::Dict
    a=HTTP.request("GET",API)
    f=String(a.body)
    Dic=Dict()
    Dic=JSON.parse(f)
    return Dic
end

Unos ejemplos de su uso:

InfoZIP.unzip("Test.zip","D:\\IngenieriaDeSoftware\\Atom-Julia")

f = DataFrame(load("Test.csv",delim=';'))

first = save("Test.csv",file)    

6. El sexto archivo es: idh.csv

Contiene una tabla con los valores referentes al Índice de Desarrollo Humano.

Entidad IDH 2010 IDH 2000
Aguascalientes 0.7521 0.82
... ... ...
Zacatecas 0.7057 0.75
Nacional 0.739 0.79

7. El séptimo archivo es idh.jl

Es un archivo corto que usa un String de parámetro y retorna un DataFrame. Incluye el archivo \\src\\idh.csv para utilizarse después en el código como un DataFrame.

using CSVFiles, DataFrames

function df_IDH(path::String)::DataFrame
    archi = "\\src\\idh.csv"
    archi = path * archi
    df = DataFrame(load(archi))
    return df
end

Un ejemplo:

a = df_migracion()

8. El octavo archivo es: indimigra.csv

Es la tabla con los datos referentes al índice migratorio.

Entidad % Residen_en_la_entidad %Residen_en_otra_enti %Residentes_en_otro_pais
Tabasco 97.4 2.5 0.1
... ... ... ...
Zacatecas 97.1 2 1
Baja California 92.8 6 1.2

9. El noveno archivo es: info.jl

Contiene la información referente a los APIs con los cuáles se trabajarán.

apis=Vector()
push!(apis,"https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000001,1002000010,3105001001,6207020032,6207020033,1002000013,1002000026,1002000030,6207019034/es/07000001/true/BISE/2.0/5ca25658-cc51-c4fd-62cd-75148bd43e3a?type=json")
<...>
push!(apis,"https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000001,1002000010,3105001001,6207020032,6207020033,1002000013,1002000026,1002000030,6207019034/es/07000032/true/BISE/2.0/5ca25658-cc51-c4fd-62cd-75148bd43e3a?type=json")

Estados=Vector()
push!(Estados,"AGUACALIENTES")
<...>
push!(Estados,"ZACATECAS")

10. El décimo archivo es: migración.jl

Este archivo utiliza un String como parámetro y retorna un DataFrame que incluye información sobre el índice de migración.

using CSVFiles, DataFrames
#a = df_migracion()

function df_migracion(path::String)::DataFrame
    archi = "\\src\\indimigra.csv"
    archi = path * archi
    df = DataFrame(load(archi))
    return df
end

11. El onceavo archivo es: municipio.txt

Este archivo incluye las APIs necesarias para acceder a los datos sobre los municipios.

https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000001,1002000010,3105001001,6207020032,6207020033,1002000013,1002000026,1002000030,6207019034/es/070000010001/true/BISE/2.0/5ca25658-cc51-c4fd-62cd-75148bd43e3a?type=json
<...>
https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000001,1002000010,3105001001,6207020032,6207020033,1002000013,1002000026,1002000030,6207019034/es/070000320058/true/BISE/2.0/5ca25658-cc51-c4fd-62cd-75148bd43e3a?type=json

12. El doceavo archivo es: pobreza y extrema.jl

Este archivo utiliza dos funciones: df_pobreza y df_pobreza_extrema ambas usan String como parámetros y retornan un DataFrame con los datos de pobreza y pobreza extrema, respectivamente.

using CSVFiles, DataFrames

function df_pobreza(path::String)::DataFrame
    archi = "\\src\\porcentaje de pobreza.csv"
    archi = path * archi
    df = DataFrame(load(archi))
    return df
end

function df_pobreza_extrema(path::String)::DataFrame
    archi = "\\src\\porcentaje de pobreza extrema.csv"
    archi = path * archi
    df = DataFrame(load(archi))
    return df
end

Un ejemplo de cómo usar la función:

p = df_pobreza()
ex = df_pobreza_extrema()

13. El treceavo archivo es: porcentaje de pobreza extrema.csv

Este archivo contiene la información referente al porcentaje de pobreza extrema en formato .csv

Entidad 2008 2010 2012 2014 2016 2018
Aguascalientes 4.2 3.8 3.4 2.1 2.3 1.2
... ... ... ... ... ... ...
Zacatecas 9.5 10.8 7.5 5.7 3.5 3.4
Estados Unidos Mexicanos 11.0 11.3 9.8 9.5 7.6 7.4

14. El catorceavo archivo es: porcenataje de pobreza.csv

Este archivo contiene la información referente al porcentaje de pobreza en formato .csv

Entidad 2008 2010 2012 2014 2016 2018
Aguascalientes 37.6 38.1 37.8 34.8 28.2 26.2
... ... ... ... ... ... ...
Zacatecas 50.1 60.2 54.2 52.3 49.0 46.8
Estados Unidos Mexicanos 44.4 46.1 45.5 46.2 43.6 41.9