#!/usr/bin/env python
# coding=utf-8
"""
V2 Step1: 用数据驱动定义"低vov高曝光"问题
不再拍脑袋定阈值，而是用分布来定义
"""
import pandas as pd
import numpy as np
from pathlib import Path

output_dir = Path(__file__).parent / "output"

# 读取180天数据
df = pd.read_csv(output_dir / "step8_月度对比_20251201_20251231.csv")  # 先用一个月

print("=" * 70)
print("V2 Step1: 数据驱动定义问题")
print("=" * 70)

# 1. 看 vov 分布
print("\n【1. VoV 分布统计】")
print(f"样本数: {len(df)}")
print(f"VoV 均值: {df['vov0'].mean():.4f}")
print(f"VoV 中位数: {df['vov0'].median():.4f}")
print(f"VoV P25: {df['vov0'].quantile(0.25):.4f}")
print(f"VoV P75: {df['vov0'].quantile(0.75):.4f}")

# 2. 按曝光rank分组看vov分布
print("\n【2. 不同曝光rank的VoV分布】")
df['rank_group'] = pd.cut(df['曝光rank'], bins=[0, 3, 5, 10, 50], labels=['Top3', 'Top4-5', 'Top6-10', 'Top11-50'])
rank_stats = df.groupby('rank_group', observed=True).agg({
    'vov0': ['mean', 'median', lambda x: x.quantile(0.25)],
    '曝光rank': 'count'
}).round(4)
rank_stats.columns = ['vov均值', 'vov中位数', 'vov_P25', '样本数']
print(rank_stats)

# 3. 数据驱动定义"低vov"
# 定义：vov < 该rank组的P25 为"低vov"
print("\n【3. 数据驱动的问题定义】")
overall_p25 = df['vov0'].quantile(0.25)
overall_p50 = df['vov0'].median()

print(f"方案A: vov < P25 ({overall_p25:.4f}) 为低vov")
print(f"方案B: vov < P50 ({overall_p50:.4f}) 为低vov")

# 4. 用新定义计算问题比例
print("\n【4. 不同定义下的问题比例】")

for threshold_name, threshold in [('P25', overall_p25), ('P50', overall_p50), ('0.35(旧)', 0.35)]:
    # 低vov且rank靠前
    problem_a = df[(df['vov0'] < threshold) & (df['曝光rank'] <= 3)]
    problem_b = df[(df['vov0'] < threshold) & (df['曝光rank'] <= 5)]

    print(f"\n阈值={threshold_name} ({threshold:.4f}):")
    print(f"  低vov且Top3: {len(problem_a)} ({len(problem_a)/len(df)*100:.1f}%)")
    print(f"  低vov且Top5: {len(problem_b)} ({len(problem_b)/len(df)*100:.1f}%)")

# 5. 看问题的本质：rank与vov的关系
print("\n【5. 核心问题：高rank是否对应高vov？】")
# 如果排序合理，rank越靠前vov应该越高
corr = df['曝光rank'].corr(df['vov0'])
print(f"曝光rank 与 vov 相关系数: {corr:.4f}")
print(f"（负数表示rank越小vov越高，这是期望的；正数表示排序有问题）")

# 按rank分组的vov
print("\n各rank组vov均值:")
for rank in [1, 2, 3, 4, 5, 10]:
    subset = df[df['曝光rank'] == rank]
    if len(subset) > 0:
        print(f"  Rank {rank}: vov={subset['vov0'].mean():.4f} (n={len(subset)})")

# 6. 结论
print("\n" + "=" * 70)
print("【V2 Step1 结论】")
print("=" * 70)
print(f"""
问题重新定义:
  - 旧定义: vov < 0.35 且 rank ≤ 5 (拍脑袋)
  - 新定义: vov < P25 ({overall_p25:.4f}) 且 rank ≤ 3 (数据驱动)

核心问题验证:
  - rank 与 vov 相关系数 = {corr:.4f}
  - 如果接近0或为正，说明排序没有很好地按vov排
  - 这才是"低vov高曝光"问题的本质
""")

# 保存
with open(output_dir / "v2_step1_结论.txt", 'w', encoding='utf-8') as f:
    f.write(f"问题定义阈值: vov < {overall_p25:.4f} (P25)\n")
    f.write(f"rank与vov相关系数: {corr:.4f}\n")
