"""本端独立复核对端发布的两张池级表（不采信只采证据）:
  git show origin/research/hybrid-20260912:patches/research_pool_*_20260914.csv
  与本端 patches/pool_caches_v1_20260914/*.csv 逐 (pool,trade_date) 逐格比对。
"""
import io, subprocess
import pandas as pd

APP = '/Users/xpresso/zt_app'
BR = 'origin/research/hybrid-20260912'


def show(path):
    r = subprocess.run(['git', '-C', APP, 'show', f'{BR}:{path}'], capture_output=True)
    if r.returncode != 0:
        raise SystemExit(f'取不到 {path}: {r.stderr.decode()[:200]}')
    return pd.read_csv(io.BytesIO(r.stdout), dtype={'trade_date': str})


mine_c = pd.read_csv(f'{APP}/patches/pool_caches_v1_20260914/pool_signal_count.csv', dtype={'trade_date': str})
mine_s = pd.read_csv(f'{APP}/patches/pool_caches_v1_20260914/pool_daily_stats.csv', dtype={'trade_date': str})
th_c = show('patches/research_pool_signal_count_20260914.csv')
th_s = show('patches/research_pool_daily_stats_20260914.csv')

for nm, a, b in [('pool_signal_count', mine_c, th_c), ('pool_daily_stats', mine_s, th_s)]:
    print(f'== {nm}: 本端 {len(a)} 行 / 对端 {len(b)} 行')
    ka = set(zip(a['pool'], a['trade_date'])); kb = set(zip(b['pool'], b['trade_date']))
    print(f'   共有 {len(ka & kb)} | 仅本端 {len(ka - kb)} | 仅对端 {len(kb - ka)}')
    cols = [c for c in a.columns if c not in ('pool', 'trade_date') and c in b.columns]
    m = a.merge(b, on=['pool', 'trade_date'], suffixes=('_m', '_t'))
    for c in cols:
        d = (m[f'{c}_m'] - m[f'{c}_t']).abs()
        nz = int((d > 0).sum())
        mx = float(d.max()) if len(d) else float('nan')
        exact = int((m[f'{c}_m'] == m[f'{c}_t']).sum())
        print(f'   {c}: 逐格不等 {nz} 行 / 最大绝对差 {mx:.3e} / 逐格精确相等 {exact}/{len(m)}')
    print(f'   列集合 本端 {list(a.columns)}')
    print(f'   列集合 对端 {list(b.columns)}')
    print()
