Volver al inicio

Control de Suma de Columna en Python | Función de Pandas

El artículo describe la implementación de la función det_sum para rastrear cambios en la suma de columna en pandas. La función automatiza el monitoreo de datos, formatea números e identifica tablas mediante nombres de código. Se proporciona un ejemplo de código y recomendaciones para la integración en el flujo de trabajo.

Función det_sum: Monitoreo de Cambios en la Suma de Columna en pandas
Advertisement 728x90

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:

Google AdInline article slot
  • 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:

Google AdInline article slot
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:

Google AdInline article slot
  • 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

Advertisement 728x90

Leer después