Zpět na domů

Kontrola součtu sloupce v Pythonu | Funkce Pandas

Článek popisuje implementaci funkce det_sum pro sledování změn součtu sloupce v pandas. Funkce automatizuje monitorování dat, formátuje čísla a identifikuje tabulky prostřednictvím kódových jmen. Uveden příklad kódu a doporučení pro integraci do pracovního postupu.

Funkce det_sum: monitorování změn součtu sloupce v pandas
Advertisement 728x90

# Kontrola dat v Pythonu: funkce pro sledování změn součtu sloupce

Při zpracování dat v pandas je snadné přehlédnout změnu klíčových metrik kvůli chybám v operacích merge nebo groupby. Představujeme funkci det_sum, která nejen vypočítá součet sloupce, ale také zaznamená odchylky mezi voláními a pomůže odhalit anomálie v procesu ETL.

Proč sledovat součet sloupce?

V procesu zpracování dat je klíčové sledovat stabilitu hlavních ukazatelů. Například operace merge při špatném zadání klíčů může neočekávaně zvýšit objem dat, zatímco groupby s chybějícími hodnotami ho může zmenšit. Zejména finanční metriky jsou zranitelné: pokud se součet prodejů náhle změní o 15 %, je to signál problému v zpracovatelském potrubí. Standardní přístup přes df['sales'].sum() problém neřeší – vypíše „syrové“ číslo bez kontextu změn a vyžaduje ruční srovnání mezi etapy.

Funkce det_sum tento proces automatizuje a přidává:

Google AdInline article slot
  • Automatické formátování velkých čísel
  • Srovnání s předchozí hodnotou
  • Pohodlnou identifikaci tabulek
  • Lidsky čitelné upozornění na odchylky

Architektura funkce det_sum

Implementace je založena na třech globálních proměnných pro ukládání stavu mezi voláními:

_previous_sum = None
_case_number = 0
_table_names = {}

Funkce přijímá dva parametry: DataFrame a název sloupce. Klíčové etapy práce:

  • Kontrola existence sloupce
  • Výpočet aktuálního součtu
  • Formátování čísla
  • Generování unikátního kódového jména tabulky
  • Srovnání s předchozí hodnotou

Kód funkce udržuje rovnováhu mezi funkcionalitou a jednoduchostí:

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

Formátování čísel pro lepší čitelnost

Klíčový problém standardního výpisu součtu spočívá v nečitelnosti velkých čísel. Funkce format_number to řeší konverzí 1500000 na „1,5 mil.“. Algoritmus zpracování:

  • Pro hodnoty ≥ 1 mld: dělení na 10^9 s zaokrouhlením na desetiny
  • Pro hodnoty ≥ 1 mil: dělení na 10^6
  • Pro tisíce: dělení na 10^3
  • Ostatní: výpis s jedním desetinným místem

To je obzvláště důležité při práci s finančními daty, kde manipulace s miliardami je běžná. Formátování probíhá automaticky bez dalších volání, což urychluje analýzu.

Unikátní identifikace tabulek

Protože v pandas nelze přímo získat jméno proměnné DataFrame, funkce používá chytrý trik – identifikátor paměti (id(table)). Při prvním přístupu k tabulce se generuje náhodné zvíře z přednastaveného seznamu. To umožňuje:

Google AdInline article slot
  • Sledovat více tabulek v jednom skriptu
  • Zachovávat historii změn pro každou tabulku nezávisle
  • Vyhnout se zmatkům při transformacích (jméno původní tabulky se často mění)

Seznam zvířat zahrnuje 40 variant, od antilopy po jaka. Při opakovaném volání pro stejnou tabulku se používá uložené jméno, což zajišťuje konzistenci logů.

Integrace do pracovního procesu

Pro trvalé použití funkci vyjměte do samostatného modulu. Doporučená struktura:

  • Vytvořit soubor config/func.py
  • Umístit tam kód det_sum
  • Importovat do hlavního skriptu:
import importlib

import config.func
importlib.reload(config.func)
from config.func import det_sum

Přenačítání modulu přes importlib.reload umožňuje aplikovat změny bez restartu jádra. Takový přístup:

  • Snižuje duplikaci kódu
  • Centralizuje utility
  • Zachovává čistotu hlavního skriptu

Co je důležité

  • Globální proměnné jako stav: Použití _previous_sum a _case_number umožňuje sledovat změny mezi voláními, ale vyžaduje opatrnost v multiprocesových prostředích.
  • Bezpečnost kontrol: Funkce nejprve kontroluje přítomnost sloupce a zabraňuje tak kritickým chybám v procesu zpracování.
  • Výstup orientovaný na člověka: Formátování čísel a tematická hlášení urychlují diagnostiku problémů bez ruční analýzy logů.
  • Identifikace přes id(): Tato metoda obchází omezení pandas pro sledování tabulek a funguje stabilně v rámci jednoho sezení.
  • Flexibilita integrace: Funkce nevyžaduje změny existujících potrubí – stačí přidat volání det_sum na klíčových místech.

Nástroj je obzvláště užitečný při ladění složitých ETL procesů, kde změny dat musí být předvídatelné. Implementace zabírá pouze 30 řádků kódu, ale pokrývá kritickou potřebu monitorování dat.

— Editorial Team

Advertisement 728x90

Číst dál