import pandas as pd
import numpy as np
import re

def clean_male_fetus_data(file_path):
    """
    读取并清洗您的 '男胎数据.csv'，提取关键特征用于建模。
    """
    try:
        # 1. 读取数据
        df = pd.read_csv(file_path)
        print(f"原始数据行数: {len(df)}")

        # 2. 列名映射 (根据您文件中的实际表头)
        col_map = {
            '孕妇代码': 'ID',
            '年龄': 'Age',
            '身高': 'Height',
            '体重': 'Weight',
            '检测孕周': 'GA_Raw',  # 原始的 "11w+6" 格式
            '孕妇BMI': 'BMI',
            'Y染色体浓度': 'Y_Conc', # 关键列
            '检测日期': 'TestTime'
        }
        
        # 重命名列，未在字典中的列保持原名
        df_clean = df.rename(columns=col_map)

        # 3. 清洗孕周 (解析 "11w+6" 为 11.857 周)
        def parse_ga(s):
            if pd.isna(s): return np.nan
            s = str(s).strip().lower()
            try:
                weeks = 0
                days = 0
                
                # 如果是纯数字 (如 "12.5")
                if re.match(r'^\d+(\.\d+)?$', s):
                    return float(s)
                
                # 提取周数 (如 "11w")
                if 'w' in s:
                    parts = s.split('w')
                    weeks = float(parts[0])
                    # 提取天数 (如 "+6" 或 "6d")
                    if len(parts) > 1 and parts[1]:
                        d_part = parts[1]
                        # 提取其中的数字
                        d_match = re.search(r'(\d+)', d_part)
                        if d_match:
                            days = float(d_match.group(1))
                            
                if weeks == 0 and days == 0:
                    return np.nan
                    
                return weeks + days / 7.0
            except:
                return np.nan

        df_clean['GA'] = df_clean['GA_Raw'].apply(parse_ga)

        # 4. 数值转换
        numeric_cols = ['Age', 'Height', 'Weight', 'BMI', 'GA', 'Y_Conc']
        for col in numeric_cols:
            if col in df_clean.columns:
                df_clean[col] = pd.to_numeric(df_clean[col], errors='coerce')

        # 5. 过滤有效数据
        # 必须包含: 孕周, BMI, Y浓度
        # 过滤掉物理上不可能的数值 (异常值处理)
        df_male = df_clean.dropna(subset=['GA', 'BMI', 'Y_Conc']).copy()
        df_male = df_male[
            (df_male['BMI'] > 10) & (df_male['BMI'] < 60) &  # 合理BMI范围
            (df_male['GA'] > 0) & (df_male['GA'] < 45) &     # 合理孕周范围
            (df_male['Y_Conc'] > 0)                          # Y浓度必须存在
        ]

        print(f"清洗完成，有效样本数: {len(df_male)}")
        return df_male

    except Exception as e:
        print(f"数据清洗发生错误: {e}")
        return None

# ==========================================
# 运行清洗
# ==========================================
file_name = '男胎数据.csv'  # 您的文件名
cleaned_data = clean_male_fetus_data(file_name)

if cleaned_data is not None:
    # 显示前5行，检查结果
    print(cleaned_data[['ID', 'Age', 'BMI', 'GA_Raw', 'GA', 'Y_Conc']].head())
    
    # 保存结果
    # cleaned_data.to_csv('cleaned_male_data.csv', index=False)