Пример #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)
Пример #2
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,
    )