|
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") |
|
|
|
|
|
|
|
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.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) |
|
|
|
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() |
|
|
|
|
|
|
|
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 |
|
} |
|
no_button = st.button("No :thumbsdown:", key="no_button") |
|
if no_button: |
|
st.session_state.eval_selected = True |
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|