Monitoreo de Datos en Python: Función para Rastrear Cambios en la Suma de Columnas
Al procesar datos en pandas, es fácil pasar por alto cambios en métricas clave debido a errores en operaciones de merge o groupby. Presentamos la función det_sum, que no solo calcula la suma de la columna, sino que también rastrea desviaciones entre llamadas, ayudando a detectar anomalías en el proceso ETL.
¿Por qué Monitorear las Sumas de Columnas?
En el procesamiento de datos, es crucial rastrear la estabilidad de las métricas clave. Por ejemplo, una operación de merge con claves incorrectas puede inflar de forma inesperada el volumen de datos, mientras que un groupby con valores faltantes puede reducirlo. Las métricas financieras son especialmente vulnerables: si la suma de ventas cambia repentinamente un 15 %, es una bandera roja que indica un problema en la tubería de procesamiento. El enfoque estándar con df['sales'].sum() se queda corto: escupe un número crudo sin contexto de cambio y exige comparaciones manuales entre etapas.
La función det_sum automatiza esto al añadir:
- Formato automático de números grandes
- Comparación con el valor anterior
- Identificación práctica de la tabla
- Alertas de desviación legibles para humanos
Arquitectura de la Función det_sum
La implementación se basa en tres variables globales para mantener el estado entre llamadas:
_previous_sum = None
_case_number = 0
_table_names = {}
La función toma dos parámetros: un DataFrame y un nombre de columna. Etapas clave:
- Verificar si existe la columna
- Calcular la suma actual
- Formatear el número
- Generar un nombre de código único para la tabla
- Comparar con el valor anterior
El código mantiene un equilibrio entre funcionalidad y simplicidad:
def det_sum(table, column):
import pandas as pd
import random
global _previous_sum, _case_number, _table_names
_case_number += 1
if column not in table.columns:
print(f"\n🔍 Summary №{_case_number}: Andryukha! The column disappeared '{column}'! Possible crime! Saddle up!")
return
current_sum = table[column].sum()
def format_number(num):
abs_num = abs(num)
if abs_num >= 1_000_000_000:
return f"{num/1_000_000_000:.1f} billion"
elif abs_num >= 1_000_000:
return f"{num/1_000_000:.1f} mln"
elif abs_num >= 1_000:
return f"{num/1_000:.1f} thousand"
else:
return f"{num:.1f}"
formatted_current = format_number(current_sum)
table_id = id(table)
if table_id not in _table_names:
animals = ["Antelope", "Beaver", "Badger", "Wolf", "Otter", "Cheetah", "Gorilla", "Porcupine", "Dolphin",
"Raccoon", "Giraffe", "Zebra", "Hare", "Iguana", "Yemeni chameleon", "Cat", "Kangaroo",
"Lev", "Llama", "Bear", "Walrus", "Rhinoceros", "Deer", "Panda", "Puma",
"Lynx", "Elephant", "Meerkat", "Tiger", "Seal", "Platypus", "Flaamimingo", "Hamster",
"Heron", "Turtle", "Chimpanzee", "Pike", "Emu", "Brambling", "Yak"]
_table_names[table_id] = random.choice(animals)
table_code = _table_names[table_id]
print(f"\n🕵️ Summary AN №{_case_number}: Onservation for object '{table_code}' by column '{column}'")
print("=" * 50)
if _previous_sum is None:
print(f"🔎 Object '{table_animal}' was accepted under observation! Amount: {formatted_current}")
print("📋 Fiksiruem in svodke...")
else:
print(f"💼 Tekuschaya sum: {formatted_current}")
difference = current_sum - _previous_sum
if difference != 0:
formatted_diff = f"{abs(difference):,.0f}".replace(',', ' ')
if difference > 0:
print(f"⬆️ Hmm... Amount wzrosla on {formatted_diff}")
print("🕵️ Looks like, we missed new connection! Sending crew for kontrole!")
else:
print(f"⬇️ Wow! Amount decreased on {formatted_diff}")
print("🔍 Who-then is trying to cover tracks! Need check by cameras!")
else:
print("🤔 Amount not changed...")
print("📝 Zanosim in svodku: Object not outputil, meetings not recorded")
print("=" * 50)
_previous_sum = current_sum
Formateo de Números para Legibilidad
Un problema clave con la salida estándar de sum es la ilegibilidad de números grandes. La función format_number lo soluciona convirtiendo 1500000 en "1.5 mln". El algoritmo:
- Para valores ≥ 1000 millones: dividir por 10^9, redondear a décimas
- Para valores ≥ 1 millón: dividir por 10^6
- Para miles: dividir por 10^3
- Otros: mostrar con un decimal
Esto es especialmente vital para datos financieros, donde los miles de millones son pan de cada día. El formateo se produce automáticamente sin llamadas extra, acelerando el análisis.
Identificación Única de Tablas
Dado que pandas no permite obtener directamente el nombre de la variable DataFrame, la función usa un truco ingenioso: el ID de memoria (id(table)). En el primer acceso, elige un animal al azar de una lista predefinida. Esto permite:
- Rastrear múltiples tablas en un script
- Mantener historial de cambios por tabla de forma independiente
- Evitar confusiones durante transformaciones (los nombres de tablas fuente suelen cambiar)
La lista de animales tiene 40 opciones, desde Antelope hasta Yak. Las llamadas repetidas para la misma tabla reutilizan el nombre guardado para consistencia en los logs.
Integración en el Flujo de Trabajo
Para uso continuo, coloca la función en un módulo separado. Configuración recomendada:
- Crear config/func.py
- Añadir el código de det_sum allí
- Importar en el script principal:
import importlib
import config.func
importlib.reload(config.func)
from config.func import det_sum
La recarga mediante importlib.reload aplica cambios sin reiniciar el kernel. Este enfoque:
- Reduce la duplicación de código
- Centraliza las utilidades
- Mantiene el script principal limpio
Lo que Importa
- Variables globales para el estado: El uso de _previous_sum y _case_number rastrea cambios entre llamadas, pero requiere precaución en entornos multihilo.
- Verificaciones seguras: La función comprueba primero la existencia de la columna, previniendo fallos durante el procesamiento.
- Salida enfocada en humanos: El formateo de números y mensajes temáticos aceleran el diagnóstico de problemas sin excavar manualmente en logs.
- Identificación vía id(): Este workaround de pandas rastrea tablas de forma fiable en una sola sesión.
- Integración flexible: No hace falta reformar pipelines, solo inserta llamadas a det_sum donde sea necesario.
Esta herramienta destaca para depurar procesos ETL complejos donde los cambios de datos deben ser predecibles. La implementación tiene solo 30 líneas, pero llena un vacío crítico en el monitoreo de datos.
— Editorial Team
Aún no hay comentarios.