Path: blob/main/Trabajo_grupal/WG3/Grupo_2_py_WG3.py
2714 views
# -*- coding: utf-8 -*-1"""2Created on Sat Sep 17 19:16:16 202234@author: MSI5"""67"""8EJERCICIO 1910"""11#Importamos12import numpy as np13import pandas as pd14import os15from pandas import DataFrame,Series161718# In[5]:192021pip install openpyxl222324# In[3]:252627junin = pd.read_excel("D:/Users/Usuario/Documents/GitHub/1ECO35_2022_2/data/Region_Junin.xlsx")28#Primero importamos la base de datos, reconiciendo el formato (excel)29junin303132# 1. Obtener el nombre de todas las variables3334# In[4]:353637#Veremos el nombre de cada variable (columna) y el tipo a que corresponde38junin.info()39#este comando también nos permite identifcar el número de variables por tipo40#dtypes: float64(24), int64(15), object(3)41#Lo que significa que la mayor parte de nuestras observaciones son numéricas 39 (=24+15) y sólo tres son objetos424344# 2. Mostrar el tipo de variables (type) así como presentar los principales estadísticos.4546# In[5]:474849#El desarrollo anterior mostraba el tipo de cada variable, pero hacemos uso del comando describe para entender como se comporta la distribución de los valores de cada variable numérica (conocer sus principales estadísticos)50junin.describe()515253# In[6]:545556#Ahora bien, las variables región, distrito y place son object y no aparecerán en el análisis descriptivo a menos que lo especifiquemos en la función describe57junin.describe(include='O')585960# In[7]:616263junin.describe(include='all') #el argumento include también nos permite generar una tabla con todo tipo de variable (sea object o numérica)646566# 3. Verifique si las columnas presentan missing values6768# In[8]:697071#Pedimos un listado de las columnas que tienen al menos un missing value72[col for col in junin.columns if junin[col].isnull().any()]737475# In[12]:767778#Adicionalmente, buscamos un código que nos permitiera profundizar el conocimiento de los missing values en la base. En Stack overflow encontramos la siguiente función, que explicaremos brevemente79#missing_table genera un cuadro resumen de estadísticos para los missing value. Busca agregar observaciones que sean missing y representarlas como totales y porcentajes del total de observaciones80#Además, especifica el tipo de variable81def missing_table(df):82zero_val = (df == 0.00).astype(int).sum(axis=0)83mis_val = df.isnull().sum()84mis_val_percent = 100 * df.isnull().sum() / len(df)85mz_table = pd.concat([zero_val, mis_val, mis_val_percent], axis=1)86mz_table = mz_table.rename(87columns = {0 : 'Zero Values', 1 : 'Missing Values', 2 : '% of Total Values'})88mz_table['Total Zero Missing Values'] = mz_table['Zero Values'] + mz_table['Missing Values']89mz_table['% Total Zero Missing Values'] = 100 * mz_table['Total Zero Missing Values'] / len(df)90mz_table['Data Type'] = df.dtypes91mz_table = mz_table[92mz_table.iloc[:,1] != 0].sort_values(93'% of Total Values', ascending=False).round(1)94print ("Tu dataframe tiene " + str(df.shape[1]) + " columnas y " + str(df.shape[0]) + " filas.\n"95"Hay " + str(mz_table.shape[0]) +96" columnas que tienen valores missing.")97# mz_table.to_excel('D:/sampledata/missing_and_zero_values.xlsx', freeze_panes=(1,0), index = False)98return mz_table99100missing_table(junin)101102103# 4. Cambie el nombre de las siguientes variables:104# * place : comunidad105# * men_not_read: homxlee106# * women_not_read: mujerxlee107# * total_not_read: totalxlee108#109110# In[13]:111112113#Hay distintas alternativas para modificar el nombre de columnas, nosotros optamos por usar la función rename. De esta forma114#sólo debemos especificar los nuevos nombres de las variables relacionándolos con los nombres originales115junin.rename(columns = {'Place':'comunidad', 'men_not_read':'homxlee', 'women_not_read':'mujerxlee', 'total_not_read':'totalxlee'}, inplace = True)116junin.head(2)117118119# In[15]:120121122#De paso, modificaremos el nombre de la primera columna123junin.rename(columns = {'Unnamed: 0':'ID'}, inplace = True)124junin.head(2)125126127# In[16]:128129130junin.head(1)131132133# 5. Muestre los valores únicos de las siguientes variables ( comunidad , District)134135# In[17]:136137138print(junin.comunidad.unique())139#Aquí empleamos la función unique, esta recoge los valores únicos de la variable especificada (en este caso fue comunidad)140141142# In[30]:143144145#Hacemos lo propio con la variable District146print(junin.District.unique())147148149# 6. Crear columnas con las siguiente información: el % de mujeres del que no escriben ni leen (mujerxlee/totalxlee) % de varones que no escriben ni leen (homxlee/totalxlee) y % de nativos respecto al total de la población. Para el total de la población sumar (peruvian_men + peruvian_women + foreign_men + foreign_women)150151# In[21]:152153154junin["w_nowrite_noread"] = round(junin["mujerxlee"] / junin["totalxlee"], 2)155#Calculamos el % de mujeres que no escriben ni leen empleando dos columnas del dataframe. Por conveniencia decidimos redondear a dos dígitos después de la coma156junin157158159# In[19]:160161162junin["population"]= junin["peruvian_men"] + junin["peruvian_women"] + junin["foreign_men"] + junin["foreign_women"]163#Consideramos que contar con la población total como variable podría ser de utilidad en un análisis futuro, por eso la calculamos como la suma de la población nacional más extranjera, tanto para mujeres como hombres164165166# In[20]:167168169#Luego, el % de nativos respecto al total de la población es simplemente una división de las variables natives y population170junin["percent_natives"] = round(junin["natives"] / junin["population"], 2)171junin172173174# 7. Crear una base de datos con la siguiente información:175#176# * Quedarse con la información de los distritos de Ciudad del Cerro, Jauja, Acolla, San Gerónimo, Tarma, Oroya y Concepción177# * Luego quedarse con las comunidades que cuentan con nativos y mestizos.178# * Solo quedarse con las variables trabajadas en el punto 6), nombre de distrito y comunidad.179# * Guardar la base de datos en formato csv en la carpeta data. (Use el siguiente nombre Base_cleaned_WG(numero de grupo)180181# In[24]:182183184#El primer filtro propuesto considera la intersección y no la unión, dado que solo se emplea una variable. Es decir,185#Nos interesa conservar las osbervaciones que provengan de Ciudad del Cerro o Jauja o Acolla,...186junin = junin[(junin['District']=='CIUDAD DEL CERRO') | (junin['District']== 'JAUJA') | (junin['District']=='ACOLLA') | (junin['District']=='SAN GERÓNIMO') | (junin['District']=='TARMA') | (junin['District']=='CONCEPCIÓN') | (junin['District']=='OROYA')]187188189# In[25]:190191192junin193194195# In[27]:196197198#El segundo filtro requiere que descartemos las observaciones que muestran un cero tanto en nativos como en mestizos199junin = junin[(junin['natives']>=1) & (junin['mestizos']>=1)]200201202# In[28]:203204205junin206207208# In[37]:209210211#Aquí estamos definiendo un nuevo dataframe que contemple unicamente las columnas District y comunidad del anterior dataframe (también llamado junin)212junin = junin[['District', 'comunidad']]213214215# In[39]:216217218junin.to_csv("D:/Users/Usuario/Documents/GitHub/1ECO35_2022_2/data/Base_cleaned_WG2_python.csv")219#Exportamos el archivo en formato csv a la carpeta señalada220221222"""223EJERCICIO 2224225"""226227import random228229230#fijamos semilla231np.random.seed(123)232233# Creamos vector con 100 observaciones234v1 = np.random.rand(100)235236#Para crear mi matriz voy a empezar con un vector base237X = np.random.rand(100)238# Crearmos matriz en base a ese vector para que sea 100x50239X = X.reshape(-1, 1) ** np.arange(0, 50)240241242# Confirmamos el tamaño de la matriz243print(X)244print(X.shape) # con este comando confirmamos que nuestra matriz es 100x50245246247#Ya tengo mi matriz llamada X. Ahora, estandarizo la matriz con la función que me piden248#La funcion que me piden es la siguiente: (X - np.min(X)) / (np.max(X) - np.min(X))249#Con el comando apply_along_axis efectuo la funcion a cada COLUMNA(por ello, coloco 2 ) a mi matriz X250251X_Solution_1 = np.apply_along_axis(lambda X: (X - np.min(X)) / (np.max(X) - np.min(X)),0, X)252253254"""255EJERCICIO 3256257"""258# Definimos las funciones con los comandos especiales259260def tarea3(*args, **kwargs): #Mi función serà tarea3 y podrà tener varios argumentos y con kwargs defino las funcione sbu operaciones que tendrà261262print(type(args))263vec = np.array(list(args)) #primero mi variable tipo tuple la paso a lista y luego a vector para aplicar mi funcion264265if kwargs ['function'] == "stand" : #defino mi primera funcion con nombre stand266267resultado = (vec - np.mean(vec))/ np.std(vec) #cuando elija esta función se realizaran las operaciones presentadas para estandarizar268269elif kwargs ['function'] == "scalar": # mi segunda función será scalar270271resultado = (vec - np.min(vec)) / (np.max(vec) - np.min(vec)) #en esta parte presento las operaciones de mi función272273else: #si no se elije ninguna de las otras funciones saldráa el siguiente mensaje274raise ValueError( f"The function argument {kwargs[ 'function' ]} is not supported." )275276return resultado #define que me bote el resultado277278re1= tarea3( 11, 3, 6, 34, 82, function = "stand" ) #ejemplos de aplicación de mi función279re2= tarea3( 9, 2, 16, 17, 22, function = "scalar")280281v1= np.random.rand(10) #ahora utilizo un vector282tarea3(v1, function= "stand" )283284285286287288289290291292293294295296297