Exemplo n.º 1
0
def financial_explan_2_per_client(case_id):
    form = FlaskForm(request.form)
    form.case_id = case_id
    form.categories = json.loads(session.get("categories", "{}"))
    form.subdomain = Subdomain.query.get(session.get("subdomain", None))
    ranges_for_feature = session.get("ranges_for_feature", {})
    range_groups_ages = ranges_for_feature.get("Age", [])

    all_case_values_query = CaseValue.query.filter(
        CaseValue.user_data_id == session["user_data_id"])
    all_case_values_query_for_patient = all_case_values_query.filter(
        CaseValue.case_id == case_id)

    form.table_heads = [
        "Categories", "Characteristics", "Attributes", "Contributions"
    ]
    form.table_rows = []
    total_contrib = 0
    for cat_name in form.categories:
        sub_head = [cat_name, "", "", ""]
        form.table_rows += [sub_head]
        sum_contribution = 0
        for feature_name in form.categories[cat_name]:
            feature = Feature.query.filter(
                Feature.name == feature_name).first()
            case_val = all_case_values_query_for_patient.filter(
                CaseValue.feature_id == feature.id).first()
            if feature_name == "Age" or feature_name.startswith("Number"):
                age = int(case_val.value)
                age = age_range_groups(range_groups_ages, age)
                form.table_rows += [[
                    "",
                    feature_name,
                    age,
                    round(case_val.explainer * 100, 3),
                ]]
            else:
                form.table_rows += [[
                    "",
                    feature_name,
                    round(case_val.value, 3),
                    round(case_val.explainer * 100, 3),
                ]]
            sum_contribution += case_val.explainer * 100
        sub_head[3] = round(sum_contribution, 3)
        total_contrib += sum_contribution
    form.table_rows += [["Total", "", "", round(total_contrib, 3)]]
    total_score_name_client = round(total_contrib, 3)

    prediction_score_list = []
    max_patient_id = max([v.case_id for v in all_case_values_query.all()])
    for patient_id in range(max_patient_id + 1):
        all_case_values_query_for_patient = all_case_values_query.filter(
            CaseValue.case_id == patient_id)
        if not all_case_values_query_for_patient.all():
            continue
        age_feature = Feature.query.filter(Feature.name == "Age").first()
        age_case_val = all_case_values_query_for_patient.filter(
            CaseValue.feature_id == age_feature.id).first()
        prediction_score = int(round(age_case_val.prediction, 2) * 100)
        prediction_score_list += [prediction_score]
    sum_prediction_score = sum(prediction_score_list)
    average_default_score = round(sum_prediction_score / (max_patient_id + 1),
                                  2)

    return render_template("financial_explan_2_per_client.html",
                           form=form,
                           total_score_name_client=total_score_name_client,
                           average_default_score=average_default_score)
Exemplo n.º 2
0
def financial_explan_summary():
    form = FlaskForm(request.form)
    categories = json.loads(session.get("categories", "{}"))
    form.subdomain = Subdomain.query.get(session.get("subdomain", None))
    ranges_for_feature = session.get("ranges_for_feature", {})
    range_groups_ages = ranges_for_feature.get("Age", [])
    form.presentation_type = "Percents"
    if form.validate_on_submit():
        form.presentation_type = request.form["presentation_type"]
    elif form.is_submitted():
        flash("Invalid data", "warning")

    form.table_heads = [
        "Client ID",
        "Age",
        "Risk of default",
        "Prediction_or_Confidence Score (Out of 100)",
    ]

    form.table_heads += [f"{name} Contribution" for name in categories]

    all_case_values_query = CaseValue.query.filter(
        CaseValue.user_data_id == session["user_data_id"])
    max_patient_id = max([v.case_id for v in all_case_values_query.all()])
    form.table_rows = []
    for patient_id in range(max_patient_id + 1):
        all_case_values_query_for_patient = all_case_values_query.filter(
            CaseValue.case_id == patient_id)
        if not all_case_values_query_for_patient.all():
            continue
        age_feature = Feature.query.filter(Feature.name == "Age").first()
        age_case_val = all_case_values_query_for_patient.filter(
            CaseValue.feature_id == age_feature.id).first()
        age = int(age_case_val.value)
        age = age_range_groups(range_groups_ages, age)
        prediction_score = int(round(age_case_val.prediction, 2) * 100)
        predicted = "No" if prediction_score < 10 else "Yes"
        prediction_score_color = "green"
        if prediction_score >= 10 and prediction_score <= 24:
            prediction_score_color = "yellow"
        elif prediction_score > 24:
            prediction_score_color = "red"

        row = [
            (patient_id, None),
            (age, None),
            (predicted, None),
            (prediction_score, prediction_score_color),
        ]
        explainers = []
        explainers_abs_values = []
        for cat_name in categories:
            sum_explainer = 0
            for feature_name in categories[cat_name]:
                feature = Feature.query.filter(
                    Feature.name == feature_name).first()
                case_val = all_case_values_query_for_patient.filter(
                    CaseValue.feature_id == feature.id).first()
                sum_explainer += case_val.explainer
            explainers += [sum_explainer]
            explainers_abs_values += [abs(sum_explainer)]
        # if not selected percentage
        cells = None

        if form.presentation_type == "Percents":
            hundred = sum(explainers_abs_values)
            values = list(
                map(lambda val: int(round(val * 100 / hundred, 0)),
                    explainers))
            max_val = max(values)
            colors = list(
                map(lambda val: ("red" if val == max_val else None), values))
            values = map(lambda val: f"{val}%", values)
            cells = list(zip(values, colors))
        else:
            values = list(map(lambda val: (round(val * 100, 2)), explainers))
            max_val = max(values)
            colors = list(
                map(lambda val: ("red" if val == max_val else None), values))
            cells = list(zip(values, colors))
        row += cells
        form.table_rows += [row]

    return render_template(
        "financial_explan_summary.html",
        form=form,
        range_groups_ages=range_groups_ages,
        len=len,
    )
