Skip to content

Commit aa59f13

Browse files
committed
Trabajando en función check_df
1 parent 889efed commit aa59f13

File tree

1 file changed

+73
-48
lines changed

1 file changed

+73
-48
lines changed

functions.py

Lines changed: 73 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -37,62 +37,87 @@ def df_info(df):
3737
s = buffer.getvalue()
3838
return s
3939

40+
41+
42+
class stdScaler(TransformerMixin, BaseEstimator):
43+
44+
def fit(self, X, y=None):
45+
self.means_ = X.mean(axis=0)
46+
self.std_dev_ = X.std(axis=0)
47+
return self
48+
49+
def transform(self, X, y=None):
50+
return (X - self.means_[:X.shape[1]]) / self.std_dev_[:X.shape[1]]
51+
52+
53+
54+
def OneHotEncode(original_df, feature_to_encode):
55+
encoded_cols = pd.get_dummies(original_df[feature_to_encode])
56+
res = pd.concat([original_df, encoded_cols], axis=1)
57+
res = res.drop([feature_to_encode], axis=1)
58+
return(res)
59+
4060
vars = ['FixationPointX_(MCSpx)','FixationPointY_(MCSpx)','Fixation','Saccade','Unclassified']
4161

42-
# class stdScaler(TransformerMixin, BaseEstimator):
43-
44-
# def fit(self, X, y=None):
45-
# self.means_ = X.mean(axis=0)
46-
# self.std_dev_ = X.std(axis=0)
47-
# return self
48-
49-
# def transform(self, X, y=None):
50-
# return (X - self.means_[:X.shape[1]]) / self.std_dev_[:X.shape[1]]
51-
52-
53-
54-
# La selección de escena debe estar aqui
55-
# esc = 6
56-
# X = df.loc[df['escena' + str(esc)] == 1]
57-
# def check_df(df_in):
58-
# # En primer lugar ajusta el nombre de las columnas a la forma requerida
59-
# df_in.rename(columns=lambda x: x.replace(" ", "_"), inplace=True)
60-
# cols = df_in.columns.tolist()
61-
62-
# # Compara los elementos de la lista de variables necesarias (vars) con las del archivo introducido (cols).
63-
# if set(vars).issubset(set(cols)):
64-
# if len(vars) == len(cols):
65-
# df = df_in
66-
# else:
67-
# message = 'Las variables del archivo de entrada no coinciden con las esperadas. Se eliminarán las no necesarias.'
68-
# st.info(message)
69-
# df = df_in.drop(columns=set(cols) - set(vars))
70-
# else:
71-
# st.error("El archivo introducido no tiene todas las variables necesarias.")
72-
# return False
73-
# #sys.exit()
74-
75-
# df.fillna(0, inplace=True)
62+
def check_df(df_in):
63+
# En primer lugar ajusta el nombre de las columnas a la forma requerida
64+
df_in.rename(columns=lambda x: x.replace(" ", "_"), inplace=True)
65+
cols = df_in.columns.tolist()
66+
67+
# Eliminar las finas en las que no existan datos para las variables indicadas
68+
# El resto de NaN se rellenará con 0
69+
df = df_in.dropna(subset=['GazePointIndex', 'StrictAverageGazePointX_(ADCSmm)', 'StrictAverageGazePointY_(ADCSmm)'])
70+
df = df.fillna(0)
7671

77-
# # Cálculo de los cuartiles y rango IQR
78-
# Q1 = df[vars].quantile(0.25)
79-
# Q3 = df[vars].quantile(0.75)
80-
# IQR = Q3 - Q1
72+
# Como necesidad para operaciones posteriores, se sustituyen las ',' por '.' y se convierte a tipo numérico
73+
for var in ['StrictAverageGazePointX_(ADCSmm)', 'StrictAverageGazePointY_(ADCSmm)']:
74+
df[var] = df[var].replace(',', '.', regex=True)
75+
df[var] = df[var].astype(float)
8176

82-
# # Límites superior e inferior para el cálculo de los outliers
83-
# k = 3
84-
# l_sup = Q3 + k*IQR
85-
# l_inf = Q1 - k*IQR
77+
# df = OneHotEncode(df, 'SceneName')
78+
df = OneHotEncode(df, 'GazeEventType')
79+
80+
# Cálculo de los cuartiles y rango IQR
81+
Q1 = df[vars].quantile(0.25)
82+
Q3 = df[vars].quantile(0.75)
83+
IQR = Q3 - Q1
84+
85+
# Límites superior e inferior para el cálculo de los outliers
86+
k = 3
87+
l_sup = Q3 + k*IQR
88+
l_inf = Q1 - k*IQR
89+
90+
# Se eliminan los outliers que se encuentren por encima del límite superior o por debajo del límite inferior
91+
df = df[~((df < l_inf) | (df > l_sup)).any(axis=1)]
92+
93+
# Escalado de las variables (estandarizado)
94+
stdscaler = stdScaler()
95+
df[['FixationPointX_(MCSpx)','FixationPointY_(MCSpx)']] = stdscaler.fit_transform(df[['FixationPointX_(MCSpx)','FixationPointY_(MCSpx)']])
96+
97+
# Sólo nos interesa la escena 6
98+
df = df.loc[df['SceneName']=='escena6']
8699

87-
# # Se eliminan los outliers que se encuentren por encima del límite superior o por debajo del límite inferior
88-
# fix_X = (encoded_train.loc[(encoded_train['FixationPointX_(MCSpx)'] >= l_sup['FixationPointX_(MCSpx)']) | (encoded_train['FixationPointX_(MCSpx)'] <= l_inf['FixationPointX_(MCSpx)'])])
89-
# limp_train = encoded_train[~((encoded_train < m_inf) | (encoded_train > m_sup)).any(axis=1)]
100+
# Separar X e Y, y eliminar columnas que no se necesitan
101+
102+
103+
# Compara los elementos de la lista de variables necesarias (vars) con las del archivo introducido (cols).
104+
if set(vars).issubset(set(cols)):
105+
if len(vars) == len(cols):
106+
df = df_in
107+
else:
108+
message = 'Las variables del archivo de entrada no coinciden con las esperadas. Se eliminarán las no necesarias.'
109+
st.info(message)
110+
df = df_in.drop(columns=set(cols) - set(vars))
111+
else:
112+
st.error("El archivo introducido no tiene todas las variables necesarias.")
113+
return False
114+
#sys.exit()
115+
116+
90117

91118

92-
# stdscaler = stdScaler()
93-
# df[vars] = stdscaler.fit_transform(df[vars])
94119

95-
# return df
120+
return df
96121

97122

98123
# Es necesario añadir esta función al cache para que no se ejecute la predicción cada vez que se actualiza la página.

0 commit comments

Comments
 (0)