Técnicas avanzadas de validación con Pandera para promover la calidad y confiabilidad de los datos
Bienvenido a un viaje exploratorio hacia la validación de datos con Pandera, una herramienta menos conocida pero poderosa en el conjunto de herramientas del científico de datos. Este tutorial tiene como objetivo iluminar el camino para aquellos que buscan fortalecer sus procesos de procesamiento de datos con técnicas de validación sólidas.
Pandera es una biblioteca de Python que proporciona validación de datos flexible y expresiva para estructuras de datos de pandas. Está diseñado para aportar más rigor y confiabilidad a los pasos del procesamiento de datos, garantizando que sus datos se ajusten a formatos, tipos y otras restricciones específicos antes de continuar con el análisis o el modelado.
¿Por qué Pandera?
En el intrincado entramado de la ciencia de datos, donde los datos son el hilo fundamental, garantizar su calidad y coherencia es primordial. Pandera promueve la integridad y calidad de los datos a través de una validación rigurosa. No se trata sólo de comprobar tipos o formatos de datos; Pandera extiende su vigilancia a validaciones estadísticas más sofisticadas, lo que lo convierte en un aliado indispensable en sus esfuerzos de ciencia de datos. En concreto, Pandera se destaca por ofrecer:
- Aplicación del esquema: Garantiza que su DataFrame se adhiere a un esquema predefinido.
- Validación personalizable: permite la creación de reglas de validación personalizadas y complejas.
- Integración con Pandas: Funciona perfectamente con los flujos de trabajo de pandas existentes.
Elaborando tu primer esquema
Comencemos instalando Pandera. Esto se puede hacer usando pip:
pip install pandera
Un esquema en Pandera define la estructura, los tipos de datos y las restricciones esperados de su DataFrame. Comenzaremos importando las bibliotecas necesarias y definiendo un esquema simple.
import pandas as pd
from pandas import Timestamp
import pandera as pa
from pandera import Column, DataFrameSchema, Check, Index
schema = DataFrameSchema({
"name": Column(str),
"age": Column(int, checks=pa.Check.ge(0)), # age should be non-negative
"email": Column(str, checks=pa.Check.str_matches(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')) # email format
})
Este esquema especifica que nuestro DataFrame debe tener tres columnas: nombre (cadena), edad (entero, no negativo) y correo electrónico (cadena, que coincide con una expresión regular para correo electrónico). Ahora, con nuestro esquema implementado, validemos un DataFrame.
# Sample DataFrame
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, -5, 30],
"email": ["alice@example.com", "bob@example", "charlie@example.com"]
})
# Validate
validated_df = schema(df)
En este ejemplo, Pandera generará un SchemaError porque la edad de Bob es negativa, lo que viola nuestro esquema.
SchemaError: <Schema Column(name=age, type=DataType(int64))> failed element-wise validator 0:
<Check greater_than_or_equal_to: greater_than_or_equal_to(0)>
failure cases:
index failure_case
0 1 -5
Uno de los puntos fuertes de Pandera es su capacidad para definir funciones de validación personalizadas.
@pa.check_input(schema)
def process_data(df: pd.DataFrame) -> pd.DataFrame:
# Some code to process the DataFrame
return df
processed_df = process_data(df)
El decorador @pa.check_input garantiza que el DataFrame de entrada se adhiera al esquema antes de que la función lo procese.
Validación de datos avanzada con verificación personalizada
Ahora, exploremos validaciones más complejas que ofrece Pandera. Sobre la base del esquema existente, podemos agregar columnas adicionales con varios tipos de datos y comprobaciones más sofisticadas. Introduciremos columnas para datos categóricos, datos de fecha y hora e implementaremos comprobaciones más avanzadas, como garantizar valores únicos o hacer referencia a otras columnas.
# Define the enhanced schema
enhanced_schema = DataFrameSchema(
columns={
"name": Column(str),
"age": Column(int, checks=[Check.ge(0), Check.lt(100)]),
"email": Column(str, checks=[Check.str_matches(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')]),
"salary": Column(float, checks=Check.in_range(30000, 150000)),
"department": Column(str, checks=Check.isin(["HR", "Tech", "Marketing", "Sales"])),
"start_date": Column(pd.Timestamp, checks=Check(lambda x: x < pd.Timestamp("today"))),
"performance_score": Column(float, nullable=True)
},
index=Index(int, name="employee_id")
)
# Custom check function
def salary_age_relation_check(df: pd.DataFrame) -> pd.DataFrame:
if not all(df["salary"] / df["age"] < 3000):
raise ValueError("Salary to age ratio check failed")
return df
# Function to process and validate data
def process_data(df: pd.DataFrame) -> pd.DataFrame:
# Apply custom check
df = salary_age_relation_check(df)
# Validate DataFrame with Pandera schema
return enhanced_schema.validate(df)
En este esquema mejorado, hemos agregado:
- Datos categóricos: la columna del departamento se valida con categorías específicas.
- Datos de fecha y hora: la columna start_date garantiza que las fechas sean del pasado.
- Columna que acepta valores NULL: la columna performance_score puede tener valores faltantes.
- Validación del índice: se define un índice Employee_id de tipo entero.
- Verificación compleja: una función personalizada salario_age_relation_check garantiza una relación lógica entre el salario y la edad dentro de cada departamento.
- Implementación de la verificación personalizada en la función de procesamiento de datos: Integramos la lógica salario_age_relation_check directamente en nuestra función de procesamiento de datos.
- Uso del método de validación de Pandera: en lugar de usar el decorador @pa.check_types, validamos manualmente el DataFrame usando el método de validación proporcionado por Pandera.
Ahora, creemos un DataFrame df_example de ejemplo que coincida con la estructura y las restricciones de nuestro esquema mejorado y validémoslo.
df_example = pd.DataFrame({
"employee_id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 35, 45],
"email": ["alice@example.com", "bob@example.com", "charlie@example.com"],
"salary": [50000, 80000, 120000],
"department": ["HR", "Tech", "Sales"],
"start_date": [Timestamp("2022-01-01"), Timestamp("2021-06-15"), Timestamp("2020-12-20")],
"performance_score": [4.5, 3.8, 4.2]
})
# Make sure the employee_id column is the index
df_example.set_index("employee_id", inplace=True)
# Process and validate data
processed_df = process_data(df_example)
Aquí, Pandera generará un SchemaError debido a una falta de coincidencia entre el tipo de datos esperado de la columna de salario en Enhanced_schema (float que corresponde a float64 en pandas/Numpy) y el tipo de datos real presente en df_example (int o int64 en pandas/Numpy). tipos).
SchemaError: expected series 'salary' to have type float64, got int64
Validación avanzada de datos con pruebas de hipótesis estadísticas.
Pandera puede realizar pruebas de hipótesis estadísticas como parte del proceso de validación. Esta característica es particularmente útil para validar suposiciones sobre las distribuciones de datos o las relaciones entre variables.
Supongamos que desea asegurarse de que el salario promedio en su conjunto de datos esté alrededor de un valor determinado, digamos £75 000. Se puede definir una función de verificación personalizada para realizar una prueba t de una muestra para evaluar si la media de una muestra (por ejemplo, la media de los salarios en el conjunto de datos) difiere significativamente de una media conocida (en nuestro caso, £75 000). .
from scipy.stats import ttest_1samp
# Define the custom check for the salary column
def mean_salary_check(series: pd.Series, expected_mean: float = 75000, alpha: float = 0.05) -> bool:
stat, p_value = ttest_1samp(series.dropna(), expected_mean)
return p_value > alpha
salary_check = Check(mean_salary_check, element_wise=False, error="Mean salary check failed")
# Correctly update the checks for the salary column by specifying the column name
enhanced_schema.columns["salary"] = Column(float, checks=[Check.in_range(30000, 150000), salary_check], name="salary")
En el código anterior tenemos:
- Se definió la función de verificación personalizada mean_salary_check que toma una serie de pandas (la columna de salario en nuestro DataFrame) y realiza la prueba t contra la media esperada. La función devuelve Verdadero si el valor p de la prueba t es mayor que el nivel de significancia (alfa = 0,05), lo que indica que el salario medio no es significativamente diferente de £75 000.
- Luego envolvimos esta función en Pandera Check, especificando element_wise=False para indicar que la verificación se aplica a toda la serie en lugar de a cada elemento individualmente.
- Finalmente, actualizamos la columna de salario en nuestro esquema Pandera para incluir este nuevo control junto con los controles existentes.
Con estos pasos, nuestro esquema Pandera ahora incluye una prueba estadística en la columna de salario. Aumentamos deliberadamente el salario promedio en df_example para violar las expectativas del esquema, de modo que Pandera genere un SchemaError.
# Change the salaries to exceede the expected mean of £75,000
df_example["salary"] = df_example["salary"] = [100000.0, 105000.0, 110000.0]
validated_df = enhanced_schema(df_example)
SchemaError: <Schema Column(name=salary, type=DataType(float64))> failed series or dataframe validator 1:
<Check mean_salary_check: Mean salary check failed>
Conclusión
Pandera eleva la validación de datos de un punto de control mundano a un proceso dinámico que abarca incluso validaciones estadísticas complejas. Al integrar Pandera en su proceso de procesamiento de datos, puede detectar inconsistencias y errores de manera temprana, ahorrando tiempo, evitando dolores de cabeza en el futuro y allanando el camino para un análisis de datos más confiable y detallado.
Referencias y lecturas adicionales
Para aquellos que deseen ampliar su comprensión de Pandera y sus capacidades, los siguientes recursos sirven como excelentes puntos de partida:
- Documentación de Pandera: una guía completa de todas las características y funcionalidades de Pandera (Documentos de Pandera).
- Documentación de Pandas: a medida que Pandera amplía los pandas, la familiaridad con los pandas es crucial (Documentos de pandas).
Descargo de responsabilidad
No estoy afiliado a Pandera de ninguna manera, simplemente estoy muy entusiasmado con ello 🙂
Cultivando la integridad de los datos en la ciencia de datos con Pandera fue publicado originalmente en Hacia la ciencia de datos en Medium, donde las personas continúan la conversación resaltando y respondiendo a esta historia.