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)
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, )
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, )