No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Tabulaci贸n de valores faltantes

6/21
Recursos

Aportes 21

Preguntas 6

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Me sucedi贸 que al ejecutar los m茅todos de tabulaci贸n como:

df.missing.missing_variable_table()
df.missing.missing_case_table()

Me devolv铆a un error porque no encontraba la variable 鈥渘_variables鈥
.
Esto ocurre porque en el m茅todo escrito de pandas-missing-extension, que es esta para missing_variable_table():

    def missing_variable_table(self) -> pd.DataFrame:
        return (
            self._obj.missing.missing_variable_summary()
            .value_counts("n_missing")
            .reset_index()
            .rename(columns={"n_missing": "n_missing_in_variable", 0: "n_variables"})
            .assign(
                pct_variables=lambda df: df.n_variables / df.n_variables.sum() * 100
            )
            .sort_values("pct_variables", ascending=False)
        )

Durante value_counts, se genera una columna llamada 鈥渃ount鈥 y no 鈥0鈥, entonces rename no consigue renombrarla a 鈥渘_variables鈥 y en consecuencia assign no la encuentra.
Para corregir esto desde la funci贸n reset_index se puede asignar name=鈥渘_variables鈥 y eso ser铆a m谩s universal. Aqu铆 estar铆a el c贸digo modificado para que se ejecute correctamente:

    def missing_variable_table(self) -> pd.DataFrame:
        return (
            self._obj.missing.missing_variable_summary()
            .value_counts("n_missing")
            .reset_index(name="n_variables")
            .rename(columns={"n_missing": "n_missing_in_variable"})
            .assign(
                pct_variables=lambda df: df.n_variables / df.n_variables.sum() * 100
            )
            .sort_values("pct_variables", ascending=False)
        ) 

Tabulacion de Valores Faltantes

Tabular es expresar valores, magnitudes u otros datos por medio de tablas.

  • Siempre empieza los analisis con preguntas simples, que lleven a un numero:
    • cuantos valores deberian existir en el conjunto de datos?
  • Construir resumenes por variables y observaciones:
    • Cuantos valores faltantes existen por cada variable?
    • 驴Cuantas variables tiene X numero de valores faltantes?
    • 驴Cuantas observaciones tiene X numero de valores faltantes?
    • Cuenta los registros con datos faltantes
  • Salir de la caja y hacer mas preguntas
    • 驴Cuantos valores faltantes tengo en una variable cada X pasos? para el caso de trabajar con series de tiempo
    • 驴Cual es la racha de valores completos y faltantes en una variable?

Analisis de Valores Faltantes en el DataFrame riskfactors

  • Mostrar los valores faltantes en el dataframe de manera general
riskfactors_df.isna()
  • Fila y columnas del dataFrame
riskfactors_df.shape
--> (245, 34)  #245 registros, 34 variables

En lo que sigue, utilizamos las funciones creadas para extender la funcionalidad de pandas

  • Numero de valores completos en el DataFrame
riskfactors_df.missing.number_complete()
--> 7144
  • Numero de valores faltantes en el dataframe
riskfactors_df.missing.number_missing()
--> 1186

Resumenes Tabulares de Valores Faltantes

  • Resumen por variable
riskfactors_df.missing.missing_variable_summary()
# missing_variable_summary() indica un resumen en cuanto a los datos
# faltantes por variable. Muestra el N掳 de datos faltantes, el N掳 de registros 
# y el porcentaje de datos faltantes que representa en el dataframe
  • Tabulacion del resumen por variable
riskfactors_df.missing.missing_variable_table()
# missing_variable_table() muestra una tabla con el N掳 de datos faltantes, 
# el N掳 de variables que contienen esos datos faltantes y el % que representa
# esa cantidad de variables respecto al total
  • Resumen por caso
riskfactors_df.missing.missing_case_summary()
# missing_case_summary() muestra todos los registros junto al N掳 de variables con datos 
# faltantes y el % de esas variables que representa respecto al total 
  • Tabulacion del resumen por caso
riskfactors_df.missing.missing_case_table()
# missing_case_table() muestra una tabla con el N掳 de datos faltantes, la cantidad
# de registros que contienen ese N掳 de datos faltantes y e % de registros que 
# representan respecto al total de registros

Intervalos de Valores Faltantes

  • Numero de valores faltantes por cada 50 registros para la variable 鈥榳eight_lbs鈥