Exemplo n.º 3
0
def explanations_per_patient(case_id):
    form = FlaskForm(request.form)
    form.selected_features = session.get("selected_features", [])
    form.categories = json.loads(session.get("categories", "{}"))
    form.subdomain = Subdomain.query.get(session.get("subdomain", None))
    ranges_for_feature = session.get("ranges_for_feature", {})
    range_groups_ages = ranges_for_feature.get("Age", [])
    all_case_values_query = CaseValue.query.filter(
        CaseValue.user_data_id == session["user_data_id"])
    all_case_values_query_for_patient = all_case_values_query.filter(
        CaseValue.case_id == case_id)
    form.presentation_type = "Proportional to the Total Confidence Score"

    if form.validate_on_submit():
        form.presentation_type = request.form["presentation_type"]
    elif form.is_submitted():
        flash("Invalid data", "warning")

    form.table_heads = []
    sum_explainer = {}
    sum_explainer_abs = {}
    for cat_name in form.categories:
        sum_explainer[cat_name] = 0
        sum_explainer_abs[cat_name] = 0
        for feature_name in form.categories[cat_name]:
            feature = Feature.query.filter(
                Feature.name == feature_name).first()
            case_val = all_case_values_query_for_patient.filter(
                CaseValue.feature_id == feature.id).first()
            sum_explainer[cat_name] += case_val.explainer
            sum_explainer_abs[cat_name] += abs(case_val.explainer)
        form.table_heads += [[
            cat_name,
        ], "Feature Contribution"]
    form.table_rows = []
    num_of_rows = max([len(form.categories[k]) for k in form.categories])
    for cat_name in form.categories:
        row_index = 0
        for feature_name in form.categories[cat_name]:
            if len(form.table_rows) <= row_index:
                form.table_rows += [[]]
            feature = Feature.query.filter(
                Feature.name == feature_name).first()
            case_val = all_case_values_query_for_patient.filter(
                CaseValue.feature_id == feature.id).first()
            if form.presentation_type == "Proportional to the Total Confidence Score":
                one_square_val = sum(sum_explainer_abs.values()) / 12
                square_num = int(
                    round(abs(case_val.explainer) / one_square_val, 0))
                form.table_rows[row_index] += [[
                    feature_name, gen_squares_code(square_num)
                ]]
            else:
                each_category_squares = 12 / len(form.categories)
                value_of_square = int(round(100 / each_category_squares, 0))
                sum_explainer_category = sum_explainer_abs[cat_name]
                feature_explainer = int(
                    (case_val.explainer / sum_explainer_category) * 100)
                feature_squares = int(
                    round((feature_explainer / value_of_square), 0))
                form.table_rows[row_index] += [[
                    feature_name,
                    gen_squares_code(feature_squares)
                ]]
            row_index += 1
        for i in range(row_index, num_of_rows):
            if len(form.table_rows) <= i:
                form.table_rows += [[]]
            form.table_rows[i] += [["", ""]]
    explainers = sum((list(map(abs, sum_explainer.values()))))
    values = list(
        map(lambda val: int(round(val * 100 / explainers, 0)),
            sum_explainer.values()))
    form.value_percent = max(values)
    for i, percent in enumerate(values):
        form.table_heads[2 * i] += [percent]

    age_feature = Feature.query.filter(Feature.name == "Age").first()
    age_case_val = all_case_values_query_for_patient.filter(
        CaseValue.feature_id == age_feature.id).first()

    form.age = int(age_case_val.value)
    form.age = age_range_groups(range_groups_ages, form.age)
    form.case_id = case_id
    form.prediction_score = prediction_score(age_case_val.prediction)
    form.predicted = predicted(form.prediction_score)

    def check_is_list(val):
        return type(val) is list

    return render_template(
        "explanations_per_patient.html",
        form=form,
        check_is_list=check_is_list,
        enumerate=enumerate,
    )