Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG3/Grupo_1_py.py
2714 views
1
#%% Grupo 1. Miembros del grupo:
2
3
# 20163197, Enrique Alfonso Pazos
4
# 20191894, Ilenia Ttito
5
# 20151595, Rodrigo Ramos
6
# 20193469, Luis Egusquiza
7
# 20163377, Jean Niño de Guzmán
8
9
#%% Pregunta 1
10
11
## 1.1
12
13
#Se importan las librerias necesarias para el código y se le da algunos alias (para facilitar el tipeo)
14
import numpy as np
15
import pandas as pd
16
import os
17
import random as rd
18
19
#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.
20
user = os.getlogin()
21
##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.
22
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data")
23
24
#Se indica que se extraiga la base de datos "Region_Junin"
25
data = pd.read_excel("../data/Region_Junin.xlsx")
26
27
#NOMBRES DE VARIABLES
28
#Se crea una lista con los nombres de los valores del dataframe
29
#Se indica que se impriman los nombres de las variables de cada columna
30
a = data.columns.values
31
print(a)
32
33
## 1.2
34
35
#TIPOS DE LAS VARIABLES
36
#Se indinca que se impriman los tipos de cada variable.
37
print(data.dtypes)
38
39
#ESTADISTICAS
40
#Se crea la matriz con las estadisticas de cada variable (se indica esto con el all)
41
stats = data.describe(include = 'all')
42
print(stats)
43
44
45
## 1.3
46
47
# Para detectar qué valores son Nan aplicamos .isnull o .isna
48
null = data.isnull()
49
# Imprime true cuando hay missing values
50
null
51
52
# Para contar el número de missing values, tanto de filas como columnas
53
data1 = data.isnull().sum().sum()
54
# Imprimimos el resultado de sumar los Nan
55
print(data1)
56
57
# Borramos todas las filas o columnas con missing values
58
# Utilizamos inplace=True para que los valores se guarden en la base de datos original
59
data.dropna(inplace=True)
60
61
# Corroboramos que ya no hay más missing values
62
data.isnull().sum().sum()
63
64
65
## 1.4
66
67
# Renombramos los nombres de las variables solicitadas
68
# Guardamos los cambios en la base de datos original con inplace=True
69
data.rename(columns={'Place': 'comunidad', 'men_not_read':'homxlee', 'women_not_read':'mujerxlee', 'total_not_read':'totalxlee'}, inplace=True)
70
data
71
72
73
## 1.5
74
75
# Se muestra los valores únicos de las 2 variables solicitadas
76
# Valores únicos de la var. 'comunidad'
77
# Referenciamos a la última base de datos modificada: 'data'
78
print(data.comunidad.unique())
79
80
# Valores únicos de la var. 'District'
81
# Referenciamos a la última base de datos modificada: 'data'
82
print(data.District.unique())
83
84
## 1.6
85
86
#Crear porcentajes solicitados, usando las variables del dataframe
87
porct_mujxlee = (data.mujerxlee)/(data.totalxlee)
88
porct_mujxlee =pd.DataFrame(porct_mujxlee)
89
90
porct_hmxlee = (data.homxlee)/(data.totalxlee)
91
porct_hmxlee =pd.DataFrame(porct_hmxlee)
92
93
total_pob = (data.peruvian_men)+(data.peruvian_women)+(data.foreign_men)+(data.foreign_women)
94
porct_nativos = (data.natives)/total_pob
95
porct_hmxlee =pd.DataFrame(porct_nativos)
96
97
# Añadimos las nuevas variabes a la base de datos
98
data= pd.concat([data,porct_mujxlee,porct_hmxlee,porct_nativos], axis=1)
99
print(data)
100
101
## 1.7
102
103
#a, Filtro solamente de acuerdo a esos valores, que he colocado en la lista Distritos.
104
Distritos = ["CIUDAD DEL CERRO","JAUJA", "ACOLLA", "SAN GERÓNIMO", "TARMA", "OROYA", "CONCEPCIÓN"]
105
Pregunta_7_a = data.loc[data["District"].isin(Distritos)]
106
107
#b, Solo quedarme con aquellas observaciones, cuyas variables mestizo y nativos toma un valor estrictamente mayor a 0.
108
Pregunta_7_b = Pregunta_7_a[(Pregunta_7_a["natives"] > 0) & (Pregunta_7_a["mestizos"] > 0)]
109
110
#c, Solo quedarme con las columnas distrito y comunidad
111
Pregunta_7_c = Pregunta_7_b[["District", "comunidad"]]
112
113
#d, exportar en excel
114
Pregunta_7_c.to_excel(r'../data/Base_cleaned_WG3.xlsx', index = False, header = True)
115
116
117
#%% PREGUNTA 2
118
119
# Primero, crearé una matriz de 100 filas y 50 columnas. También, crearé un vector de 100 columnas.
120
def hacer_matriz (m, n):
121
# M: # de filas
122
# N: # de columnas
123
vacio = np.zeros(0)
124
numero_iteraciones = np.arange(m)
125
for i in numero_iteraciones:
126
filas = np.random.rand(n)
127
vacio = np.append(vacio, [filas])
128
vacio = vacio.reshape(m,n)
129
return vacio
130
131
M = hacer_matriz(100, 50)
132
N = np.random.rand(100)
133
134
# La función para los vectores:
135
# list() nos da la forma final de "fila" (aunque en realidad es un narray).
136
# Aplicamos la función .min() y .max() para obetener el máximo y mínimo valor de todo el vector.
137
# Definimos estos valores previamente en los parámetros a y b.
138
# Luego, pasamos a hacer la reescalación, que es el objetivo de nuestra función lambda.
139
140
vector_reescalado = list(map(lambda x, a = np.min(N), b = np.max(N): (x - a)/(b - a), N))
141
vector_reescalado
142
143
# 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.
144
# La función para la matriz:
145
146
matriz_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)
147
matriz_reescalada
148
149
# Con los axis = 0, dentro de np.min() y np.max(), me da el valor mínimo y máximo de cada columna.
150
# Con el parámetro "1" de apply_along_axis, creo que haría que la función se itere por fila.
151
# En todo caso, solo le pongo el valor"1" como criterio porque funciona, pues, de lo contrario,
152
# si le pusiero "0" como parámetro de apply_along_axis, es como si generara conflicto y presenta error.
153
154
""" OJO:
155
Una observación interesante es que si se usa como parámetro al 0 esperando que coja las columnas, en realidad,
156
estaría haciendo la reescalación con los valores máximos y mínimos de cada fila.
157
La 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)
158
159
En el caso de poner un 1, obtenemos el mismo resultado. Estaría cogiendo por filas.
160
La 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)
161
"""
162
# Sobre esta observación, podríamos hacer la prueba a una escala pequeña.
163
# Mantenmos la misma estructura de la función anterior, y aplicamos a una matriz 2x3: [ [1, 2, 3], [4, 5, 6] ]
164
# Claramente, deberíamos esperar que el resultado sea: [[0., 0., 0.], [1., 1., 1.]]
165
prueba_matriz = np.array( [ [1, 2, 3], [4, 5, 6] ] )
166
prueba_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 )
167
168
# Como se observa, el output es el correcto.
169
170
171
#%% PREGUNTA 3
172
173
# Creación de lista con los valores aleatorios a insertar en el Vector
174
# De 0 a 500 es el rango de valores, 100 es la cantidad de datos
175
b = rd.sample(range(0,500),100)
176
# Se ordenan los datos de a lista de menor a mayor con el comando sort().
177
b.sort()
178
179
# Creación del vector a partir de la lista
180
a = np.array(b)
181
print('Vector =', a)
182
183
# Reescalar y estandarizar
184
# Definimos la función que va depender de los argumentos de args y kwargs
185
def funcion( *args, **kwargs):
186
187
# Se ponen condicionales para determinar si se escala o estandariza la el vector.
188
if (kwargs[ 'funcion' ] == "escalar"):
189
vector = np.array(list(args))
190
for numero in vector:
191
192
# Cuando se quiera escalar el vector se tomaran los valores del vector aleatorio y se aplicara la función correspondiente del escalado
193
print('Escalar =',(numero - np.min(vector))/(np.max(vector) - np.min(vector)))
194
195
elif (kwargs[ 'funcion' ] == "estandarizar"):
196
vector = np.array(list(args))
197
for numero in vector:
198
199
# Cuando se quiera estandarizar la función se tomaran los valores del vector aleatorio y se aplicará la función correspondiente de la estandarización
200
print('Estandizado =',(numero - np.mean(vector))/np.std(vector))
201
202
# Verificación
203
# El primer argumento hace referencia al *args y el segundo argumento hace referencia al **kwargs
204
funcion(a, funcion = "escalar")
205
funcion(a, funcion = "estandarizar")
206
207
208
209
210