# predict.py - 客户流失预测接口
import joblib
import pandas as pd

# 加载保存好的模型（关键：路径要和save_model.py生成的pkl文件一致）
try:
    model = joblib.load('telco_churn_model.pkl')
    print("✅ 模型加载成功！")
except FileNotFoundError:
    print("❌ 未找到模型文件，请先运行save_model.py生成telco_churn_model.pkl")
    exit()

def predict_churn(customer_data):
    """
    预测客户流失概率
    参数：customer_data - DataFrame，包含客户的所有特征
    返回：预测结果（是否流失+流失概率）
    """
    # 新增特征组合（必须和训练时一致，否则预测不准）
    customer_data['tenure_monthly'] = customer_data['tenure'] * customer_data['MonthlyCharges']
    customer_data['tenure_ratio'] = customer_data['tenure'] / (customer_data['TotalCharges'] + 1)
    customer_data['monthly_total_ratio'] = customer_data['MonthlyCharges'] / (customer_data['TotalCharges'] + 1)
    
    # 执行预测
    churn_pred = model.predict(customer_data)  # 0=未流失，1=流失
    churn_prob = model.predict_proba(customer_data)[:, 1]  # 流失概率
    
    # 整理结果
    result = pd.DataFrame({
        '客户ID': customer_data['customerID'],
        '是否流失（0=否，1=是）': churn_pred,
        '流失概率': churn_prob.round(3)  # 保留3位小数
    })
    return result

# 示例：预测1个测试客户的流失概率
if __name__ == "__main__":
    # 构造测试客户数据（特征和原数据集一致）
    test_customer = pd.DataFrame({
        'customerID': ['TEST001'],  # 客户ID
        'tenure': [12],  # 在网时长（月）
        'MonthlyCharges': [69.99],  # 月消费
        'TotalCharges': [839.88],  # 总消费
        'Contract': ['Month-to-month'],  # 合同类型（月付）
        'InternetService': ['Fiber optic'],  # 光纤上网
        'PaymentMethod': ['Electronic check'],  # 电子支票支付
        'OnlineSecurity': ['No'],  # 无网络安全服务
        'TechSupport': ['No'],  # 无技术支持
        'PaperlessBilling': ['Yes'],  # 无纸化账单
        # 以下是其他必填特征（按原数据集补充）
        'gender': ['Female'],
        'SeniorCitizen': [0],
        'Partner': ['Yes'],
        'Dependents': ['No'],
        'PhoneService': ['Yes'],
        'MultipleLines': ['No'],
        'OnlineBackup': ['Yes'],
        'DeviceProtection': ['No'],
        'StreamingTV': ['Yes'],
        'StreamingMovies': ['No']
    })
    
    # 调用预测函数
    result = predict_churn(test_customer)
    
    # 打印结果
    print("\n📊 客户流失预测结果：")
    print(result)