"""baseline 版本对账：efe1fbb(重建前) vs 88438d5(重建后) vs d4da54e(回补后)。
核对 commit message 声称的 5837→5776(新增203/消失264/共有5573) 是否成立，并解释 6147 行。
用法: ./zt_venv/bin/python code/chk_baseline_reconcile.py
"""
import subprocess, io
import pandas as pd

def ver(rev):
    out = subprocess.run(['git', 'show', f'{rev}:backtest_zt_full/strength_baseline.csv'],
                         capture_output=True, cwd='.')
    return pd.read_csv(io.BytesIO(out.stdout))

a = ver('efe1fbb')   # 重建前
b = ver('88438d5')   # 重建后
c = ver('d4da54e')   # 回补后(= 当前 tip)

KEY = ['code', 'pool', 'buy_date', 'sell_date']


def keys(d):
    k = d[KEY].copy()
    for c in ('buy_date', 'sell_date'):
        k[c] = pd.to_numeric(k[c], errors='coerce').astype('Int64').astype(str)
    return set(map(tuple, k.values))
for name, d in [('efe1fbb 重建前', a), ('88438d5 重建后', b), ('d4da54e 回补后', c)]:
    print(f"{name}: 行 {len(d)} | distinct{KEY} {d.drop_duplicates(KEY).shape[0]} | "
          f"重复键行 {len(d) - d.drop_duplicates(KEY).shape[0]}")

ka = keys(a)
kb = keys(b)
kc = keys(c)
print(f"\n[重建] 共有 {len(ka & kb)} | 新增 {len(kb - ka)} | 消失 {len(ka - kb)}"
      f"   (commit 声称: 共有5573 / 新增203 / 消失264)")
print(f"[回补] 相对重建后: 新增 {len(kc - kb)} | 消失 {len(kb - kc)} | 共有 {len(kc & kb)}")

added = pd.DataFrame(sorted(kc - kb), columns=KEY)
gone = pd.DataFrame(sorted(kb - kc), columns=KEY)
if len(added):
    print("\n回补新增按 buy_date 月份:")
    print(added['buy_date'].str[:6].value_counts().sort_index().to_string())
if len(gone):
    print("\n回补时消失按 buy_date 月份(前10):")
    print(gone['buy_date'].str[:6].value_counts().sort_index().head(10).to_string())

print(f"\n回补后期望行数 = 重建后 {len(b)} + 回补新增 {len(kc - kb)} - 消失 {len(kb - kc)} = "
      f"{len(b) + len(kc - kb) - len(kb - kc)}  vs 实际 {len(c)}")
gd = ka - kb
if len(gd):
    gdf = pd.DataFrame(sorted(gd), columns=KEY)
    print("\n[重建]消失的 264(或实际条数) 按池:", gdf['pool'].value_counts().to_dict())
    print("[重建]消失的按 buy_date 年月(前12):",
          gdf['buy_date'].str[:6].value_counts().sort_index().head(12).to_dict())
