import streamlit as st import pandas as pd import logging from deeploy import Client from utils import get_request_body, get_fake_certainty, get_model_url, get_random_suspicious_transaction from utils import get_explainability_texts, get_explainability_values from utils import COL_NAMES, feature_texts from visual_components import create_data_input_table, create_table, ChangeButtonColour logging.basicConfig(level=logging.INFO) st.set_page_config(layout="wide") data = pd.read_pickle("data/preprocessed_data.pkl") # data = data.drop('isFraud', axis=1) # Disable the submit button after it is clicked def disable(): st.session_state.disabled = True # Initialize disabled for form_submit_button to False if "disabled" not in st.session_state: st.session_state.disabled = False st.markdown(""" """, unsafe_allow_html=True) with st.sidebar: # Add deeploy logo st.image("deeploy_logo.png", width=270) # Ask for model URL and token host = st.text_input("Host (changing is optional)", "app.deeploy.ml") model_url, workspace_id, deployment_id = get_model_url() deployment_token = st.text_input("Deeploy Model Token", "my-secret-token") if deployment_token == "my-secret-token": st.warning( "Please enter Deeploy API token." ) else: st.button("Get suspicious transaction", key="predict_button", help="Click to get a suspicious transaction", use_container_width=True, on_click=disable, disabled=st.session_state.disabled ) #on_click=lambda: st.experimental_rerun() ChangeButtonColour("Get suspicious transaction", '#FFFFFF', "#00052D")#'#FFFFFF', "#00052D" # define client optsions and instantiate client client_options = { "host": host, "deployment_token": deployment_token, "workspace_id": workspace_id, } client = Client(**client_options) # st.text(client_options) # st.text(deployment_id) if "predict_button" not in st.session_state: st.session_state.predict_button = False st.title("Money Laundering System") st.divider() st.info( "Fill in left hand side and click on button to observe a potential fraudulent transaction" ) if st.session_state.predict_button: try: with st.spinner("Loading..."): datapoint_pd = get_random_suspicious_transaction(data) request_body = get_request_body(datapoint_pd) # Call the explain endpoint as it also includes the prediction exp = client.explain(request_body=request_body, deployment_id=deployment_id) shap_values = exp['explanations'][0]['shap_values'] col1, col2 = st.columns(2) with col1: create_data_input_table(datapoint_pd, COL_NAMES) with col2: certainty = get_fake_certainty() st.metric(label='#### Model Certainty', value=certainty) explainability_texts, sorted_indices = get_explainability_texts(shap_values, feature_texts) explainability_values = get_explainability_values(sorted_indices, datapoint_pd) create_table(explainability_texts, explainability_values, 'Important Suspicious Variables: ') st.divider() # Add prediction evaluation st.subheader("Prediction Evaluation") st.write("Do you agree with the prediction?") yes_button = st.button("Yes :thumbsup:", key="yes_button") if 'eval_selected' not in st.session_state: st.session_state['eval_selected'] = False if yes_button: st.session_state.eval_selected = True st.session_state.evaluation_input = { "result": 0 # Agree with the prediction } no_button = st.button("No :thumbsdown:", key="no_button") if no_button: st.session_state.eval_selected = True # desired_output = not predictions[0] # st.session_state.evaluation_input = { # "result": 1, # Disagree with the prediction # "value": {"predictions": [desired_output]}, # } success = False if st.session_state.eval_selected: comment = st.text_input("Would you like to add a comment?") if comment: st.session_state.evaluation_input["explanation"] = comment logging.debug("Selected feedback:" + str(st.session_state.evaluation_input)) if st.button("Submit", key="submit_button"): st.session_state.eval_selected = False # success = send_evaluation(client, deployment_id, request_log_id, prediction_log_id, st.session_state.evaluation_input) if success: st.session_state.eval_selected = False st.success("Feedback submitted successfully.") except Exception as e: logging.error(e) st.error( "Failed to retrieve the prediction or explanation." + "Check whether you are using the right model URL and Token. " + "Contact Deeploy if the problem persists." ) st.session_state.successful_call = False