"""
Step 01: 数据清洗与标准化

输入: ../data.xlsx (原始数据)
输出: 01_clean.xlsx (清洗后的标准化数据)

功能:
1. 读取原始数据
2. 保留有效列并重命名为标准字段名
3. 生成 site_id (1-70)
4. 检查缺失值和数据质量
"""

import pandas as pd
import numpy as np
from pathlib import Path

# 路径配置
INPUT_PATH = Path(__file__).parent.parent / "data.xlsx"
OUTPUT_PATH = Path(__file__).parent / "01_clean.xlsx"

# 列名映射: 原始列名 -> 标准列名
COLUMN_MAPPING = {
    'Site Name': 'site_name',
    'latitude': 'lat',
    'longitude': 'lon',
    'Number of Visits in 2019': 'visits_2019',
    'Average Demand per Visit': 'mu',
    'StDev(Demand per Visit)': 'sigma'
}


def main():
    print("=" * 60)
    print("Step 01: 数据清洗与标准化")
    print("=" * 60)

    # 1. 读取原始数据
    print(f"\n[1] 读取原始数据: {INPUT_PATH}")
    df_raw = pd.read_excel(INPUT_PATH)
    print(f"    原始数据: {df_raw.shape[0]} 行, {df_raw.shape[1]} 列")

    # 2. 选择并重命名列
    print(f"\n[2] 选择有效列并重命名")
    df = df_raw[list(COLUMN_MAPPING.keys())].copy()
    df = df.rename(columns=COLUMN_MAPPING)

    # 3. 生成 site_id
    print(f"\n[3] 生成 site_id (1-70)")
    df.insert(0, 'site_id', range(1, len(df) + 1))

    # 4. 数据质量检查
    print(f"\n[4] 数据质量检查")
    print(f"    缺失值统计:")
    missing = df.isnull().sum()
    for col, count in missing.items():
        if count > 0:
            print(f"      - {col}: {count} 个缺失值")
    if missing.sum() == 0:
        print(f"      - 无缺失值")

    # 5. 数据统计摘要
    print(f"\n[5] 关键字段统计:")
    print(f"    站点数: {len(df)}")
    print(f"    μ (单次服务人数均值):")
    print(f"      - 范围: [{df['mu'].min():.1f}, {df['mu'].max():.1f}]")
    print(f"      - 均值: {df['mu'].mean():.1f}")
    print(f"      - μ > 250 的站点数: {(df['mu'] > 250).sum()}")
    print(f"    σ (单次服务人数标准差):")
    print(f"      - 范围: [{df['sigma'].min():.1f}, {df['sigma'].max():.1f}]")
    print(f"    2019年访问次数:")
    print(f"      - 总计: {df['visits_2019'].sum()}")
    print(f"      - 范围: [{df['visits_2019'].min()}, {df['visits_2019'].max()}]")

    # 6. 保存输出
    print(f"\n[6] 保存输出: {OUTPUT_PATH}")
    df.to_excel(OUTPUT_PATH, index=False)
    print(f"    已保存 {len(df)} 条记录")

    # 7. 显示前5行
    print(f"\n[7] 输出数据预览 (前5行):")
    print(df.head().to_string(index=False))

    print("\n" + "=" * 60)
    print("Step 01 完成")
    print("=" * 60)

    return df


if __name__ == "__main__":
    main()
