Path: blob/main/Trabajo_grupal/WG3/Grupo_1_py.py
2714 views
#%% Grupo 1. Miembros del grupo:12# 20163197, Enrique Alfonso Pazos3# 20191894, Ilenia Ttito4# 20151595, Rodrigo Ramos5# 20193469, Luis Egusquiza6# 20163377, Jean Niño de Guzmán78#%% Pregunta 1910## 1.11112#Se importan las librerias necesarias para el código y se le da algunos alias (para facilitar el tipeo)13import numpy as np14import pandas as pd15import os16import random as rd1718#Se extrae el usuario para posteriormente pegarlo en el nuevo directorio de la base de datos y pueda correr a cualquier persona con acceso al repositorio del curso.19user = os.getlogin()20##Se setea un directorio para que se cargue la base de datos desde el repositorio del curso y se utilice el usuario de la PC en donde se corra el código.21os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data")2223#Se indica que se extraiga la base de datos "Region_Junin"24data = pd.read_excel("../data/Region_Junin.xlsx")2526#NOMBRES DE VARIABLES27#Se crea una lista con los nombres de los valores del dataframe28#Se indica que se impriman los nombres de las variables de cada columna29a = data.columns.values30print(a)3132## 1.23334#TIPOS DE LAS VARIABLES35#Se indinca que se impriman los tipos de cada variable.36print(data.dtypes)3738#ESTADISTICAS39#Se crea la matriz con las estadisticas de cada variable (se indica esto con el all)40stats = data.describe(include = 'all')41print(stats)424344## 1.34546# Para detectar qué valores son Nan aplicamos .isnull o .isna47null = data.isnull()48# Imprime true cuando hay missing values49null5051# Para contar el número de missing values, tanto de filas como columnas52data1 = data.isnull().sum().sum()53# Imprimimos el resultado de sumar los Nan54print(data1)5556# Borramos todas las filas o columnas con missing values57# Utilizamos inplace=True para que los valores se guarden en la base de datos original58data.dropna(inplace=True)5960# Corroboramos que ya no hay más missing values61data.isnull().sum().sum()626364## 1.46566# Renombramos los nombres de las variables solicitadas67# Guardamos los cambios en la base de datos original con inplace=True68data.rename(columns={'Place': 'comunidad', 'men_not_read':'homxlee', 'women_not_read':'mujerxlee', 'total_not_read':'totalxlee'}, inplace=True)69data707172## 1.57374# Se muestra los valores únicos de las 2 variables solicitadas75# Valores únicos de la var. 'comunidad'76# Referenciamos a la última base de datos modificada: 'data'77print(data.comunidad.unique())7879# Valores únicos de la var. 'District'80# Referenciamos a la última base de datos modificada: 'data'81print(data.District.unique())8283## 1.68485#Crear porcentajes solicitados, usando las variables del dataframe86porct_mujxlee = (data.mujerxlee)/(data.totalxlee)87porct_mujxlee =pd.DataFrame(porct_mujxlee)8889porct_hmxlee = (data.homxlee)/(data.totalxlee)90porct_hmxlee =pd.DataFrame(porct_hmxlee)9192total_pob = (data.peruvian_men)+(data.peruvian_women)+(data.foreign_men)+(data.foreign_women)93porct_nativos = (data.natives)/total_pob94porct_hmxlee =pd.DataFrame(porct_nativos)9596# Añadimos las nuevas variabes a la base de datos97data= pd.concat([data,porct_mujxlee,porct_hmxlee,porct_nativos], axis=1)98print(data)99100## 1.7101102#a, Filtro solamente de acuerdo a esos valores, que he colocado en la lista Distritos.103Distritos = ["CIUDAD DEL CERRO","JAUJA", "ACOLLA", "SAN GERÓNIMO", "TARMA", "OROYA", "CONCEPCIÓN"]104Pregunta_7_a = data.loc[data["District"].isin(Distritos)]105106#b, Solo quedarme con aquellas observaciones, cuyas variables mestizo y nativos toma un valor estrictamente mayor a 0.107Pregunta_7_b = Pregunta_7_a[(Pregunta_7_a["natives"] > 0) & (Pregunta_7_a["mestizos"] > 0)]108109#c, Solo quedarme con las columnas distrito y comunidad110Pregunta_7_c = Pregunta_7_b[["District", "comunidad"]]111112#d, exportar en excel113Pregunta_7_c.to_excel(r'../data/Base_cleaned_WG3.xlsx', index = False, header = True)114115116#%% PREGUNTA 2117118# Primero, crearé una matriz de 100 filas y 50 columnas. También, crearé un vector de 100 columnas.119def hacer_matriz (m, n):120# M: # de filas121# N: # de columnas122vacio = np.zeros(0)123numero_iteraciones = np.arange(m)124for i in numero_iteraciones:125filas = np.random.rand(n)126vacio = np.append(vacio, [filas])127vacio = vacio.reshape(m,n)128return vacio129130M = hacer_matriz(100, 50)131N = np.random.rand(100)132133# La función para los vectores:134# list() nos da la forma final de "fila" (aunque en realidad es un narray).135# Aplicamos la función .min() y .max() para obetener el máximo y mínimo valor de todo el vector.136# Definimos estos valores previamente en los parámetros a y b.137# Luego, pasamos a hacer la reescalación, que es el objetivo de nuestra función lambda.138139vector_reescalado = list(map(lambda x, a = np.min(N), b = np.max(N): (x - a)/(b - a), N))140vector_reescalado141142# Por otro lado, no sería conveniente aplicar list con las matrices porque ocurre el problema que el output se presenta de tal manera que cada observación de la lista es literalmente un vector fila completo.143# La función para la matriz:144145matriz_reescalada = np.apply_along_axis(lambda x, a = np.min(M, axis=0), b = np.max(M, axis=0): (x - a)/(b - a), 1, M)146matriz_reescalada147148# Con los axis = 0, dentro de np.min() y np.max(), me da el valor mínimo y máximo de cada columna.149# Con el parámetro "1" de apply_along_axis, creo que haría que la función se itere por fila.150# En todo caso, solo le pongo el valor"1" como criterio porque funciona, pues, de lo contrario,151# si le pusiero "0" como parámetro de apply_along_axis, es como si generara conflicto y presenta error.152153""" OJO:154Una observación interesante es que si se usa como parámetro al 0 esperando que coja las columnas, en realidad,155estaría haciendo la reescalación con los valores máximos y mínimos de cada fila.156La forma a la que me refiero sería esta: np.apply_along_axis(lambda x, a = np.min(N), b = np.max(N): (x - a)/(b - a), 0, N)157158En el caso de poner un 1, obtenemos el mismo resultado. Estaría cogiendo por filas.159La forma a la que me refiero sería esta: np.apply_along_axis(lambda x, a = np.min(N), b = np.max(N): (x - a)/(b - a), 1, N)160"""161# Sobre esta observación, podríamos hacer la prueba a una escala pequeña.162# Mantenmos la misma estructura de la función anterior, y aplicamos a una matriz 2x3: [ [1, 2, 3], [4, 5, 6] ]163# Claramente, deberíamos esperar que el resultado sea: [[0., 0., 0.], [1., 1., 1.]]164prueba_matriz = np.array( [ [1, 2, 3], [4, 5, 6] ] )165prueba_reescalada = np.apply_along_axis(lambda x, a = np.min(prueba_matriz, axis=0), b = np.max(prueba_matriz, axis=0): (x - a)/(b - a), 1, prueba_matriz )166167# Como se observa, el output es el correcto.168169170#%% PREGUNTA 3171172# Creación de lista con los valores aleatorios a insertar en el Vector173# De 0 a 500 es el rango de valores, 100 es la cantidad de datos174b = rd.sample(range(0,500),100)175# Se ordenan los datos de a lista de menor a mayor con el comando sort().176b.sort()177178# Creación del vector a partir de la lista179a = np.array(b)180print('Vector =', a)181182# Reescalar y estandarizar183# Definimos la función que va depender de los argumentos de args y kwargs184def funcion( *args, **kwargs):185186# Se ponen condicionales para determinar si se escala o estandariza la el vector.187if (kwargs[ 'funcion' ] == "escalar"):188vector = np.array(list(args))189for numero in vector:190191# Cuando se quiera escalar el vector se tomaran los valores del vector aleatorio y se aplicara la función correspondiente del escalado192print('Escalar =',(numero - np.min(vector))/(np.max(vector) - np.min(vector)))193194elif (kwargs[ 'funcion' ] == "estandarizar"):195vector = np.array(list(args))196for numero in vector:197198# Cuando se quiera estandarizar la función se tomaran los valores del vector aleatorio y se aplicará la función correspondiente de la estandarización199print('Estandizado =',(numero - np.mean(vector))/np.std(vector))200201# Verificación202# El primer argumento hace referencia al *args y el segundo argumento hace referencia al **kwargs203funcion(a, funcion = "escalar")204funcion(a, funcion = "estandarizar")205206207208209210