| import streamlit as st |
| import pandas as pd |
| import logging |
| from deeploy import Client |
| from streamlit_extras.stylable_container import stylable_container |
| 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") |
|
|
| st.title("Money Laundering System") |
| st.divider() |
|
|
| data = pd.read_pickle("data/preprocessed_data.pkl") |
| |
|
|
| |
| def disable(): |
| st.session_state.disabled = True |
|
|
| |
| if "disabled" not in st.session_state: |
| st.session_state.disabled = False |
|
|
| st.markdown(""" |
| <style> |
| [data-testid=stSidebar] { |
| background-color: #E0E0E0; ##E5E6EA |
| } |
| </style> |
| """, unsafe_allow_html=True) |
|
|
| with st.sidebar: |
| |
| st.image("deeploy_logo.png", width=270) |
| |
| 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 |
| ) |
| ChangeButtonColour("Get suspicious transaction", '#FFFFFF', "#00052D") |
| |
|
|
| |
| client_options = { |
| "host": host, |
| "deployment_token": deployment_token, |
| "workspace_id": workspace_id, |
| } |
| client = Client(**client_options) |
|
|
| |
| |
|
|
| if "predict_button" not in st.session_state: |
| st.session_state.predict_button = False |
| 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) |
| |
| 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: |
| st.subheader('Prediction Explanation: ') |
| 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.subheader("") |
| |
|
|
| col3, col4 = st.columns(2) |
| |
| with col3: |
| st.button("Send to FIU", key="yes_button", use_container_width=True) |
| ChangeButtonColour("Send to FIU", '#FFFFFF', "#DD360C") |
| if 'eval_selected' not in st.session_state: |
| st.session_state['eval_selected'] = False |
| |
| |
| |
| |
| |
| |
| with col4: |
| st.button("Not money laundering", key="no_button", use_container_width=True) |
| ChangeButtonColour("Not money laundering", '#FFFFFF', "#46B071") |
| |
| |
| |
| |
| |
| |
| |
|
|
| 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 |
| |
| 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 |
|
|
|
|
| |
|
|
| |
|
|
|
|