Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import numpy as np
|
| 4 |
+
import base64, pickle
|
| 5 |
+
import plotly.express as px
|
| 6 |
+
from streamlit_plotly_events import plotly_events
|
| 7 |
+
|
| 8 |
+
# ---------------------------------------------------
|
| 9 |
+
# Decode embedded data
|
| 10 |
+
# ---------------------------------------------------
|
| 11 |
+
filled_matrices_encoded = "gASVhzAAAAAAAAB9lCiMCVlhbyBaaGVuZ5SMEXBhbmRhcy5jb3JlLmZyYW1llIwJRGF0YUZyYW1llJOUKYGUfZQojARfbWdylIwecGFuZGFzLmNvcmUuaW50ZXJuYWxzLm1hbmFnZXJzlIwMQmxvY2tNYW5hZ2VylJOUjBZwYW5kYXMuX2xpYnMuaW50ZXJuYWxzlIwPX3VucGlja2xlX2Jsb2NrlJOUjBZudW1weS5fY29yZS5tdWx0aWFycmF5lIwMX3JlY29uc3RydWN0lJOUjAVudW1weZSMB25kYXJyYXmUk5RLAIWUQwFilIeUUpQoSwFLBEsHhpRoEYwFZHR5cGWUk5SMAmY4lImIh5RSlChLA4wBPJROTk5K/////0r/////SwB0lGKIQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPw/AAAAAAAAC0AAAAAAAADYPwAAAAAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOg/AAAAAAAA0D8AAAAAAAAAAAAAAAAAAMA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2D8AAAAAAADAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJR0lGKMCGJ1aWx0aW5zlIwFc2xpY2WUk5RLAEsESwGHlFKUSwKHlFKUhZRdlCiMGHBhbmRhcy5jb3JlLmluZGV4ZXMuYmFzZZSMCl9uZXdfSW5kZXiUk5RoK4wFSW5kZXiUk5R9lCiMBGRhdGGUaBBoE0sAhZRoFYeUUpQoSwFLBIWUaBqMAk84lImIh5RSlChLA4wBfJROTk5K/////0r/////Sz90lGKJXZQojBJBZHZhbmNpbmcgYXV0b25vbXmUjCdJbnRlcmFjdGluZyB3aXRoIG9yZ2FuaWMvbGl2aW5nIHN5c3RlbXOUjBVBaWRpbmcgc3VzdGFpbmFiaWxpdHmUjBtHcm93aW5nIHRoZSBpbmZvcm1hdGlvbiBhZ2WUZXSUYowEbmFtZZROdYaUUpRoLWgvfZQoaDFoEGgTSwCFlGgVh5RSlChLAUsHhZRoOIldlCiMbU5hbm8gbWF0ZXJpYWxzLCBmYWJyaWNhdGlvbiAmIGRldmljZXMgKGVsZWN0cm9uaWMsIHBob3RvbmljIGFuZCBiaW9sb2dpY2FsKSwgaGV0ZXJvZ2VuZW91cyBzeXN0ZW0gaW50ZWdyYXRpb26UjFxTZW5zaW5nLCBzdGltdWxhdGlvbiwgY29tbXVuaWNhdGlvbiAoZWxlY3Ryb25pYywgcGhvdG9uaWMsIGJpb2xvZ2ljYWwpLCBhbGwgZm9ybXMgb2YgaW1hZ2luZ5SMLlF1YW50dW0gZW5naW5lZXJpbmcgYW5kIGluZm9ybWF0aW9uIHByb2Nlc3NpbmeUjCdFbmVyZ3kgY29udmVyc2lvbiwgdHJhbnNmZXIgYW5kIHN0b3JhZ2WUjENFeHRyYWN0aW5nIGluZm9ybWF0aW9uIGZyb20gZGF0YSwgZGF0YSBzY2llbmNlIGFuZCBtYWNoaW5lIGxlYXJuaW5nlIxqQ29tcGxleCBzeXN0ZW0gZGVzaWduLCBjb250cm9sIGFuZCBvcHRpbWl6YXRpb24sIGluY2x1ZGluZyBuZXR3b3Jrcywgc2VjdXJpdHksIHByaXZhY3ksIHNhZmV0eSwgcm9idXN0bmVzc5SMTUNvbXB1dGluZyBzeXN0ZW1zIGFuZCBhcmNoaXRlY3R1cmUsIGRlc2lnbiBhdXRvbWF0aW9uIGFsZ29yaXRobXMgYW5kIHNvZnR3YXJllGV0lGJoQU51hpRSlGWGlFKUjARfdHlwlIwJZGF0YWZyYW1llIwJX21ldGFkYXRhlF2UjAVhdHRyc5R9lIwGX2ZsYWdzlH2UjBdhbGxvd3NfZHVwbGljYXRlX2xhYmVsc5SIc3VijAtIYW95dWUgVGFuZ5RoBCmBlH2UKGgHaApoDWgQaBNLAIWUaBWHlFKUKEsBSwRLB4aUaB2IQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANA/AAAAAAAAAAAAAAAAAADAPwAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwD8AAAAAAADgPwAAAAAAAOw/AAAAAAAAAAAAAAAAAADAPwAAAAAAAAxAAAAAAAAAwD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA8j8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwD8A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"
|
| 12 |
+
df_encoded = "gASVJhkAAAAAAACMEXBhbmRhcy5jb3JlLmZyYW1llIwJRGF0YUZyYW1llJOUKYGUfZQojARfbWdylIwecGFuZGFzLmNvcmUuaW50ZXJuYWxzLm1hbmFnZXJzlIwMQmxvY2tNYW5hZ2VylJOUjBZwYW5kYXMuX2xpYnMuaW50ZXJuYWxzlIwPX3VucGlja2xlX2Jsb2NrlJOUjBZudW1weS5fY29yZS5tdWx0aWFycmF5lIwMX3JlY29uc3RydWN0lJOUjAVudW1weZSMB25kYXJyYXmUk5RLAIWUQwFilIeUUpQoSwFLBksZhpRoD4wFZHR5cGWUk5SMAk84lImIh5RSlChLA4wBfJROTk5K/////0r/////Sz90lGKJXZQojApBYXJvbiBPaHRhlIwTQW5kZXJzIEjDuHN0LU1hZHNlbpSMC0FudGhvbnkgS3VolIwNQm9yaXMgTXVybWFubpSMC0RhaXN5IEdyZWVulIwLRGFuaWVsIERyZXeUjA5EYXJyZW4gQ2FybHNvbpSMDEdhbGVuIFNhc2FraZSMDkfDvHJkYWwgQXJzbGFulIwLSGFucWluZyBHdW+UjApIYW9mYW4gQ2FplIwLSGFveXVlIFRhbmeUjAxJZ29yIE1vbHlib2eUjA5KZWZmcmV5IFdlbGRvbpSMDEplbm5pZmVyIE90dJSMCkp1bmUgWmhhbmeUjApMaXV3YW4gWmh1lIwNTXVyYWQgSG9zc2FpbpSMGU5hcmF5YW5hIFByYXNhZCBTYW50aGFuYW2UjBNPbGdhIEJvcmnEhy1MdWJlY2tllIwRVmljdG9yIE0uIEx1YmVja2WUjA5WaW5vZCBNYWxob3RyYZSMEFdheW5lIEEuIFNoaXJvbWGUjAlZYW8gWmhlbmeUjAxZaW5nZmVpIERvbmeUjAJFUJSMA1NEU5RoOWg4aDloOYwEQ0VOR5RoOmg5aDpoOmg5aDloOGg4aDloOmg5aDloOGg4aDhoOGg6aDqMBlNlbmlvcpRoO2g7aDuMBkp1bmlvcpRoPGg8jAZNaWRkbGWUaD1oPGg8aDxoPGg9aDxoPWg8aDxoO2g7aDtoPWg7aD1oO4wTTUVNUyAmIE1pY3JvZGV2aWNlc5SMIkNvbW11bmljYXRpb25zICYgU2lnbmFsIFByb2Nlc3NpbmeUjCRTaWduYWwgUHJvY2Vzc2luZyAmIE1hY2hpbmUgTGVhcm5pbmeUjB5BbmFsb2cgJiBNaXhlZC1TaWduYWwgQ2lyY3VpdHOUjCJTaWduYWwgUHJvY2Vzc2luZyAmIEVuZXJneSBTeXN0ZW1zlIwSUm9ib3RpY3MgJiBDb250cm9slIwcQ3liZXItUGh5c2ljYWwgJiBJb1QgU3lzdGVtc5SMFkNvbW11bmljYXRpb24gTmV0d29ya3OUjA9Db250cm9sIFN5c3RlbXOUjBJDeWJlcnNlY3VyaXR5ICYgQUmUjBNXaXJlbGVzcyBOZXR3b3JraW5nlIwRQUkgJiBPcHRpbWl6YXRpb26UaEmMFk5hbm9lbGVjdHJvbmljcyAmIENNT1OUjBNTb2xpZC1TdGF0ZSBEZXZpY2VzlIwWRGF0YSAmIE5ldHdvcmsgU2NpZW5jZZSMC0FJIFNlY3VyaXR5lIwWQmlvbWVkaWNhbCBFbmdpbmVlcmluZ5SMHUluZm9ybWF0aW9uIFRoZW9yeSAmIExlYXJuaW5nlIwiTWljcm93YXZlICYgQmlvbWVkaWNhbCBFbmdpbmVlcmluZ5SMH01pY3Jvd2F2ZSBFbmdpbmVlcmluZyAmIFNlbnNvcnOUjCFTZW1pY29uZHVjdG9yIERldmljZXMgJiBQaG90b25pY3OUjBVNaWNyb3dhdmUgRW5naW5lZXJpbmeUjBhXaXJlbGVzcyBDb21tICYgU2VjdXJpdHmUjBhOZXR3b3JrcyAmIEN5YmVyc2VjdXJpdHmUjG9NaWNyb2ZhYnJpY2F0ZWQgZGV2aWNlczsgTUVNUzsgYmlvbWVkaWNhbCBtaWNyb2RldmljZXM7IG1pY3JvZmx1aWRpY3M7IG9wdG9mbHVpZGljczsgcmVjb25maWd1cmFibGUgZWxlY3Ryb25pY3OUjEpTdGF0aXN0aWNhbCBzaWduYWwgcHJvY2Vzc2luZzsgaW5mb3JtYXRpb24gdGhlb3J5OyB3aXJlbGVzcyBjb21tdW5pY2F0aW9uc5SMYk5ldXJhbCBuZXR3b3JrczsgbWFjaGluZSBsZWFybmluZzsgYWRhcHRpdmUgc2lnbmFsIHByb2Nlc3Npbmc7IHNlbnNvciBuZXR3b3Jrczsgc21hcnQgZ3JpZCBzeXN0ZW1zlIxvTWl4ZWQtc2lnbmFsIElDIGRlc2lnbjsgc2Vuc29yIGludGVyZmFjZXM7IEEvRCBhbmQgRC9BIGNvbnZlcnRlcnM7IGhpZ2gtc3BlZWQgbGlua3M7IFRpbnlNTCBoYXJkd2FyZTsgRURBIHRvb2xzlIxnU2lnbmFsIHByb2Nlc3Npbmc7IGVzdGltYXRpb247IG1hY2hpbmUgbGVhcm5pbmc7IGNvbnRyb2wgZm9yIGNvbmRpdGlvbiBtb25pdG9yaW5nIGFuZCBlbmVyZ3kgbWFuYWdlbWVudJSMUkF1dG9ub21vdXMgbWljcm8tcm9ib3RzOyBtdWx0aS1yb2JvdCBzeXN0ZW1zOyBjb250aW51dW0gcm9ib3RpY3M7IGFkYXB0aXZlIGNvbnRyb2yUjGtDeWJlci1waHlzaWNhbCBzeXN0ZW1zOyB1YmlxdWl0b3VzIGNvbXB1dGluZzsgSW50ZXJuZXQgb2YgVGhpbmdzOyBlZGdlIGNvbXB1dGluZzsgaW50ZXJhY3RpdmUgZGlnaXRhbCBtZWRpYZSMWENvbW11bmljYXRpb24gbmV0d29ya3M7IG9wdGljYWwgbmV0d29ya2luZzsgbmV0d29yayBvcHRpbWl6YXRpb247IHBlcmZvcm1hbmNlIGV2YWx1YXRpb26UjDdDb29wZXJhdGl2ZSBtdWx0aS1hZ2VudCBzeXN0ZW1zOyBnYW1lLXRoZW9yZXRpYyBjb250cm9slIwtQ3liZXJzZWN1cml0eTsgdHJ1c3R3b3J0aHkgQUk7IG1vYmlsZSBzZW5zaW5nlIxLV2lyZWxlc3MgbmV0d29ya2luZzsgSW50ZXJuZXQgb2YgVGhpbmdzOyBtb2JpbGUgY29tcHV0aW5nOyBuZXR3b3JrIHNlY3VyaXR5lIxTSW5mb3JtYXRpb24gdGhlb3J5OyBzdG9jaGFzdGljIG9wdGltaXphdGlvbjsgc2VtYW50aWMgbmV0d29ya2luZzsgZ2VuZXJhdGl2ZSBtb2RlbHOUjF9TY2FsYWJsZSBtYWNoaW5lIGxlYXJuaW5nIGFsZ29yaXRobXM7IGdlbmVyYXRpdmUgQUkgdHJhaW5pbmc7IG9wdGltaXphdGlvbiBmb3IgbGVhcm5pbmcgc3lzdGVtc5SMdU5hbm9zY2FsZSBkZXZpY2UgZGVzaWduOyBlbWVyZ2luZyBzZW1pY29uZHVjdG9yIHRlY2hub2xvZ2llczsgaGV0ZXJvZ2VuZW91cyBDTU9TIGludGVncmF0aW9uOyBuYW5vLWJpb21lZGljYWwgZGV2aWNlc5SMTlNlbWljb25kdWN0b3IgZGV0ZWN0b3JzOyBvcHRvZWxlY3Ryb25pY3M7IHJhZGlhdGlvbiBkZXRlY3Rpb247IHF1YW50dW0gZGV2aWNlc5SMZEdyYXBoIHNpZ25hbCBwcm9jZXNzaW5nOyBuZXR3b3JrIHNjaWVuY2U7IGRhdGEgYW5hbHl0aWNzOyBiaW9pbmZvcm1hdGljczsgaHVtYW4tY29tcHV0ZXIgaW50ZXJhY3Rpb26UjDpNYWNoaW5lIGxlYXJuaW5nIGZvciBjeWJlcnNlY3VyaXR5OyBzZWN1cml0eSBvZiBBSSBzeXN0ZW1zlIxeVWx0cmFzb3VuZC1iYXNlZCBkaWFnbm9zdGljcyBhbmQgdGhlcmFweTsgZWxhc3RvZ3JhcGh5OyBiaW9tZWRpY2FsIHNpZ25hbCBhbmQgaW1hZ2UgcHJvY2Vzc2luZ5SMXVN0YXRpc3RpY2FsIGxlYXJuaW5nIHRoZW9yeTsgaW5mb3JtYXRpb24gdGhlb3J5OyBoaWdoLWRpbWVuc2lvbmFsIHN0YXRpc3RpY3M7IG9ubGluZSBsZWFybmluZ5SMWFNpbGljb24gUkYvaGlnaC1mcmVxdWVuY3kgaW50ZWdyYXRlZCBjaXJjdWl0czsgYmlvbWVkaWNhbCBhcHBsaWNhdGlvbnM7IHJlbmV3YWJsZSBlbmVyZ3mUjGJSZW1vdGUgc2Vuc2luZyBhbmQgaW1hZ2luZzsgYmlvbWVkaWNhbCBzZW5zb3JzOyBhbmltYWwgdHJhY2tpbmc7IE1FTVM7IG1pY3Jvd2F2ZS90ZXJhaGVydHogc3lzdGVtc5SMVENvbXBvdW5kIHNlbWljb25kdWN0b3IgZGV2aWNlczsgc3VyZmFjZSBwYXNzaXZhdGlvbjsgcGhvdG9uaWMvb3B0b2VsZWN0cm9uaWMgZGV2aWNlc5SMSE1pY3Jvd2F2ZSBhbmQgbWlsbGltZXRlci13YXZlIGVsZWN0cm9uaWNzOyBxdWFzaS1vcHRpY2FsIHBvd2VyIGNvbWJpbmluZ5SMPFdpcmVsZXNzIGNvbW11bmljYXRpb25zOyB3aXJlbGVzcyBzZW5zaW5nOyB3aXJlbGVzcyBzZWN1cml0eZSMYUNvbXB1dGVyIGFuZCBuZXR3b3JrIHNlY3VyaXR5OyBwcml2YWN5OyBjb21wdXRlciBuZXR3b3JrczsgSW50ZXJuZXQgc2VydmljZXM7IGRpc3RyaWJ1dGVkIHN5c3RlbXOUjGZNaWNyb3JvYm90aWNzIHdpdGggbWljcm9mbHVpZGljczsgbGFiLW9uLWEtY2hpcCBiaW9tZWRpY2FsIGRldmljZXM7IHJlY29uZmlndXJhYmxlIG9wdG9mbHVpZGljIHN5c3RlbXOUjI1XaXJlbGVzcyBuZXR3b3JrIGNvb3BlcmF0aW9uOyBoZWFydCBtb25pdG9yaW5nIHZpYSB3aXJlbGVzcyBzZW5zb3JzOyB1bmRlcndhdGVyIGFjb3VzdGljIGNvbW11bmljYXRpb25zOyBiaWcgZGF0YSBhbmFseXRpY3MgaW4gY29tbXVuaWNhdGlvbnOUjE5EaXN0cmlidXRlZCBsZWFybmluZyBpbiBzZW5zb3IgbmV0d29ya3M7IHJlbmV3YWJsZSBlbmVyZ3kgc21hcnQgZ3JpZCBhbmFseXRpY3OUjGhFbWJlZGRlZCBtYWNoaW5lIGxlYXJuaW5nIGFjY2VsZXJhdG9ycyAoVGlueU1MKTsgb3Blbi1zb3VyY2UgY2hpcCBkZXNpZ247IGFkdmFuY2VkIGRhdGEgY29udmVydGVyIGRlc2lnbpSMM0J1aWxkaW5nIGVuZXJneSBtb25pdG9yaW5nOyBzbWFydCBncmlkIG9wdGltaXphdGlvbpSMUkluc2VjdC1zY2FsZSByb2JvdHM7IG11bHRpLXJvYm90IHNlbnNvciBkZXBsb3ltZW50OyBtaWNyb3N1cmdpY2FsIGNvbnRpbnV1bSByb2JvdHOUjEVBbWJpZW50IGNvbXB1dGluZyBmcmFtZXdvcmtzIGZvciBJb1Q7IHBoeXNpY2FsIHVzZXIgZXhwZXJpZW5jZSBkZXNpZ26UjE9PcHRpY2FsIG5ldHdvcmsgcm91dGluZyBvcHRpbWl6YXRpb247IGhpZ2gtc3BlZWQgbmV0d29yayByZWxpYWJpbGl0eSBhbGdvcml0aG1zlIxsQXV0b25vbW91cyByZXNvdXJjZSBhbGxvY2F0aW9uOyBtdWx0aS1zZW5zb3IgZGVwbG95bWVudDsgdHJhZmZpYyBtYW5hZ2VtZW50OyBjb29wZXJhdGl2ZSBNSU1PIGNvbW11bmljYXRpb25zlIxgU2VjdXJpdHkgYW5kIHByaXZhY3kgaW4gQUktZW5hYmxlZCBzeXN0ZW1zIChzbWFydCBhdXRoZW50aWNhdGlvbiwgdm9pY2UgYXNzaXN0YW50cywgSW9UIGRldmljZXMplIwpSW9UIGNvbm5lY3Rpdml0eTsgbW9iaWxlIG5ldHdvcmsgc2VjdXJpdHmUjIBEYXRhIGZyZXNobmVzcyBvcHRpbWl6YXRpb247IHNlbWFudGljIHNlbnNpbmcgYW5kIGRhdGEgcmV0cmlldmFsOyBkaWZmdXNpb24tYmFzZWQgaW1hZ2UgaW52ZXJzaW9uOyByaXNrLWF3YXJlIG5ldHdvcmsgc2NoZWR1bGluZ5SMYkVmZmljaWVudCB0cmFpbmluZyBvZiBsYXJnZSBUcmFuc2Zvcm1lciBtb2RlbHM7IG9wdGltaXphdGlvbiBtZXRob2RzIGZvciBoaWdoLWRpbWVuc2lvbmFsIGxlYXJuaW5nlIxVQ2FyYm9uIG5hbm90dWJlIFJGIGNpcmN1aXRzOyBDTU9TIGZvciBkYXRhLWludGVuc2l2ZSBjb21wdXRpbmc7IG5hbm8tc2NhbGUgYmlvc2Vuc29yc5SMdVNpbGljb24gcGl4ZWwgc2Vuc29ycyBmb3IgcGFydGljbGUgcGh5c2ljczsgcHJlY2lzaW9uIHRpbWluZyBzZW5zb3IgZGVzaWduOyBhZHZhbmNlZCB0aGluLWZpbG0gbWF0ZXJpYWxzIGluIGRldGVjdG9yc5SMY01vZGVsaW5nIGxhcmdlLXNjYWxlIHNvY2lhbC9iaW9sb2dpY2FsIG5ldHdvcmtzOyBhbmFseXppbmcgaW5kaXZpZHVhbC10by1uZXR3b3JrIGJlaGF2aW9yYWwgZWZmZWN0c5SMVkFkdmVyc2FyaWFsIGFuZCBiYWNrZG9vciBhdHRhY2tzIG9uIEFJIG1vZGVsczsgZGVlcCBsZWFybmluZy1iYXNlZCBpbnRydXNpb24gZGV0ZWN0aW9ulIxvVWx0cmFzb3VuZCBlbGFzdG9ncmFwaHkgZm9yIG9yZ2FuIGhlYWx0aDsgYnJlYXN0IGNhbmNlciBpbWFnaW5nIGFuZCB0aGVyYXB5OyBmb2N1c2VkIHVsdHJhc291bmQgbmV1cm9tb2R1bGF0aW9ulIxvVW5pdmVyc2FsIGRhdGEgY29tcHJlc3Npb247IGZ1bmRhbWVudGFsIGxpbWl0cyBvZiBzZXF1ZW50aWFsIGxlYXJuaW5nOyBjb21wbGV4aXR5IG9mIHNhbXBsaW5nIGluIGxhcmdlIG5ldHdvcmtzlIw1Tm9uLWNvbnRhY3Qgdml0YWwgc2lnbiBkZXRlY3Rpb247IHdlYXJhYmxlIGJpb3NlbnNvcnOUjFZOb24taW52YXNpdmUgdml0YWwgc2lnbiBtb25pdG9yaW5nOyBVQVYtYmFzZWQgc2Vuc29yIHN5c3RlbXM7IHRlcmFoZXJ0eiB3aXJlbGVzcyBsaW5rc5SMQUdhQXMvSW5QIHN1cmZhY2UgcGFzc2l2YXRpb24gdGVjaG5pcXVlczsgbG93LXBvd2VyIHBob3RvZGV0ZWN0b3JzlIxHU2F0ZWxsaXRlIGNvbW11bmljYXRpb24gYW1wbGlmaWVyczsgbWlsbGltZXRlci13YXZlIGNpcmN1aXQgaW50ZWdyYXRpb26UjFRJb1Qgc2Vuc2luZyBuZXR3b3JrczsgcGh5c2ljYWwtbGF5ZXIgd2lyZWxlc3Mgc2VjdXJpdHk7IGRyb25lIGNvbW11bmljYXRpb24gc2VjdXJpdHmUjF1Bbm9ueW1vdXMgY29tbXVuaWNhdGlvbnM7IGNsb3VkIGFuZCBJb1Qgc2VjdXJpdHk7IFVBViBuZXR3b3JrIHNlY3VyaXR5OyBzbWFydCBncmlkIHByb3RlY3Rpb26UZXSUYowIYnVpbHRpbnOUjAVzbGljZZSTlEsASwZLAYeUUpRLAoeUUpSFlF2UKIwYcGFuZGFzLmNvcmUuaW5kZXhlcy5iYXNllIwKX25ld19JbmRleJSTlGiSjAVJbmRleJSTlH2UKIwEZGF0YZRoDmgRSwCFlGgTh5RSlChLAUsGhZRoG4ldlCiMBE5hbWWUjApEZXB0IFRyYWNrlIwIU3RhbmRpbmeUjAVUcmFja5SMElJlc2VhcmNoIEludGVyZXN0c5SMFlJlY2VudCBSZXNlYXJjaCBUb3BpY3OUZXSUYowEbmFtZZROdYaUUpRolIwZcGFuZGFzLmNvcmUuaW5kZXhlcy5yYW5nZZSMClJhbmdlSW5kZXiUk5R9lChopU6MBXN0YXJ0lEsAjARzdG9wlEsZjARzdGVwlEsBdYaUUpRlhpRSlIwEX3R5cJSMCWRhdGFmcmFtZZSMCV9tZXRhZGF0YZRdlIwFYXR0cnOUfZSMBl9mbGFnc5R9lIwXYWxsb3dzX2R1cGxpY2F0ZV9sYWJlbHOUiHN1Yi4="
|
| 13 |
+
|
| 14 |
+
filled_matrices = pickle.loads(base64.b64decode(filled_matrices_encoded))
|
| 15 |
+
df = pickle.loads(base64.b64decode(df_encoded))
|
| 16 |
+
|
| 17 |
+
# ---------------------------------------------------
|
| 18 |
+
# Sidebar: Filters
|
| 19 |
+
# ---------------------------------------------------
|
| 20 |
+
st.sidebar.title("Filters")
|
| 21 |
+
if st.sidebar.button("Clear All Filters"):
|
| 22 |
+
st.experimental_rerun()
|
| 23 |
+
|
| 24 |
+
standing_opts = sorted(df['Standing'].dropna().astype(str).unique())
|
| 25 |
+
dept_opts = sorted(df['Dept Track'].dropna().astype(str).unique())
|
| 26 |
+
|
| 27 |
+
standing_sel = st.sidebar.multiselect(
|
| 28 |
+
"Filter by Standing:", standing_opts,
|
| 29 |
+
default=standing_opts
|
| 30 |
+
)
|
| 31 |
+
dept_sel = st.sidebar.multiselect(
|
| 32 |
+
"Filter by Dept Track:", dept_opts,
|
| 33 |
+
default=dept_opts
|
| 34 |
+
)
|
| 35 |
+
|
| 36 |
+
# Auto‑filter names based on Standing & Dept
|
| 37 |
+
mask = (
|
| 38 |
+
df['Standing'].astype(str).isin(standing_sel) &
|
| 39 |
+
df['Dept Track'].astype(str).isin(dept_sel)
|
| 40 |
+
)
|
| 41 |
+
all_names = sorted(df['Name'].astype(str).unique())
|
| 42 |
+
name_options = sorted(df.loc[mask, 'Name'].astype(str).unique())
|
| 43 |
+
name_sel = st.sidebar.multiselect(
|
| 44 |
+
"Select Faculty:", name_options,
|
| 45 |
+
default=name_options
|
| 46 |
+
)
|
| 47 |
+
|
| 48 |
+
# ---------------------------------------------------
|
| 49 |
+
# Main app
|
| 50 |
+
# ---------------------------------------------------
|
| 51 |
+
st.title("Faculty Heatmap Explorer")
|
| 52 |
+
|
| 53 |
+
# 1) Heatmap
|
| 54 |
+
if not name_sel:
|
| 55 |
+
st.write("**No faculty selected** — please select at least one name.")
|
| 56 |
+
fig = px.imshow(
|
| 57 |
+
[[0]], labels={'x':'','y':'','color':'value'},
|
| 58 |
+
text_auto='.2f', title="No faculty selected"
|
| 59 |
+
)
|
| 60 |
+
st.plotly_chart(fig, use_container_width=True)
|
| 61 |
+
else:
|
| 62 |
+
# Sum and average matrices
|
| 63 |
+
sum_df = None
|
| 64 |
+
for name in name_sel:
|
| 65 |
+
mat = filled_matrices[name]
|
| 66 |
+
sum_df = mat if sum_df is None else sum_df.add(mat, fill_value=0)
|
| 67 |
+
avg_df = sum_df.div(len(name_sel))
|
| 68 |
+
|
| 69 |
+
fig = px.imshow(
|
| 70 |
+
avg_df,
|
| 71 |
+
x=avg_df.columns,
|
| 72 |
+
y=avg_df.index,
|
| 73 |
+
labels={'color':'Avg value'},
|
| 74 |
+
text_auto='.2f',
|
| 75 |
+
title=f"Avg Heatmap for {len(name_sel)} Faculty"
|
| 76 |
+
)
|
| 77 |
+
fig.update_yaxes(autorange='reversed')
|
| 78 |
+
st.plotly_chart(fig, use_container_width=True)
|
| 79 |
+
|
| 80 |
+
# 2) Click to show details
|
| 81 |
+
st.subheader("Cell Details")
|
| 82 |
+
events = plotly_events(fig, click_event=True, key="heatmap")
|
| 83 |
+
if events:
|
| 84 |
+
x_lab = events[0]['x']
|
| 85 |
+
y_lab = events[0]['y']
|
| 86 |
+
|
| 87 |
+
# Gather non-zero values
|
| 88 |
+
records = []
|
| 89 |
+
for name in name_sel:
|
| 90 |
+
val = filled_matrices[name].at[y_lab, x_lab]
|
| 91 |
+
if val != 0:
|
| 92 |
+
row = df[df['Name']==name].iloc[0]
|
| 93 |
+
records.append({
|
| 94 |
+
'Name': name,
|
| 95 |
+
'Value': val,
|
| 96 |
+
'Dept Track': str(row['Dept Track']),
|
| 97 |
+
'Standing': str(row['Standing'])
|
| 98 |
+
})
|
| 99 |
+
|
| 100 |
+
if records:
|
| 101 |
+
detail_df = pd.DataFrame(records)
|
| 102 |
+
# Dept Track distribution
|
| 103 |
+
dept_df = (
|
| 104 |
+
detail_df.groupby(['Dept Track','Value'])
|
| 105 |
+
.size()
|
| 106 |
+
.reset_index(name='Count')
|
| 107 |
+
)
|
| 108 |
+
fig_dept = px.line(
|
| 109 |
+
dept_df,
|
| 110 |
+
x='Value', y='Count',
|
| 111 |
+
color='Dept Track', markers=True,
|
| 112 |
+
title=f"Distribution by Dept Track (x={x_lab}, y={y_lab})"
|
| 113 |
+
)
|
| 114 |
+
st.plotly_chart(fig_dept, use_container_width=True)
|
| 115 |
+
|
| 116 |
+
# Standing distribution
|
| 117 |
+
stand_df = (
|
| 118 |
+
detail_df.groupby(['Standing','Value'])
|
| 119 |
+
.size()
|
| 120 |
+
.reset_index(name='Count')
|
| 121 |
+
)
|
| 122 |
+
fig_st = px.line(
|
| 123 |
+
stand_df,
|
| 124 |
+
x='Value', y='Count',
|
| 125 |
+
color='Standing', markers=True,
|
| 126 |
+
title=f"Distribution by Standing (x={x_lab}, y={y_lab})"
|
| 127 |
+
)
|
| 128 |
+
st.plotly_chart(fig_st, use_container_width=True)
|
| 129 |
+
|
| 130 |
+
# Table of non-zero values
|
| 131 |
+
table_df = detail_df[['Name','Value']].sort_values('Value', ascending=False)
|
| 132 |
+
st.dataframe(table_df)
|
| 133 |
+
else:
|
| 134 |
+
st.write("**No non-zero values for this cell.**")
|
| 135 |
+
else:
|
| 136 |
+
st.write("Click on a heatmap cell to see Dept/Standing distributions & values.")
|