Path: blob/main/Trabajo_grupal/WG5/Grupo 3_py_ejercicio 1.py
2714 views
#!/usr/bin/env python1# coding: utf-823# In[1]:456# En caso el lector no cuente con el pyreadr, puedes instalarlo de la siguiente manera789# In[2]:101112pip install pyreadr131415# In[8]:161718#Antes de empezar, tenemos que primero importar las librerias de las cuales haremos uso, entre ellas están pandas, os, pyreadr , scipy.stats y numpy192021# In[9]:222324import numpy as np25import os26import pyreadr27import pandas as pd28import scipy.stats as stats29from scipy.stats import t303132# In[15]:333435class OLS_Grupo3 (object)363738# In[11]:394041def __init__( self, X:pd.Dataframe, y:pd.Series, lista, RobustStandardError = True):424344# In[ ]:454647#Si en caso nos sale error, utilizamos los siguientes códigos:484950# In[ ]:515253if not isinstance( X, pd.Dataframe ) :54raise TypeError ( 'X debería ser un pd.Dataframe')5556if not isinstance( y, pd.Series ) :57raise TypeError('y debería ser una pd.Series')585960# **Entonces, para privatizar los atributos, le anteponemos un guión al self.X:**6162# In[ ]:636465self._X = X.loc[:, lista]6667self._X = X.iloc[:, lista]68self.y = y6970self.RobustStandardError = RobustStandardError7172self._X[ 'intercepto' ] = 17374cols = self._X.columns.tolist()7576new_cols_orders = [cols[ -1 ]] + cols[ 0:-1]777879# In[ ]:808182#Se hace uso de .loc para poder filtrar por nombres:8384self._X = self._X.loc[ :, new_cols_orders ]8586#Creación de nuevos atributos:8788#Si queremos pasar de un dataframe a un multi array, usamos:8990self._X_np = self._X.values9192#Si queremos pasar de un objeto serie a un array, usamos:9394self.y_np = y.values.reshape( -1 , 1 )9596#Posteriormente, usamos:9798self.columns = self._X.columns.tolist()99100self.n = self._X.shape[0]101102k = self._X.shape[1]103104self.nk = self.n - k105106107# **Empezamos a privatizar los métodos:**108109# In[17]:110111112#Método 1: Un método debe estimar los coeficientes de la regresión113114def OLS_BETA_Grupo3( self ):115116X_np = self._X_np117y_np = self.y_np118119beta_ols = np.Linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )120121index_names = self.columns122123beta_OLS_output = pd.DataFrame( beta_ols, index = index_names, columns = [ 'Coef.'] )124125self.beta_OLS - beta_OLS_output126127return beta_OLS_output128129130# In[ ]:131132133#Método 3: Un método que halle la matriz de varianza y covarianza robusta, los errores estándar de cada coeficiente, e intervalos de confianza.134135def M_ROBUST_COV(self):136137self.beta_OLS_Grupo3()138139#Haremos uso de atributos que ya se han mencionado anteriormente:140141X_np = self._X_np142y_np = self.y_np143144#El cálculo de la varianza robusta es el siguiente:145146self.y_est = X_np @ self.beta_OLS147148matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))149150self.robust_var = np.linalg.inv(X_np.T @ X) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)151152153# In[ ]:154155156#Método 4: Un método que halle el R2, root MSE (mean square error)157158#Los pasos para hallar el R2 son los siguientes:159160def R2(self):161162self.coeficientes()163y_est = self.X1 @ self.beta164error = self.Y1 - y_est165self.SCR = np.sum(np.square(error))166SCT = np.sum(np.square(self.Y1 - np.mean(self.Y1)))167R2 = 1 - self.SCR/SCT168169return R2170171#Los pasos para hallar el root MSE son los siguientes:172173#Hay un paquete que nos permite encontrar el root MSE, por tanto, hacemos uso de él de la siguiente forma:174175from sklearn.metrics import mean_squared_error176177def rootMSE(true,predicted):178179rootMSE = mean_squared_error(true,predicted, squared=False)180181return rootMSE182183184# **Para terminar de privatizar un método, se tiene que hacer uso de la instancia _slot_**185186# In[18]:187188189class RegClass: Ols_Grupo3190191# A continuación colocamos la instancia __slot__ con todos los atributos que hemos creado para nuestra clase192193__slots__ = [ '__X', 'y', 'intercept', 'X_np', 'y_np', 'columns', 'beta_OLS']194195def __init__( self, X : pd.DataFrame , y : pd.Series , intercept = True ):196197self.__X = X198self.y = y199self.intercetp = intercet200201202203