"""
13_alternative_aggregation_comparison.py
替代聚合方法对比模块：乘除法比率 vs 加权线性和 vs 几何平均
Alternative Aggregation Comparison: multiplicative-ratio vs additive vs geometric mean

用途 / Purpose:
    主方案采用 RE = V*C/(1+F) 乘除法比率聚合（08 号脚本）。本模块计算
    两种替代方案 —— (a) 加权线性和 RE_add = w1*V + w2*C - w3*F，
    (b) 几何平均 RE_geo = (V * C * (1-F))^(1/3) —— 并与主方案做
    Spearman 秩相关比较，用以检验聚合方法选择对国家排名的敏感性。

依赖 / Dependencies: pandas, numpy, scipy
"""

import logging
from pathlib import Path

import numpy as np
import pandas as pd
from scipy.stats import spearmanr

logging.basicConfig(level=logging.INFO, format="%(asctime)s  %(message)s")
log = logging.getLogger("13_alt_aggregation")

DATA_DIR = Path("./data")
ADDITIVE_WEIGHTS = {"V": 0.4, "C": 0.4, "F": 0.2}


def main():
    scores = pd.read_csv(DATA_DIR / "panel_re_scores.csv")

    v, c, f = scores["v_score"], scores["c_score"], scores["f_score"]

    re_multiplicative = scores["re_score"]

    re_add_raw = (
        ADDITIVE_WEIGHTS["V"] * v
        + ADDITIVE_WEIGHTS["C"] * c
        - ADDITIVE_WEIGHTS["F"] * f
    )
    re_additive = 100 * (re_add_raw - re_add_raw.min()) / (re_add_raw.max() - re_add_raw.min())

    re_geo_raw = (v.clip(lower=1e-6) * c.clip(lower=1e-6) * (1 - f).clip(lower=1e-6)) ** (1 / 3)
    re_geometric = 100 * (re_geo_raw - re_geo_raw.min()) / (re_geo_raw.max() - re_geo_raw.min())

    comparison = scores[["iso3", "year"]].copy()
    comparison["re_multiplicative"] = re_multiplicative.round(2)
    comparison["re_additive"] = re_additive.round(2)
    comparison["re_geometric"] = re_geometric.round(2)
    comparison.to_csv(DATA_DIR / "aggregation_method_comparison.csv", index=False)

    rho_add, _ = spearmanr(re_multiplicative, re_additive)
    rho_geo, _ = spearmanr(re_multiplicative, re_geometric)

    log.info("Spearman rho (multiplicative vs additive) = %.4f", rho_add)
    log.info("Spearman rho (multiplicative vs geometric) = %.4f", rho_geo)
    log.info(
        "Aggregation method comparison complete -> data/aggregation_method_comparison.csv "
        "(high rank correlation confirms robustness to aggregation choice)"
    )


if __name__ == "__main__":
    main()
