# 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á:
- 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í:
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:
- 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
Zatím žádné komentáře.