12.8.3 Pandas DataFrame을 활용한 결과 비교 로직 구현 코드

12.8.3 Pandas DataFrame을 활용한 결과 비교 로직 구현 코드

앞선 방어 인프라스트럭처의 험난한 실행 샌드박스의 문을 무사히 통과하여, 파이썬 메인 스레드의 메모리(RAM) 공간으로 안전하게 끌어올려진 인간의 정답(Reference) 데이터 텐서와 미지 AI의 예측(Generated) 텐서는 이제 완전히 동일한 스펙타클의 구조를 지닌 순수한 Pandas DataFrame 인스턴스 객체로 존재하게 된다.

본 절에서는 12.4절과 12.5절에서 숨 막히도록 치열하게 논증했던 **‘데이터 차원 정규화(Data Normalization)’**와 **‘다중 집합 동등성 검사(Set Equality Check)’**의 수학적이고 철학적인 백서 이론들을, Pandas 라이브러리가 제공하는 C언어/NumPy 기반의 극도로 최적화된 벡터 연산(Vectorization) 칼날을 통해 O(N)의 벼락같은 속도로 증명해 내는 비교 판별기(Comparator) 핵심 코드를 타건한다.

1. 텐서 무결성 정규화 파이프라인 (Normalization Pipeline)

단순하고 멍청하게 두 객체를 df_ref.equals(df_gen) 로 1차원적으로 비교하는 것은 100% 실패하는 도박이다. 왜냐하면 AI가 뽑아낸 행의 파티션 순서가 다를 수 있고, 극미세한 부동 소수점(float) 오차가 존재하며, 무엇보다 AI가 지어낸 컬럼의 무의미한 별칭(Alias)이 인간이 작성한 것과 어긋날 확률이 농후하기 때문이다.
따라서 두 데이터프레임을 절대적인 동치 연산 통과가 가능한 무결점 상태로 무자비하게 깎아버리는 정규화 래퍼(Wrapper) 함수를 선언한다.

import pandas as pd
import numpy as np

def normalize_database_tensor(df: pd.DataFrame) -> pd.DataFrame:
    """ 
    RDBMS의 자유분방한 결과 집합을 순서 무관(Order-Agnostic)하고 
    타입에 견고한 물리적 상태로 강제 정규화한다.
    """
    if df.empty:
        return df

    # [규칙 1] 컬럼 별칭(Alias) 파괴 전략 (12.4.2절) 
    # 데이터 비즈니스 로직과 무관한 헤더의 문자열을 파괴하고, 위치 기반의 순수 인덱스로 벡터 치환
    df.columns = [f"col_index_{i}" for i in range(len(df.columns))]

    # [규칙 2] 부동 소수점(Floating Point) 강제 절사 맵핑 (12.4.4절)
    # CPU 아키텍처에 따른 미세 오차를 막기 위해 모든 숫자 텐서를 소수점 4자리에서 컷 오프
    for col in df.select_dtypes(include=[np.number]).columns:
        df[col] = df[col].round(4) 

    # [규칙 3] 문자열 텍스트 대소문자 및 잉여 공백 철폐 (12.4.5절)
    for col in df.select_dtypes(include=['object', 'string']).columns:
        df[col] = df[col].astype(str).str.strip().str.lower()

    # [규칙 4] 3치 논리를 무너뜨리는 결측치(NULL)의 단일 싱글톤 토큰 강제 주입 (12.5.3절)
    # Pandas의 NaN, None 스칼라들을 오라클 절대 동치 토큰으로 강력 융합
    df = df.fillna("__ORACLE_ABSOLUTE_NULL_TOKEN__")

    return df

2. 고속 다중 집합 카운팅(Multiset Counting) 동등성 검증 로직 구현

이제 그 가혹한 정규화의 깎임 과정을 무사히 통과한 두 데이터프레임 구조체가 수학적으로 “완벽하게 동일한 튜플들의 다중 집합(Multiset/Bag)“인지 최종 판별해야 하는 순간이다.
단순하게 레코드를 정렬(Sort)하여 스캔하는 방식을 채택하면 O(N \log N)의 거대한 힙 오버헤드에 빠지게 되므로, 데이터의 행(Row) 전체를 단일 해시(Hash) 문자로 압축 압착시킨 뒤, 각 해시의 고유 출현 빈도를 Value Counts로 뽑아내어 거시적 딕셔너리(Dictionary) 해시맵으로 맞부딪히는 극한의 O(N) 성능 검증 로직을 구현해 낸다.

def check_bag_semantic_equality(ref_df: pd.DataFrame, gen_df: pd.DataFrame) -> bool:
    """
    [Core Oracle] 정규화된 두 텐서가 1비트의 오차도 없이, 
    중복 레이어를 포함한 동일한 백(Bag) 시멘틱스를 가지거 있는지 O(N) 최적화로 해시 검사한다.
    """
    # 1단계: 차원 기수성(Cardinality Tuple Count)의 기초적이고 절대적인 1차 검증
    if ref_df.shape != gen_df.shape:
         return False
         
    if ref_df.empty and gen_df.empty:
         return True

    # 2단계: DataFrame의 2차원 Row 튜플 전체를, 단일 Hash String이 담긴 1차원 텐서 배열로 초압축
    def hash_tensor_rows(target_df):
        # 모든 컬럼을 강제 직렬화 융합 후 파이썬 네이티브 해싱하여 Series 벡터로 반환
        return target_df.astype(str).apply(lambda row: hash(tuple(row)), axis=1)

    ref_hashed_vector = hash_tensor_rows(ref_df)
    gen_hashed_vector = hash_tensor_rows(gen_df)

    # 3단계: 해시 다중 집합 카운터(Multiset Bag Counter) 빈도수 동등성 물리 대조 돌격 (가장 완벽한 O(N) 방어선)
    ref_signature_map = ref_hashed_vector.value_counts().to_dict()
    gen_signature_map = gen_hashed_vector.value_counts().to_dict()

    # 파이썬 Native Dictionary 대조를 통해 모든 해시 빈도수(중복 횟수)의 일치 여부를 즉각 판별
    return ref_signature_map == gen_signature_map

이 경이로운 30여 줄 남짓한 알고리즘 코드 블록이야말로, 그동안 인간과 시스템을 괴롭혀왔던 SQL 오라클 검증 시스템에 관한 모든 학문적 철학과 아키텍트의 피와 땀이 농축되어 결정화된 진정한 엑스칼리버(Excalibur)다. 이 철벽같은 코드는 테스트 대상인 AI 에이전트가 쿼리 끝에 쓸데없이 ORDER BY를 넣든 멍청하게 빼먹든, 혹은 AS "total_cnt"라는 영어 별칭을 제멋대로 지어내서 데이터베이스에 던졌든 그 어떤 외풍에도 전혀 흔들리지 않고, 오직 그 핵심이 조준하고 있는 불변의 진리(Truth Set Execution = 1)만을 우아하게 선고하게 될 것이다.