riskfactors_df.missing.missing_variable_span(variable='weight_lbs',span_every=50)
# missing_variable_span() muestra el resumen de datos faltantes, datos completos,
# % de datos faltantes y % de datos completos por bloques de registros

  • En caso de trabajar con una serie de tiempo nos interesa saber en que punto o tiempo, alguna variable en particular muestra un comportamiento atipico. La siguiente funcion muestra el N掳 de registros consecutivos que estan completos seguido del N掳 de registros consecutivos que tienen datos faltantes
riskfactors_df.missing.missing_variable_run(variable='weight_lbs')

Es importante aclarar que el 3 de abril de 2023 se lanz贸 una nueva versi贸n de la API de Pandas (la 2.0.0). Entonces algunas funciones del cuaderno de pandas-missing-extension generan errores.

Una soluci贸n r谩pida para este problema es asegurarse que se est谩 ejecutando la versi贸n 1.5.3 de Pandas o anteriores.

Si se est谩 ejecutando el c贸digo en DeepNote, basta con ejecutar la instrucci贸n:

!pip install pandas==1.5.3

antes de

import pandas

O si se est谩 ejecutando el c贸digo desde un entorno local, basta con reinstalar el paquete de Pandas a la versi贸n 1.5.3 desde el gestor de ambientes virtuales (venv, Anaconda, etc.)

Para los que usan VSC con sus librer铆as y entornos bien configurados y les sale error con estas l铆neas de codigo:

<code> 
riskfactors_df.missing.missing_case_summary()
riskfactors_df.missing.missing_case_table()

lo pude solucionar cambiando el codigo en 鈥減andas-missing-extension鈥 en las funciones de:

鈥渕issing_variable_table鈥

<code> 
def missing_variable_table(self) -> pd.DataFrame:
        return (
            self._obj.missing.missing_variable_summary()
            .value_counts("n_missing")
            .reset_index()
            .rename(columns={"n_missing": "n_missing_in_variable", "count": "n_variables"})
            .assign(
                pct_variables=lambda df: df.n_variables / df.n_variables.sum() * 100
            )
            .sort_values("pct_variables", ascending=False)
        )

Y en la funcion 鈥渕issing_case_table鈥

<code> 
def missing_case_table(self) -> pd.DataFrame:
        return (
            self._obj.missing.missing_case_summary()
            .value_counts("n_missing")
            .reset_index()
            .rename(columns={"n_missing": "n_missing_in_case", "count": "n_cases"})
            .assign(pct_case=lambda df: df.n_cases / df.n_cases.sum() * 100)
            .sort_values("pct_case", ascending=False)
        )

Durante .value_counts, se genera una columna llamada 鈥渃ount鈥 y no 鈥0鈥, entonces sustituyendo se soluciona el problema.

missing_variable_summary() #metodo para obtener tabla con el conteo de datos faltantes en todas las columnas

missing_variable_table() #metodo para obtener tabla agrupada por el conteo de datos faltantes en todas las columnas

Aparentemente, existe un error en el c谩lculo durante la verificaci贸n de valores faltantes por registro. Se estipula que cada registro consta de un total de 34 campos posibles, y nuestra tarea es determinar cu谩ntos de estos campos se encuentran incompletos. Es decir, el porcentaje de valores faltantes por registro se calcula como la relaci贸n entre la cantidad de campos faltantes (n_faltantes) y el n煤mero total de campos (n_totales), que en este caso es 34.
En el ejemplo de clase, se observa que uno de los registros presenta 6 campos incompletos. Esto representar铆a aproximadamente el 17.64% del total de campos disponibles (34 campos). Sin embargo, el ejercicio obtiene un valor del 16.66%, que no concuerda con el c谩lculo anterior.
Es importante se帽alar que me podr铆a encontrar en un error, agradecer铆a que proporcionaran una explicaci贸n para entender la raz贸n detr谩s del resultado observado en la clase.
Propongo la siguiente correcci贸n para calcular correctamente la relaci贸n entre la cantidad de campos faltantes (n_faltantes) y el n煤mero total de campos (n_totales):

Me cost贸 entender el funcionamiento de `itertools.groupby`, deber铆an explicar el funcionamiento detr谩s de esas funciones de la clase para entenderlo mejor...

y pensar que para ver los valores faltantes s贸lo hac铆a

 base.info()

y ya me mostraba

  • conteo de variables faltantes en todas las columnas
riskfactors_df.missing.missing_variable_summary()
  • conteo de variables faltantes en las columnas que tienen valores faltantes
riskfactors_df.missing.missing_variable_table()

6. Tabulaci贸n de valores faltantes

  • Tabular es expresar valores, magnitudes u otros datos por medio de tablas

