Spaces:
Configuration error
Configuration error
| import streamlit as st | |
| import pandas as pd | |
| import hashlib | |
| from sqlalchemy import create_engine | |
| from Data import credentials | |
| from streamlit_option_menu import option_menu | |
| import os | |
| from apps import Covid19, Scoring, Comentarios, Tasas, analisis_inmob,\ | |
| Comandos_utiles, simulacion_vc, Mails_Analistas, Panel_de_control,\ | |
| Mom_industrias, admin_portal, Clustering, companies | |
| class MultiApp: | |
| """Framework for combining multiple streamlit applications. | |
| Usage: | |
| def foo(): | |
| st.title("Hello Foo") | |
| def bar(): | |
| st.title("Hello Bar") | |
| app = MultiApp() | |
| app.add_app("Foo", foo) | |
| app.add_app("Bar", bar) | |
| app.run() | |
| It is also possible keep each application in a separate file. | |
| import foo | |
| import bar | |
| app = MultiApp() | |
| app.add_app("Foo", foo.app) | |
| app.add_app("Bar", bar.app) | |
| app.run() | |
| """ | |
| def __init__(self): | |
| self.apps = [] | |
| def add_app(self, title, func): | |
| """Adds a new application. | |
| Parameters | |
| ---------- | |
| func: | |
| the python function to render this app. | |
| title: | |
| title of the app. Appears in the dropdown in the sidebar. | |
| """ | |
| self.apps.append({ | |
| "title": title, | |
| "function": func | |
| }) | |
| def run(self): | |
| if len(self.apps) > 1: | |
| app = st.selectbox( | |
| '', | |
| self.apps, | |
| format_func=lambda app: app['title']) | |
| st.session_state['Subvista'] = app['title'] | |
| app['function']() | |
| else: | |
| self.apps[0]['function']() | |
| class Auth: | |
| ''' | |
| Clase generada para el proceso de autenticaci贸n | |
| esta clase permite el acceso a las distintas vistas del portal a trav茅s de | |
| la contrase帽a y el usuario | |
| ''' | |
| def __init__(self): | |
| self.user = "" | |
| self.password = "" | |
| self.state = "" | |
| self.cargo = "" | |
| self.mail = "" | |
| def log_in(self, user, password): | |
| url = credentials.credentials_postgresql["POSTGRESQL"] | |
| engine = create_engine(url, echo=False) | |
| credenciales = pd.read_sql_query("""select * from credenciales""", | |
| con=engine) | |
| credenciales.columns = ['Usuario', 'Password', 'Area', 'Cargo', | |
| 'Mail', 'Nombre'] | |
| credenciales = credenciales[credenciales["Usuario"] == user] | |
| if len(credenciales) > 0: | |
| password_enc = hashlib.sha256(password.encode()).hexdigest() | |
| passw = credenciales.iloc[0]["Password"] | |
| if password_enc == passw: | |
| self.area = credenciales.iloc[0]["Area"] | |
| self.user = credenciales.iloc[0]["Usuario"] | |
| self.mail = credenciales.iloc[0]["Mail"] | |
| self.cargo = credenciales.iloc[0]["Cargo"] | |
| self.state = password_enc == passw | |
| elif password == "": | |
| self.state="" | |
| else: | |
| self.state = False | |
| class ViewPortal: | |
| ''' | |
| Esta clase permite asignar vistas a las distintas areas de LV las vistas | |
| distintas vistas desarrolladas y asginar distinas funciones a las vistas | |
| correspondientes | |
| Para a帽adir una vista se debe agregar una nueva key en dict_app con el | |
| nombre respectivo a esa vista | |
| Para agregar una subvista, se debe a帽adir en el value de la key | |
| correspondiente a la vista a la cual se quiere asignar | |
| ''' | |
| def __init__(self): | |
| self.user = "" | |
| self.area = "" | |
| self.mail= "" | |
| dict_area = {"Data Science": ["Home"] + | |
| sorted(["An谩lisis Inmobiliario", | |
| "Notas Analistas", | |
| "Covid-19", "Macro", | |
| "Scoring", | |
| "Noticias Equity LATAM", | |
| "LarrAI", | |
| "Comandos Utiles", | |
| "Panel de Control", | |
| "Momentum de Industrias", | |
| "Admin Portal", | |
| "Clustering", | |
| "Index Constructor"]), | |
| "Equity Latam": ["Home"] + | |
| sorted(["Macro", | |
| "Noticias Equity LATAM", | |
| "Notas Analistas", | |
| "Scoring", | |
| "Momentum de Industrias", | |
| "Clustering", | |
| "Index Constructor"]), | |
| "Inmobiliario": ["An谩lisis Inmobiliario"], | |
| "Proyectos": ["LarrAI", "An谩lisis Inmobiliario"], | |
| "Covid": ["Covid-19"], | |
| "Directorio": ["Home"] + sorted(["Momentum de Industrias", | |
| "Clustering", | |
| "Notas Analistas", | |
| "Covid-19", | |
| "Macro", | |
| "Scoring"]) | |
| } | |
| dict_app = { | |
| "An谩lisis Inmobiliario": { | |
| "An谩lisis General": | |
| analisis_inmob.run_scrapping, | |
| "An谩lisis Focalizado": | |
| analisis_inmob.scraping_localizado | |
| }, | |
| "Notas Analistas": { | |
| "Ver Notas": Comentarios.ver_nota, | |
| "Estadisticas": Comentarios.estadisticas, | |
| }, | |
| "Admin Equity LATAM": { | |
| "Asignar analistas a empresas": | |
| Comentarios.asignar_analista, | |
| 'Claves': | |
| Comentarios.save_password | |
| }, | |
| "Covid-19": { | |
| "Movilidad": Covid19.Movilidad, | |
| "Correlacion_GT": Covid19.Correlacion_GT, | |
| "Vacunacion": Covid19.vacunas | |
| }, | |
| "Macro": { | |
| "View Macro": Tasas.view_macro, | |
| "Tasas": Tasas.bonos, | |
| "Pendiente": Tasas.tasa10y_2y, | |
| "Commodities": Tasas.Commodities, | |
| "Indices": Tasas.Indices, | |
| "Divisas": Tasas.Divisas, | |
| "Curva Yield": Tasas.curva_yield | |
| }, | |
| "Scoring": { | |
| "General": Scoring.general, | |
| "Diagrama": Scoring.diagrama | |
| }, | |
| "LarrAI": { | |
| "Explorar data": | |
| simulacion_vc.explorar_data, | |
| "Prototipo simulaci贸n": | |
| simulacion_vc.prototipo_simulacion, | |
| "Simulaci贸n volatilidad en 3 periodos": | |
| simulacion_vc.sim_norm, | |
| "Simulacion volatilidad dinamica": | |
| simulacion_vc.sim_2, | |
| "Simulacion proyectos inmobiliarios": | |
| simulacion_vc.sim_inmob, | |
| "Simulacion ingreso clientes": | |
| simulacion_vc.sim_ingreso_clientes, | |
| "Candidatos": | |
| simulacion_vc.candidatos | |
| }, | |
| "Noticias Equity LATAM": { | |
| "Escribir mail": | |
| Mails_Analistas.escribir_mails2, | |
| "Ver mails": | |
| Mails_Analistas.ver_mails | |
| }, | |
| "Comandos Utiles": { | |
| "Comandos Utiles": Comandos_utiles.comandos_utiles | |
| }, | |
| "Panel de Control": { | |
| "Panel de Control": Panel_de_control.panel_de_control | |
| }, | |
| "Momentum de Industrias": { | |
| "Medias M贸viles": Mom_industrias.medias_moviles, | |
| "StN": Mom_industrias.signal_to_noise, | |
| "Difusi贸n": Mom_industrias.difusion | |
| }, | |
| "Admin Portal": { | |
| "Admin Portal": admin_portal.logs_portal, | |
| "Editar credenciales": admin_portal.edit_credentials | |
| }, | |
| "Clustering": { | |
| "Correlaciones": Clustering.clustering_basado_en_correlacion, | |
| "DTW": Clustering.clustering_con_dtw | |
| }, | |
| "Index Constructor":{ | |
| "Index Constructor": companies.index_constructor | |
| } | |
| } | |
| self.dict_apps = dict_app | |
| self.dict_area = dict_area | |
| def set_user(self, user, area, mail, cargo): | |
| self.user = user | |
| self.area = area | |
| self.mail = mail | |
| self.cargo = cargo | |
| def set_app(self, dict_apps): | |
| self.dict_apps = dict_apps | |
| def set_area(self, dict_area): | |
| self.dict_area = dict_area | |
| def run_views(self): | |
| ''' | |
| Con la funci贸n run_views se corren las vistas asginadas al | |
| usuario respectivo, generando las vistas en la sidebar y las subivistas | |
| ''' | |
| app = MultiApp() | |
| menu = self.dict_area[self.area] | |
| if self.user == "alehmann": | |
| menu.append("An谩lisis Inmobiliario") | |
| if self.cargo == "PM" or self.user == 'bull': | |
| menu.insert(1, "Admin Equity LATAM",) | |
| with st.sidebar: | |
| rad = option_menu("Navegaci贸n",menu, | |
| menu_icon="app-indicator", | |
| default_index=0, styles={ | |
| "container": {"margin": "0px", | |
| "background-color": "#fafafa"}, | |
| "icon": { "font-size": "10px"}, | |
| "nav-link": {"font-size": "15px", | |
| "text-align": "left", | |
| "margin":"0px", | |
| "--hover-color": "#eee"}, | |
| } | |
| ) | |
| # rad = st.sidebar.radio("", menu) | |
| if rad == "Home": | |
| col1, col2 = st.columns((7, 2)) | |
| col1.subheader("Hola " + self.user + ",") | |
| col1.title("Bienvenido al Portal LVAM") | |
| for name in self.dict_area[self.area]: | |
| if rad == name and rad != "Home": | |
| st.session_state['Funcion'] = name | |
| col1, col2 = st.columns((7, 2)) | |
| col1.markdown(""" | |
| # {Name} | |
| """.format(Name=name)) | |
| if rad == "Notas Analistas" and self.cargo == "Investment Analyst": | |
| app.add_app("Ingresar nota", Comentarios.ingresar_nota) | |
| for aplicacion in list(self.dict_apps[name].keys()): | |
| dic = self.dict_apps[name] | |
| app.add_app(aplicacion, dic[aplicacion]) | |
| # st.write('Para dejar tu feedback accede al siguiente [formulario](https://forms.office.com/Pages/ResponsePage.aspx?id=mpR0wfr-_kmELD83ivOlRhEm1JCbNapEi4UG-t7FamlUM0VNTUU4TFpXNzBQTFM2NEo4RzhWVFk3Si4u)') | |
| app.run() | |
| # col2.image("img/logoDSTD.png") | |