Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG3/Grupo_2_py_WG3.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""
3
Created on Sat Sep 17 19:16:16 2022
4
5
@author: MSI
6
"""
7
8
"""
9
EJERCICIO 1
10
11
"""
12
#Importamos
13
import numpy as np
14
import pandas as pd
15
import os
16
from pandas import DataFrame,Series
17
18
19
# In[5]:
20
21
22
pip install openpyxl
23
24
25
# In[3]:
26
27
28
junin = pd.read_excel("D:/Users/Usuario/Documents/GitHub/1ECO35_2022_2/data/Region_Junin.xlsx")
29
#Primero importamos la base de datos, reconiciendo el formato (excel)
30
junin
31
32
33
# 1. Obtener el nombre de todas las variables
34
35
# In[4]:
36
37
38
#Veremos el nombre de cada variable (columna) y el tipo a que corresponde
39
junin.info()
40
#este comando también nos permite identifcar el número de variables por tipo
41
#dtypes: float64(24), int64(15), object(3)
42
#Lo que significa que la mayor parte de nuestras observaciones son numéricas 39 (=24+15) y sólo tres son objetos
43
44
45
# 2. Mostrar el tipo de variables (type) así como presentar los principales estadísticos.
46
47
# In[5]:
48
49
50
#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)
51
junin.describe()
52
53
54
# In[6]:
55
56
57
#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 describe
58
junin.describe(include='O')
59
60
61
# In[7]:
62
63
64
junin.describe(include='all') #el argumento include también nos permite generar una tabla con todo tipo de variable (sea object o numérica)
65
66
67
# 3. Verifique si las columnas presentan missing values
68
69
# In[8]:
70
71
72
#Pedimos un listado de las columnas que tienen al menos un missing value
73
[col for col in junin.columns if junin[col].isnull().any()]
74
75
76
# In[12]:
77
78
79
#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 brevemente
80
#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 observaciones
81
#Además, especifica el tipo de variable
82
def missing_table(df):
83
zero_val = (df == 0.00).astype(int).sum(axis=0)
84
mis_val = df.isnull().sum()
85
mis_val_percent = 100 * df.isnull().sum() / len(df)
86
mz_table = pd.concat([zero_val, mis_val, mis_val_percent], axis=1)
87
mz_table = mz_table.rename(
88
columns = {0 : 'Zero Values', 1 : 'Missing Values', 2 : '% of Total Values'})
89
mz_table['Total Zero Missing Values'] = mz_table['Zero Values'] + mz_table['Missing Values']
90
mz_table['% Total Zero Missing Values'] = 100 * mz_table['Total Zero Missing Values'] / len(df)
91
mz_table['Data Type'] = df.dtypes
92
mz_table = mz_table[
93
mz_table.iloc[:,1] != 0].sort_values(
94
'% of Total Values', ascending=False).round(1)
95
print ("Tu dataframe tiene " + str(df.shape[1]) + " columnas y " + str(df.shape[0]) + " filas.\n"
96
"Hay " + str(mz_table.shape[0]) +
97
" columnas que tienen valores missing.")
98
# mz_table.to_excel('D:/sampledata/missing_and_zero_values.xlsx', freeze_panes=(1,0), index = False)
99
return mz_table
100
101
missing_table(junin)
102
103
104
# 4. Cambie el nombre de las siguientes variables:
105
# * place : comunidad
106
# * men_not_read: homxlee
107
# * women_not_read: mujerxlee
108
# * total_not_read: totalxlee
109
#
110
111
# In[13]:
112
113
114
#Hay distintas alternativas para modificar el nombre de columnas, nosotros optamos por usar la función rename. De esta forma
115
#sólo debemos especificar los nuevos nombres de las variables relacionándolos con los nombres originales
116
junin.rename(columns = {'Place':'comunidad', 'men_not_read':'homxlee', 'women_not_read':'mujerxlee', 'total_not_read':'totalxlee'}, inplace = True)
117
junin.head(2)
118
119
120
# In[15]:
121
122
123
#De paso, modificaremos el nombre de la primera columna
124
junin.rename(columns = {'Unnamed: 0':'ID'}, inplace = True)
125
junin.head(2)
126
127
128
# In[16]:
129
130
131
junin.head(1)
132
133
134
# 5. Muestre los valores únicos de las siguientes variables ( comunidad , District)
135
136
# In[17]:
137
138
139
print(junin.comunidad.unique())
140
#Aquí empleamos la función unique, esta recoge los valores únicos de la variable especificada (en este caso fue comunidad)
141
142
143
# In[30]:
144
145
146
#Hacemos lo propio con la variable District
147
print(junin.District.unique())
148
149
150
# 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)
151
152
# In[21]:
153
154
155
junin["w_nowrite_noread"] = round(junin["mujerxlee"] / junin["totalxlee"], 2)
156
#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 coma
157
junin
158
159
160
# In[19]:
161
162
163
junin["population"]= junin["peruvian_men"] + junin["peruvian_women"] + junin["foreign_men"] + junin["foreign_women"]
164
#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 hombres
165
166
167
# In[20]:
168
169
170
#Luego, el % de nativos respecto al total de la población es simplemente una división de las variables natives y population
171
junin["percent_natives"] = round(junin["natives"] / junin["population"], 2)
172
junin
173
174
175
# 7. Crear una base de datos con la siguiente información:
176
#
177
# * Quedarse con la información de los distritos de Ciudad del Cerro, Jauja, Acolla, San Gerónimo, Tarma, Oroya y Concepción
178
# * Luego quedarse con las comunidades que cuentan con nativos y mestizos.
179
# * Solo quedarse con las variables trabajadas en el punto 6), nombre de distrito y comunidad.
180
# * Guardar la base de datos en formato csv en la carpeta data. (Use el siguiente nombre Base_cleaned_WG(numero de grupo)
181
182
# In[24]:
183
184
185
#El primer filtro propuesto considera la intersección y no la unión, dado que solo se emplea una variable. Es decir,
186
#Nos interesa conservar las osbervaciones que provengan de Ciudad del Cerro o Jauja o Acolla,...
187
junin = 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')]
188
189
190
# In[25]:
191
192
193
junin
194
195
196
# In[27]:
197
198
199
#El segundo filtro requiere que descartemos las observaciones que muestran un cero tanto en nativos como en mestizos
200
junin = junin[(junin['natives']>=1) & (junin['mestizos']>=1)]
201
202
203
# In[28]:
204
205
206
junin
207
208
209
# In[37]:
210
211
212
#Aquí estamos definiendo un nuevo dataframe que contemple unicamente las columnas District y comunidad del anterior dataframe (también llamado junin)
213
junin = junin[['District', 'comunidad']]
214
215
216
# In[39]:
217
218
219
junin.to_csv("D:/Users/Usuario/Documents/GitHub/1ECO35_2022_2/data/Base_cleaned_WG2_python.csv")
220
#Exportamos el archivo en formato csv a la carpeta señalada
221
222
223
"""
224
EJERCICIO 2
225
226
"""
227
228
import random
229
230
231
#fijamos semilla
232
np.random.seed(123)
233
234
# Creamos vector con 100 observaciones
235
v1 = np.random.rand(100)
236
237
#Para crear mi matriz voy a empezar con un vector base
238
X = np.random.rand(100)
239
# Crearmos matriz en base a ese vector para que sea 100x50
240
X = X.reshape(-1, 1) ** np.arange(0, 50)
241
242
243
# Confirmamos el tamaño de la matriz
244
print(X)
245
print(X.shape) # con este comando confirmamos que nuestra matriz es 100x50
246
247
248
#Ya tengo mi matriz llamada X. Ahora, estandarizo la matriz con la función que me piden
249
#La funcion que me piden es la siguiente: (X - np.min(X)) / (np.max(X) - np.min(X))
250
#Con el comando apply_along_axis efectuo la funcion a cada COLUMNA(por ello, coloco 2 ) a mi matriz X
251
252
X_Solution_1 = np.apply_along_axis(lambda X: (X - np.min(X)) / (np.max(X) - np.min(X)),0, X)
253
254
255
"""
256
EJERCICIO 3
257
258
"""
259
# Definimos las funciones con los comandos especiales
260
261
def tarea3(*args, **kwargs): #Mi función serà tarea3 y podrà tener varios argumentos y con kwargs defino las funcione sbu operaciones que tendrà
262
263
print(type(args))
264
vec = np.array(list(args)) #primero mi variable tipo tuple la paso a lista y luego a vector para aplicar mi funcion
265
266
if kwargs ['function'] == "stand" : #defino mi primera funcion con nombre stand
267
268
resultado = (vec - np.mean(vec))/ np.std(vec) #cuando elija esta función se realizaran las operaciones presentadas para estandarizar
269
270
elif kwargs ['function'] == "scalar": # mi segunda función será scalar
271
272
resultado = (vec - np.min(vec)) / (np.max(vec) - np.min(vec)) #en esta parte presento las operaciones de mi función
273
274
else: #si no se elije ninguna de las otras funciones saldráa el siguiente mensaje
275
raise ValueError( f"The function argument {kwargs[ 'function' ]} is not supported." )
276
277
return resultado #define que me bote el resultado
278
279
re1= tarea3( 11, 3, 6, 34, 82, function = "stand" ) #ejemplos de aplicación de mi función
280
re2= tarea3( 9, 2, 16, 17, 22, function = "scalar")
281
282
v1= np.random.rand(10) #ahora utilizo un vector
283
tarea3(v1, function= "stand" )
284
285
286
287
288
289
290
291
292
293
294
295
296
297