Spaces:
Sleeping
Sleeping
import numpy as np | |
def probability_to_score_v3(prob, base_score=300, max_score=850, threshold=0.326, | |
expansion_factor_low=3, expansion_factor_high=0.7): | |
""" | |
Convierte probabilidades en puntajes de cr茅dito con expansi贸n no lineal | |
para distribuir mejor en los extremos. | |
Args: | |
prob (float): Probabilidad de default. | |
base_score (int): Puntaje base. | |
max_score (int): Puntaje m谩ximo. | |
threshold (float): Valor de corte 贸ptimo. | |
expansion_factor_low (float): Factor para expandir la parte baja del rango. | |
expansion_factor_high (float): Factor para expandir la parte alta del rango. | |
Returns: | |
score (float): Puntaje de cr茅dito ajustado. | |
""" | |
# Invertir la probabilidad para que mayor valor sea mejor score | |
inverted_prob = 1 - prob | |
# Punto de corte invertido | |
inverted_threshold = 1 - threshold | |
# Determinar si es un score alto o bajo | |
if inverted_prob >= inverted_threshold: # Buenos clientes | |
# Normalizar la probabilidad en el rango de buenos | |
normalized = (inverted_prob - inverted_threshold) / (1 - inverted_threshold) | |
# Aplicar expansi贸n no lineal | |
transformed = normalized ** expansion_factor_high | |
# Mapear al rango superior | |
mid_score = 600 # Punto medio del rango | |
score = mid_score + (max_score - mid_score) * transformed | |
else: # Malos clientes | |
# Normalizar la probabilidad en el rango de malos | |
normalized = inverted_prob / inverted_threshold | |
# Aplicar expansi贸n no lineal para los scores bajos | |
transformed = normalized ** expansion_factor_low | |
# Mapear al rango inferior | |
mid_score = 500 # Punto medio del rango | |
score = base_score + (mid_score - base_score) * transformed | |
# Asegurar que el score est茅 dentro del rango permitido | |
score = np.clip(score, base_score, max_score) | |
return float(score) |