in scorecard-plugin/src/main/java/org/apache/fineract/portfolio/creditscorecard/service/CreditScorecardWritePlatformServiceImpl.java [159:311]
public CreditScorecard assessCreditRisk(final Loan loan) {
final CreditScorecard scorecard = loan.getScorecard();
if (scorecard != null) {
final String scoringMethod = scorecard.getScoringMethod();
final String scoringModel = scorecard.getScoringModel();
if (scoringMethod.equalsIgnoreCase("ruleBased")) {
final RuleBasedScorecard ruleBasedScorecard = scorecard.getRuleBasedScorecard();
final List<FeatureCriteriaScore> criteriaScores = ruleBasedScorecard.getCriteriaScores();
for (final FeatureCriteriaScore criteriaScore : criteriaScores) {
final LoanProductScorecardFeature lpFeature = criteriaScore.getFeature();
final FeatureConfiguration featureConfig = lpFeature.getFeatureConfiguration();
final EnumOptionData dataType = lpFeature.getScorecardFeature().getDataType();
final List<FeatureCriteria> featureCriteriaList = lpFeature.getFeatureCriteria();
for (final FeatureCriteria featureCriteria : featureCriteriaList) {
final String value = criteriaScore.getValue();
if (value != null) {
if (dataType.getValue().equalsIgnoreCase("string")) {
if (value.equalsIgnoreCase(featureCriteria.getCriteria())) {
final BigDecimal score = featureCriteria.getScore().multiply(featureConfig.getWeightage());
final String color = featureConfig.getColorFromScore(score);
criteriaScore.setScore(score, color);
break;
}
} else if (dataType.getValue().equalsIgnoreCase("numeric")) {
final String criteria = featureCriteria.getCriteria().strip();
final float min = Float.parseFloat(criteria.substring(0, criteria.indexOf("-")).strip());
final float max = Float.parseFloat(criteria.substring(criteria.indexOf("-") + 1).strip());
final float floatValue = Float.parseFloat(value);
if (floatValue >= min && floatValue <= max) {
final BigDecimal score = featureCriteria.getScore().multiply(featureConfig.getWeightage());
final String color = featureConfig.getColorFromScore(score);
criteriaScore.setScore(score, color);
break;
}
}
}
}
}
BigDecimal scorecardScore = BigDecimal.ZERO;
int greenCount = 0;
int amberCount = 0;
int redCount = 0;
for (final FeatureCriteriaScore ctScore : criteriaScores) {
scorecardScore = scorecardScore.add(ctScore.getScore());
if (ctScore.getColor().equalsIgnoreCase("green")) {
greenCount += 1;
} else if (ctScore.getColor().equalsIgnoreCase("amber")) {
amberCount += 1;
} else if (ctScore.getColor().equalsIgnoreCase("red")) {
redCount += 1;
}
}
String scorecardColor = "amber";
if (greenCount > amberCount && greenCount > redCount) {
scorecardColor = "green";
} else if (redCount >= greenCount && redCount >= amberCount) {
scorecardColor = "red";
}
ruleBasedScorecard.setScore(scorecardScore, scorecardColor);
return scorecard;
} else {
this.initScorecardClient();
if (scoringMethod.equalsIgnoreCase("ml")) {
final MLScorecard mlScorecard = scorecard.getMlScorecard();
final MLScorecardFields loanScorecardFields = mlScorecard.getScorecardFields();
final PredictionResponse response = this.fetchScorecard(loanScorecardFields, scoringModel);
if (response != null) {
mlScorecard.setPredictionResponse(BigDecimal.valueOf(response.getProbability()),
response.getLabel(), response.getRequestId());
}
} else if (scoringMethod.equalsIgnoreCase("stat")) {
final StatScorecard statScorecard = scorecard.getStatScorecard();
final MLScorecardFields loanScorecardFields = statScorecard.getScorecardFields();
final PredictionResponse response = this.fetchScorecard(loanScorecardFields, scoringModel);
if (response != null) {
final String method = response.getMethod();
final String color = response.getColor();
final BigDecimal probability = BigDecimal.valueOf(response.getProbability());
BigDecimal wilikis = null;
BigDecimal pillaisTrace = null;
BigDecimal hotelling = null;
BigDecimal roys = null;
if (method.equalsIgnoreCase("manova")) {
wilikis = BigDecimal.valueOf(response.getWilkisLambda());
pillaisTrace = BigDecimal.valueOf(response.getPillaisTrace());
hotelling = BigDecimal.valueOf(response.getHotellingTawley());
roys = BigDecimal.valueOf(response.getRoysReatestRoots());
}
statScorecard.setPredictionResponse(method, color, probability, wilikis, pillaisTrace, hotelling, roys);
}
}
}
} else {
return null;
}
this.scorecardRepository.save(scorecard);
return scorecard;
}