Empezar con res煤menes simples, como n煤meros.

  • 驴Cu谩ntos valores deber铆an existir en el conjunto de datos?
  • 驴Cu谩ntos valores faltantes existen en el conjunto de datos?
  • 驴Cu谩ntos valores completos existen en el conjunto de datos?

Construir res煤menes por variables y observaciones

  • 驴Cu谩ntos valores faltantes existen por cada variable?
  • 驴Cu谩ntos valores faltantes existen por cada observaci贸n?
  • 驴Cu谩ntas variables tiene X n煤mero de valores faltantes?
  • 驴Cu谩ntas observaciones tiene X n煤mero de valores faltantes?

Salir de la caja y hacer m谩s preguntas

  • Preguntas relacionadas al negocio
  • 驴Cu谩ntos valores faltantes tengo en una variable cada X pasos?
  • 驴Cu谩l es mi racha de valores completos y faltantes en una variable?


En mi caso estoy usando variables y no la funci贸n con la clase, pero veo un detalle en la funci贸n, `misssing_case_summary()`, ya que primero estas clonando el index, deber铆as de poner el `case` como index, no poner dos 铆ndices, es raro, segundo, en el `df.shape[1]` est谩s contando las variables(columnas) que acabas de crear, es decir, `case` y `n_missing`, las cuales no CREO que no deber铆an aportar al porcentaje, en mi caso puse `df.shape[1]-1` restando n\_missing y poniendo case como index, as铆 ```js case_summary = riskfactors_df.assign( n_missing = lambda df: df.apply( # Axis por defecto es 0, es para saber en que se aplica, si columns o rows axis="columns",func=lambda row: row.isna().sum() ), pct_missing = lambda df: df["n_missing"] / (df.shape[1]-1) * 100 ).rename_axis('case')[["n_missing", "pct_missing"]] case_summary ```

El error est谩 en pandas-missing-extension. Busca la funci贸n 鈥渕issing_variable_table鈥. El error es que quiere renombrar la columna 鈥0鈥 pero no hay ninguna con ese nombre al momento de hacer la transformaci贸n del dataframe. El c贸digo debe ser el siguiente:

def missing_variable_table(self) -> pd.DataFrame:
        return (
            self._obj.missing.missing_variable_summary()
            .value_counts("n_missing")
            .reset_index()
            .rename(columns={"n_missing": "n_missing_in_variable", "count": "n_variables"})
            .assign(
                pct_variables=lambda df: df.n_variables / df.n_variables.sum() * 100
            )
            .sort_values("pct_variables", ascending=False)
        )
Hola. Como lo escrib铆 en la clase anterior (Y para los que no leyeron mi aporte y hasta ahora est谩n necesitando ayuda), dej茅 un aporte en la primera clase donde les menciono que sub铆 mi repositorio a GitHub para que lo puedan clonar y tomar el curso en VSCode ya con los problemas de las dependencias y errores de c贸digo de la librer铆a MissingMethods. En el Readme podr谩n leer m谩s acerca del contenido. Espero que les ayude: <https://github.com/onnymm/missing_data_exploration>
al correr riskfactors\_df.missing.missing\_variable\_table() tenia el error: AttributeError: 'DataFrame' object has no attribute 'n\_variables' segu铆 las sugerencias de comentarios, pero no solucionaba nada. lo logr茅 con def missing\_variable\_table(self) -> pd.DataFrame: n\_rows = len(self.\_obj) missing\_data = self.\_obj.isnull().sum() missing\_percentage = (missing\_data / n\_rows) \* 100 variable\_summary = pd.DataFrame({ 'n\_missing\_in\_variable': missing\_data, 'pct\_missing\_in\_variable': missing\_percentage }) return variable\_summary
al correr riskfactors\_df.missing.missing\_variable\_table() tenia el error: AttributeError: 'DataFrame' object has no attribute 'n\_variables' segu铆 las sugerencias de comentarios, pero no solucionaba nada. lo logr茅 con ` def missing_variable_table(self) -> pd.DataFrame:` ` n_rows = len(self._obj)` ` missing_data = self._obj.isnull().sum()` ` missing_percentage = (missing_data / n_rows) * 100` ` variable_summary = pd.DataFrame({` ` 'n_missing_in_variable': missing_data,` ` 'pct_missing_in_variable': missing_percentage` ` })` ` return variable_summary`


riskfactors_df.missing.missing_case_table()
----
(
    riskfactors_df
    .missing
    .missing_variable_span(
        variable="weight_lbs",
        span_every=50
    )
)
-----
(
    riskfactors_df
    .missing
    .missing_variable_run(
        variable="weight_lbs"
    )
)