Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG5/Grupo_4_py.py
2714 views
1
2
###############################################################################
3
# #
4
# TAREA 5: Privatización de atributo y método #
5
# #
6
###############################################################################
7
8
#Empezamos por importar las librerías usadas para el ejercicio del WG4
9
10
import numpy as np
11
import pandas as pd
12
from pandas import DataFrame, Series
13
import statistics
14
import inspect
15
16
#Para poder usar la base de datos de R y configurar el username usamos lo siguiente
17
18
import pyreadr
19
import os
20
21
#%% PREGUNTA 1
22
23
24
#### Para esta pregunta usaremos la base de la clase creada para el WG 4, pero privatizando los atributos
25
26
#Primero setteamos el directorio
27
28
user = os.getlogin() # Username
29
30
31
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4")
32
33
cps2012_env = pyreadr.read_r("../data/cps2012.Rdata")
34
35
#Tenemos un dicionario del que extraeremos los datos de la llave data
36
37
cps2012_env
38
cps2012 = cps2012_env[ 'data' ]
39
dt = cps2012.describe()
40
41
# Creamos la clase
42
43
'''''''''
44
OLS class
45
'''''''''
46
47
####Privatizamos el atributo "x" de la clase, usando "__"
48
49
class OLS_G4:
50
51
52
def __init__(self, X,Y,W,Z):
53
54
self.__X = X
55
self.Y = Y
56
self.W = W
57
self.Z = Z
58
59
60
def coeficientes(self):
61
62
self.n = self.__X.shape[0] # numero de observaciones, # self.n "Se crea un nuevo atributo"
63
k = self.__X.shape[1]
64
X1 = np.column_stack((np.ones(self.n ), self.__X.to_numpy() )) # DataFrame to numpy
65
Y1 = self.Y.to_numpy().reshape(self.n ,1) #reshape(-1 ,1)
66
self.X1 = X1
67
self.Y1 = Y1
68
self.beta = np.linalg.inv(X1.T @ X1) @ ((X1.T) @ Y1 )
69
self.nk = self.n - k
70
self.Y_est = self.X1 @ self.beta
71
72
73
74
def estándar(self):
75
76
self.coeficientes()
77
78
y_est = self.X1 @ self.beta
79
sigma = sum(list( map( lambda x: x**2 , self.Y1 - y_est) )) / self.nk
80
Var1 = sigma*np.linalg.inv(self.X1.T @ self.X1)
81
self.Var1=Var1
82
self.sd1 = np.sqrt( np.diag(Var1) )
83
self.lower_bound1 = self.beta-1.96*self.sd1
84
self.upper_bound1 = self.beta+1.96*self.sd1
85
86
def robust(self):
87
88
self.coeficientes()
89
90
y_est = self.X1 @ self.beta
91
matrix_robust = np.diag(list( map( lambda x: x**2 , self.Y1 - y_est)))
92
Var2 = np.linalg.inv(self.X1.T @ self.X1) @ self.X1.T @ matrix_robust @ self.X1 @ np.linalg.inv(self.X1.T @ self.X1)
93
self.Var2=Var2
94
sd2 = np.sqrt( np.diag(Var2) )
95
self.sd2=sd2
96
lower_bound2 = self.beta-1.96*sd2
97
upper_bound2 = self.beta+1.96*sd2
98
99
def R2_RMSE(self):
100
101
self.coeficientes() # run function
102
103
y_est = self.X1 @ self.beta
104
error = self.Y1 - y_est
105
self.SCR = np.sum(np.square(error))
106
SCT = np.sum(np.square(self.Y1 - np.mean(self.Y1)))
107
self.R2 = 1 - self.SCR/SCT
108
self.rmse = (self.SCR/self.n)**0.5
109
110
111
112
####Privatizamos el método que da como output un objeto diccionario usando "__" antes del nombre del método
113
# NOTA: No se uso __slots__ ya que generaba errores con el código y bastó agregar "__" al nombre del método para privatizarlo, lo cual se demuestra en la línea 208
114
115
def __Table(self,**Kargs):
116
117
self.R2_RMSE()
118
self.robust
119
self.estándar()
120
self.coeficientes()
121
scr = self.SCR
122
sigma = scr / self.nk
123
Var = sigma*np.linalg.inv(self.X1.T @ self.X1)
124
sd = np.sqrt( np.diag(Var) )
125
t_est = np.absolute(self.beta/sd)
126
127
if (Kargs['Output'] == "DataFrame"):
128
129
df = pd.DataFrame( {"coeficientes": self.beta.flatten() , "error-estandar" : self.sd1.flatten(), "límite-superior": self.upper_bound1.flatten(), "límite-inferior": self.lower_bound1.flatten() } )
130
131
132
elif (Kargs['Output'] == "Diccionario"):
133
134
df = {"R^2": self.R2.flatten() ,"Root-MSE": self.rmse.flatten()}
135
136
137
return df
138
139
140
141
142
#flatten(): De multi array a simple array
143
cps2012.shape
144
145
variance_cols = cps2012.var().to_numpy() # to numpy
146
147
Dataset = cps2012.iloc[ : , np.where( variance_cols != 0 )[0] ]
148
149
150
#Definimos los atributos
151
152
X = Dataset.iloc[:,1:3]
153
154
Y = Dataset[['lnw']]
155
156
W=list(cps2012.columns)
157
158
Z=bool
159
160
161
162
Reg1 = OLS_G4(X,Y,W,Z)
163
164
#### Al correr la línea de abajo (línea 166), podemos comprobar que el atributo X está privatizado
165
166
Reg1.__X
167
168
169
#Obtenemos los betas
170
171
Reg1.coeficientes()
172
Reg1.beta
173
174
#Obtenemos la matriz de varianza y covarianza
175
Reg1.estándar()
176
Reg1.Var1
177
178
#Obtenemos los errores estándar
179
Reg1.estándar()
180
Reg1.sd1
181
182
#Obtenemos los intervalos de confianza
183
Reg1.estándar()
184
Reg1.upper_bound1
185
Reg1.lower_bound1
186
187
188
#Obtenemos el R2
189
190
Reg1.R2_RMSE()
191
Reg1.R2
192
193
#Obtenemos el root MSE
194
195
Reg1.R2_RMSE()
196
Reg1.rmse
197
198
199
#Obtenemos los coeficientes estimados, errores estándar e intervalos de confianza en un data frame
200
201
Reg1.__Table(Output = "DataFrame")
202
203
204
#Obtenemos el R2 y el root-MSE en un diccionario
205
206
#### Al correr la línea de abajo (línea 208) podemos observar que el método está privatizado
207
208
Reg1.__Table(Output = "Diccionario")
209
210
211
212
213
214