#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Sep 21 11:53:13 2021 @author: benjaminull """ import numpy as np import streamlit as st import plotly.express as px import pandas as pd import scipy.stats as stats import plotly.express as px import scipy.stats as stats import plotly.graph_objects as go from sqlalchemy import create_engine import pybase64 as base64 import io import matplotlib.pyplot as plt from io import StringIO import pandas as pd @st.cache(allow_output_mutation=True) def read_excel(path): df = pd.read_excel(path) return df @st.cache(allow_output_mutation=True) def read_excel2(path): df = pd.read_excel(path) return df def explorar_data(): df = read_excel('base_personas.xlsx') df2 = read_excel2('base_personas.xlsx') data = df.copy() data2 = df2.copy() l=[] variable = st.selectbox(" ",list(data.columns)) for i in list(data2.columns): if i not in ["FE", "EDAD", variable]: try: data2[i] = data2[i]* data2["FE"] except: pass col1, col2 = st.beta_columns(2) minim = col1.number_input("Edad minima", min_value=0, max_value=105) maxim = col2.number_input("Edad maxima", min_value=0, max_value=105, value=105) data = data[data["EDAD"] < maxim] data = data[data["EDAD"] > minim] data2 = data2[data2["EDAD"] < maxim] data2 = data2[data2["EDAD"] > minim] pond = st.checkbox("Ponderar por FE") import plotly.graph_objects as go if pond: data_f3 = data2.groupby([ variable, "EDAD"]).sum() data_f3 = data_f3.loc[:,data_f3.columns[0]].unstack(level=1).replace(np.nan, 0) st.write(data_f3) fig = go.Figure() for i in list(data_f3.index): fig.add_trace(go.Scatter( x=list(data_f3.columns), y=list(data_f3.loc[i,:]), mode='lines', line=dict(width=0.5), stackgroup='one', groupnorm='percent' # sets the normalization for the sum of the stackgroup )) fig.update_layout( showlegend=True, xaxis_type='category', yaxis=dict( type='linear', range=[1, 100], ticksuffix='%')) st.plotly_chart(fig, use_container_width=True) else: data_f = data.groupby([ variable, "EDAD"]).count() data_f2 = data_f.loc[:,data_f.columns[0]].unstack(level=1).replace(np.nan, 0) st.write(data_f2) fig = go.Figure() for i in list(data_f2.index): fig.add_trace(go.Scatter( x=list(data_f2.columns), y=list(data_f2.loc[i,:]), mode='lines', line=dict(width=0.5), stackgroup='one', groupnorm='percent' # sets the normalization for the sum of the stackgroup )) fig.update_layout( showlegend=True, xaxis_type='category', yaxis=dict( type='linear', range=[1, 100], ticksuffix='%')) st.plotly_chart(fig, use_container_width=True) # pr = data_f2.profile_report() # st_profile_report(data_f2) def transform_df(scraping_df): # Extract numbers from string # Change datatype # Add 'Comuna' and 'Región' scraping_df[["Comuna"]] = scraping_df[[ "direccion"]].applymap(lambda x: get_comuna(x)) # Scrap UF value for date #scraping_df[["Valor UF"]] = get_UF() return scraping_df def get_table_excel_link(df, name): towrite = io.BytesIO() downloaded_file = df.to_excel(towrite, encoding='utf-8', index=False, header=True) towrite.seek(0) # reset pointer file_name = 'Data' + name + '.xlsx' style = 'style="color:black;text-decoration: none; font-size:18px;"' name_mark = "Descargar " + name + ".xlsx" b64 = base64.b64encode(towrite.read()).decode() # some strings linko = f'
' return linko def get_comuna(direction): values = direction.split(',') return values[-2] def formatnum(numero): ''' Esta función permite dar formato a los montos de saldo y valor cuota en las cartolas. ''' return '{:,.0f}'.format(numero).replace(",", "@").replace(".", ",").replace("@", ".") def sim_norm(): with st.form(key='my_form'): col1, col2 = st.beta_columns(2) sim = col1.number_input("Nº Simulaciones", min_value=1, value=100) vc = col2.number_input("Cuota inicial", min_value=100) col1, col2, col3 = st.beta_columns(3) mu = col1.number_input("µ Fondo Arriesgado", value=0.1) sigma = col1.number_input("σ Fondo Arriesgado", value=0.1) mu2 = col2.number_input("µ Fondo Intermedio ", value=0.05) sigma2 = col2.number_input("σ Fondo Intermedio", value=0.05) mu3 = col3.number_input("µ Fondo Conservador", value=-0.01) sigma3 = col3.number_input("σ Fondo Conservador", value=0.03) # t= col1.number_input("Periodo", value=288) # t2 = col2.number_input("Periodo ", value=120) # t3 = col3.number_input("Periodo ", value=72) values = st.slider( 'Seleccione los años de cambio de fondo', 0, 40, (33, 38)) with st.beta_expander("Ajustar parámetros de distribucion de permanencia del cliente (gamma)"): col1, col2 = st.beta_columns(2) alpha = col1.number_input("alpha", value=1.5) beta = col2.number_input("lambda", value=71.1) submit_button = st.form_submit_button(label='Actualizar') if submit_button: t = values[0]*12 t2 = values[1]*12-t t3 = 480-t2-t mu = mu / 12 mu2 = mu2 / 12 mu3 = mu3 / 12 sigma = sigma / (12**(1/2)) sigma2 = sigma2 / (12**(1/2)) sigma3 = sigma3 / (12**(1/2)) var_al = np.random.normal(mu, sigma, size=(t, sim)) var_al2 = np.random.normal(mu2, sigma2, size=(t2, sim)) var_al3 = np.random.normal(mu3, sigma3, size=(t3, sim)) simulacion = np.zeros((t + t2 + t3, sim)) simulacion[0, :] = vc dist_gamma = stats.gamma.rvs(alpha, scale=beta, size=sim).astype(int)+1 for i in range(1, t): simulacion[i, :] = simulacion[i - 1, :] * (1 + var_al[i-1, :]) for i in range(t, t+t2): simulacion[i, :] = simulacion[i - 1, :] * (1 + var_al2[t-i-1, :]) for i in range(t+t2, t+t2+t3): simulacion[i, :] = simulacion[i - 1, :] * \ (1 + var_al3[t2+t-i-1, :]) retornos = np.zeros(sim) for j in range(sim): ingreso = 480-dist_gamma[j] simulacion[0:ingreso, j] = None simulacion[ingreso:480, j] = simulacion[ingreso:480, j] * \ vc/simulacion[ingreso, j] retorno = (simulacion[-1, j]/simulacion[ingreso, j] )**(1/(dist_gamma[j]/12))-1 retornos[j] = retorno df = pd.DataFrame(simulacion) df["meses"] = list(df.index) fig = px.line(df, x="meses", y=df.columns, title='Simulaciones') fig.layout.update(xaxis_rangeslider_visible=True) fig.add_vline(x=t, line_width=3, line_dash="dash", line_color="grey") fig.add_vline(x=t+t2, line_width=3, line_dash="dash", line_color="grey") fig.add_vrect(x0=0, x1=t, annotation_text="Arries", annotation_position="top", fillcolor="red", opacity=0.15, line_width=0) fig.add_vrect(x0=t, x1=t+t2, annotation_text="Inter", annotation_position="top", fillcolor="midnightblue", opacity=0.15, line_width=0) fig.add_vrect(x0=t + t2, x1=t + t2 + t3, annotation_text="Cons", annotation_position="top", fillcolor="seagreen", opacity=0.15, line_width=0) fig.update_layout(height=600, width=950) st.plotly_chart(fig, use_container_width=True) st.subheader("Distribución de duracion de clientes") df_in = pd.DataFrame(dist_gamma//12, columns=["ingreso"]) fig = px.histogram(df_in, x="ingreso", nbins=40) fig.add_vline(x=(dist_gamma//12).mean(), line_width=3, line_dash="dash", line_color="midnightblue") col1, col2 = st.beta_columns((3, 1)) col1.plotly_chart(fig, use_container_width=True) col2.title(" ") col2.header("µ = "+str((dist_gamma//12).mean())[0:4] + " años") col2.subheader("σ = "+str((dist_gamma//12).std())[0:4] + " años") st.subheader("Distribución de retorno anual") col1, col2 = st.beta_columns((3, 1)) df_ret = pd.DataFrame(retornos, columns=["retornos"]) col2.title(" ") col2.header("µ = "+str((retornos.mean()*100))[0:4] + "%") col2.subheader("σ = "+str((retornos.std())*100)[0:4] + "%") fig2 = px.histogram(df_ret, x="retornos", nbins=50) retorno_fc = (1.053)*(1.0312)-1 if retornos.mean() > 0.0312: posicion1 = "top right" posicion2 = "top left" else: posicion2 = "top right" posicion1 = "top left" fig2.add_vline(x=retornos.mean(), line_width=3, line_dash="dash", line_color="midnightblue", annotation_font_color="midnightblue", annotation_position=posicion1, annotation_text=str(round(retornos.mean()*100, 1))+"%") fig2.add_vline(x=0.0312, line_width=3, line_dash="dash", annotation_font_color="red", annotation_position=posicion2, line_color="red", annotation_text="3,12%") fig2.add_vline(x=retorno_fc, line_width=3, line_dash="dash", annotation_font_color="green", annotation_position=posicion2, line_color="green", annotation_text=str(round(retorno_fc, 2)*100)+"%") fig2.add_vline(x=0.00, line_width=3, line_dash="dash", line_color="yellow") col1.plotly_chart(fig2, use_container_width=True) col1, col2 = st.beta_columns((1, 8)) col2.write(str(round(sum(df_ret["retornos"] > 0.00)/len(df_ret)*100, 0)) + "%: Probabilidad de que un clientes tenga retorno mayor a 0%") col2.write(str(round(sum(df_ret["retornos"] > 0.0312)/len(df_ret)*100, 0)) + "%: Probabilidad de que un clientes tenga un retorno mayor a 3,12% (Inflación)") col2.write(str(round(sum(df_ret["retornos"] > retorno_fc)/len(df_ret)*100, 0)) + "%: Probabilidad de que un clientes tenga retorno mayor a "+str(round(retorno_fc, 2)*100)+"% (Fondo C)") def sim_2(): with st.form(key='my_form'): col1, col2 = st.beta_columns(2) sim = col1.number_input("Nº Simulaciones", min_value=1, value=100) vc = col2.number_input("Cuota inicial", min_value=100) col1, col2, col3 = st.beta_columns(3) mu = col1.number_input("µ Fondo Arriesgado", value=0.1) sigma = col1.number_input("σ Fondo Arriesgado", value=0.1) mu2 = col2.number_input("µ Fondo Intermedio ", value=0.05) sigma2 = col2.number_input("σ Fondo Intermedio", value=0.05) mu3 = col3.number_input("µ Fondo Conservador", value=-0.01) sigma3 = col3.number_input("σ Fondo Conservador", value=0.03) values = st.slider('Seleccione los años de cambio de fondo', 0, 40, (33, 38)) with st.beta_expander("Ajustar parámetros de distribucion de permanencia del cliente (gamma)"): col1, col2 = st.beta_columns(2) alpha = col1.number_input("alpha", value=1.5) beta = col2.number_input("lambda", value=71.1) submit_button = st.form_submit_button(label='Actualizar') if submit_button: t = values[0]*12 t2 = values[1]*12-t t3 = 480-t2-t mu = mu / 12 mu2 = mu2 / 12 mu3 = mu3 / 12 sigma = sigma / (12 ** (1/2)) sigma2 = sigma2 / (12 ** (1/2)) sigma3 = sigma3 / (12 ** (1/2)) var_al = np.random.normal(mu, sigma, size=(t, sim)) var_al2 = np.random.normal(mu2, sigma2, size=(t2, sim)) var_al3 = np.random.normal(mu3, sigma3, size=(t3, sim)) simulacion = np.zeros((t + t2 + t3, sim)) simulacion[0, :] = vc dist_gamma = stats.gamma.rvs(alpha, scale=beta, size=sim).astype(int)+1 for i in range(1, t): simulacion[i, :] = simulacion[i - 1, :] * (1 + var_al[i-1, :]) for i in range(t, t+t2): simulacion[i, :] = simulacion[i - 1, :] * (1 + var_al2[t-i-1, :]) for i in range(t+t2, t+t2+t3): simulacion[i, :] = simulacion[i - 1, :] * \ (1 + var_al3[t2+t-i-1, :]) retornos = np.zeros(sim) for j in range(sim): ingreso = 480-dist_gamma[j] simulacion[0:ingreso, j] = None simulacion[ingreso:480, j] = simulacion[ingreso:480, j] * \ vc/simulacion[ingreso, j] retorno = (simulacion[-1, j]/simulacion[ingreso, j] )**(1/(dist_gamma[j]/12))-1 retornos[j] = retorno df = pd.DataFrame(simulacion) df["meses"] = list(df.index) fig = px.line(df, x="meses", y=df.columns, title='Simulaciones') fig.layout.update(xaxis_rangeslider_visible=True) fig.add_vline(x=t, line_width=3, line_dash="dash", line_color="grey") fig.add_vline(x=t+t2, line_width=3, line_dash="dash", line_color="grey") fig.add_vrect(x0=0, x1=t, annotation_text="Arries", annotation_position="top", fillcolor="red", opacity=0.15, line_width=0) fig.add_vrect(x0=t, x1=t+t2, annotation_text="Inter", annotation_position="top", fillcolor="midnightblue", opacity=0.15, line_width=0) fig.add_vrect(x0=t + t2, x1=t + t2 + t3, annotation_text="Cons", annotation_position="top", fillcolor="seagreen", opacity=0.15, line_width=0) fig.update_layout(height=600, width=950) st.plotly_chart(fig, use_container_width=True) sigma_sim1 = np.random.normal(sigma, 0.009, size=480) sigma_sim2 = np.random.normal(sigma2, 0.004, size=480) sigma_sim3 = np.random.normal(sigma3, 0.001, size=480) sigma_comb = np.zeros(480) sigma_comb[0:t] = sigma_sim1[0:t] sigma_comb[t:t+t2] = sigma_sim2[t:t+t2] sigma_comb[t+t2:480] = sigma_sim3[t+t2:480] sigma_comb2 = np.zeros(480) retorno_comb = np.zeros(480) for i in range(t): sigma_comb2[i] = sigma_sim1[i] * (1-i/t) + sigma_sim2[i] * i/t retorno_comb[i] = mu * (1-i/t) + mu2 * i/t for j in range(480-t): sigma_comb2[t + j] = sigma_sim2[t + j] * \ (1-j/(480-t)) + sigma_sim3[t + j] * j/(480-t) retorno_comb[i] = mu2 * (1-j/(480-t)) + mu3 * j/(480-t) dfsig = pd.DataFrame(sigma_sim1, columns=["sig"]) dfsig["mes"] = list(dfsig.index) dfsig["sigma inter"] = sigma_sim2 dfsig["sigma cons"] = sigma_sim3 dfsig["sigma por periodos"] = sigma_comb dfsig["sigma combinacion lineal"] = sigma_comb2 dfsig["sigma combinacion lineal"] = dfsig["sigma combinacion lineal"].abs() var_al_comb = np.zeros(480) patr_al_comb = np.zeros(480) patr_al_comb[0] = vc for i in range(1, 480): var_al_comb[i] = np.random.normal( retorno_comb[i], dfsig["sigma combinacion lineal"].iloc[i], size=1) patr_al_comb[i] = patr_al_comb[i-1]*(1 + var_al_comb[i-1]) ingreso = 480-dist_gamma[0] data_comb = pd.DataFrame(patr_al_comb, columns=["Precio"]) data_comb["mes"] = list(data_comb.index) data_comb = data_comb[data_comb["mes"] >= ingreso] data_comb["Precio"] = data_comb["Precio"]/data_comb.iloc[0]["Precio"] fig2 = px.line(dfsig, x='mes', y=dfsig.columns, title='Simulaciones') st.plotly_chart(fig2) fig3 = px.line(data_comb, x='mes', y=data_comb.columns, title='Simulaciones') st.plotly_chart(fig3) def sim_inmob(): url = """postgresql://tbgxsndupdarfp:5578576bc884e31a4f7e117a66a9dad8b13917e6a5262d85ff20f1f69cb4bf49@ec2-52-205-45-219.compute-1.amazonaws.com:5432/db5ktai215krcv""" engine = create_engine(url, echo=False) data = pd.read_sql_query("SELECT * FROM Scraping_inmob", con=engine) data = transform_df(data) col1, col2 = st.beta_columns((0.65, 1)) placeholder = st.empty() placeholder2 = st.empty() placeholder3 = st.empty() placeholder4 = st.empty() dist_gamma = stats.gamma.rvs(1, scale=250000, size=2965) dist_norm = np.random.normal(734874, 1250, size=2965) data_hist = data[data["mercado"] == "venta"] data_hist = data_hist[data_hist["valor_peso"] < 400000000]["valor_peso"] * 0.2 fig2 = go.Figure() fig3 = go.Figure() fig4 = go.Figure() fig2.add_trace(go.Histogram(x=dist_norm, name='Dist Ingreso')) # fig2.add_vline(x=data_hist.mean(), line_width=3, line_dash="dash", line_color="darkred") # fig2.add_vline(x=dist_gamma.mean(), line_width=3, line_dash="dash", line_color="darkblue") fig3.add_trace(go.Histogram(x=data_hist, name='Data real')) a = sorted(data_hist) b = sorted(dist_norm) dist_periodo = [(x)/y for x, y in zip(a, b)] dist_periodo = [i for i in dist_periodo if i < 480] fig4.add_trace(go.Histogram(x=dist_periodo, name='Dist periodo')) # Overlay both histograms # fig2.update_layout(barmode='overlay') # Reduce opacity to see both histograms fig2.update_traces(opacity=0.75) #fig2 = px.histogram((data_hist), x='valor_peso', color_discrete_sequence=['indianred']) placeholder2.plotly_chart(fig2, use_container_width=True) placeholder.subheader("µ Capacidad de ahorro: $" + formatnum(dist_norm.mean())) placeholder4.plotly_chart(fig3, use_container_width=True) placeholder3.subheader("µ Pie vivienda: $" + formatnum(data_hist.mean())) st.plotly_chart(fig4, use_container_width=True) st.subheader("µ Period: " + formatnum(np.array(dist_periodo).mean())) df = pd.DataFrame([a, b, dist_periodo]) df2 = df.T st.markdown(get_table_excel_link(df2[df2[2] < 480], "Distribucion"), unsafe_allow_html=True) data_hist = data[data["mercado"] == "venta"] data_hist = data_hist[data_hist["valor_peso"] > 40000000] data_hist = data_hist[data_hist["valor_peso"] < 1000000000]["valor_peso"] * 0.2 fig2 = px.histogram((data_hist), x='valor_peso') def sim_ingreso_clientes(): with st.form(key='my_form'): col1, col2 = st.beta_columns(2) clientes1 = col1.number_input("Clientes nuevos año 1", value=1250) clientes2 = col2.number_input("Clientes nuevos año 2", value=6750) clientes3 = col1.number_input("Clientes nuevos año 3", value=17000) clientes4 = col2.number_input("Clientes nuevos año 4", value=17000) clientes5 = col1.number_input("Clientes nuevos año 5", value=8000) col1, col2 = st.beta_columns(2) cap_ahorro = col1.number_input("Capacidad de ahorro", 735000) de_cap = col2.number_input("Desviacion estandar C.A.", 1250) submit_button = st.form_submit_button(label='Actualizar') if submit_button: clientesm1 = clientes1/12 clientesm2 = clientes2/12 clientesm3 = clientes3/12 clientesm4 = clientes4/12 clientesm5 = clientes5/12 porc_mult = 0.46 porc_cp = 0.19 porc_lp = 0.35 inmob = np.zeros(60) a = np.zeros(60) b = np.zeros(60) c = np.zeros(60) cp = np.zeros(60) lp = np.zeros(60) inmob[0] = int(clientesm1 * porc_mult) cp[0] = int(clientesm1 * porc_cp) lp[0] = int(clientesm1 * porc_lp) for i in range(1, 60): if i < 12: inmob[i] =int( clientesm1 * porc_mult + inmob[i-1]) cp[i] = int(clientesm1 * porc_cp + cp[i-1]) lp[i] = int(clientesm1 * porc_lp + lp[i-1]) a[i] = cp[i] b[i] = lp[i] c[i] = inmob[i] elif i < 24: inmob[i] = int(clientesm2 * porc_mult + inmob[i-1]) cp[i] = int(clientesm2 * porc_cp + cp[i-1]) + clientesm1 * porc_cp*0.8 lp[i] = int(clientesm2 * porc_lp + lp[i-1]) a[i] = cp[i] b[i] = lp[i] + c[i-12] c[i] = inmob[i] - c[i-12] elif i < 36: inmob[i] = int(clientesm3 * porc_mult + inmob[i-1]) cp[i] = int(clientesm3 * porc_cp + cp[i-1]) + clientesm2 * porc_cp*0.8 lp[i] = int(clientesm3 * porc_lp + lp[i-1]) a[i] = cp[i] b[i] = lp[i] + c[i-24] + c[i-12] c[i] = inmob[i] - c[i-24] - c[i-12] elif i < 48: inmob[i] = int(clientesm4 * porc_mult + inmob[i-1]) cp[i] = int(clientesm4 * porc_cp + cp[i-1]) - clientesm3 * porc_cp*0.8 lp[i] = int(clientesm4 * porc_lp + lp[i-1]) a[i] = cp[i] + c[i-36] b[i] = lp[i] + c[i-24] + c[i-12] c[i] = inmob[i] - c[i-24] - c[i-12] - c[i-36] elif i < 60: inmob[i] = int(clientesm5 * porc_mult + inmob[i-1]) cp[i] = int(clientesm5 * porc_cp + cp[i-1]) + clientesm4 * porc_cp*0.8 lp[i] = int(clientesm5 * porc_lp + lp[i-1]) a[i] = cp[i] + c[i-36] b[i] = lp[i] + c[i-24] + c[i-12] c[i] = inmob[i] - c[i-24] - c[i-12] - c[i-36] - c[i-48] inmob_res = np.zeros(60) cp_res = np.zeros(60) lp_res = np.zeros(60) a_res = np.zeros(60) b_res = np.zeros(60) c_res = np.zeros(60) for i in range(1, 60): if i<12: pass elif i < 24: cp_res[i] = - clientes1 * porc_cp*0.2 b_res[i] = clientes1 * porc_mult c_res[i] = -clientes1 * porc_mult elif i < 36: cp_res[i] = - clientes2 * porc_cp * 0.2 b_res[i] = clientes2 * porc_mult c_res[i] = -clientes2 * porc_mult elif i < 48: cp_res[i] = - clientes3 * porc_cp * 0.2 a_res[i] = clientes1 * porc_mult * 3 b_res[i] = clientes3 * porc_mult - clientes1 * 3 * porc_mult c_res[i] = -clientes3 * porc_mult elif i < 60: cp_res[i] = - clientes4 * porc_mult * 0.2 a_res[i] = clientes2 * 3 *porc_mult b_res[i] = clientes3 * porc_mult - clientes2 * 3 *porc_mult c_res[i] = -clientes3 * porc_mult st.write(cp-cp_res) inmob[0] = int(clientesm1 * porc_mult) cp[0] = int(clientesm1 * porc_cp) lp[0] = int(clientesm1 * porc_lp) anual = np.zeros((5,4)) anual_aum = np.zeros((5,4)) for i in range(5): anual[i, 0] = int(sum(a[i*12:(i+1)*12])) anual[i, 1] = int(sum(b[i*12:(i+1)*12])) anual[i, 2] = int((sum(c[i*12:(i+1)*12]))) anual[:,3] = anual[:,0] + anual[:,1] + anual[:,2] for i in range(5): anual_aum[i, 0] = sum(((a - a_res)*cap_ahorro)[0:(i+1)*12]) anual_aum[i, 1] = sum(((b - b_res)*cap_ahorro)[0:(i+1)*12]) anual_aum[i, 2] = sum(((c - c_res)*cap_ahorro)[0:(i+1)*12]) anual_aum[:,3] = anual_aum[:,0] + anual_aum[:,1] + anual_aum[:,2] data = pd.DataFrame([cp, lp, inmob, (cp - cp_res)*cap_ahorro, lp*cap_ahorro, (inmob - inmob_res)*cap_ahorro]) anual[:,3] = anual[:,0] + anual[:,1] + anual[:,2] cambios = np.zeros(5) cambios[0] = 0 cambios[1] = int(clientes1 * porc_mult) cambios[2] = int(clientes2* porc_mult) cambios[3] = int((clientes3 + clientes1)* porc_mult) cambios[4] = int((clientes2 + clientes4) * porc_mult) retiros = np.zeros(5) retiros[0] = 0 retiros[1] = int(clientes1 * porc_cp) retiros[2] = int(clientes2 * porc_cp) retiros[3] = int(clientes3 * porc_cp) retiros[4] = int(clientes4 * porc_cp +clientes1 * porc_cp*porc_mult) clientes_a = np.zeros(5) clientes_b = np.zeros(5) clientes_c = np.zeros(5) clientes_a[0] = int(clientes1 * porc_cp) clientes_b[0] = int(clientes1 * porc_lp) clientes_c[0] = int(clientes1 * porc_mult) clientes_a[1] = int(clientes2 * porc_cp + clientes1 * porc_cp * 0.8) clientes_b[1] = int(clientes1 * porc_lp + clientes2 * porc_lp + clientes1 * porc_mult) clientes_c[1] = int(clientes2 * porc_mult) clientes_a[2] = int(clientes3 * porc_cp + clientes2 * porc_cp * 0.8 + clientes1 * porc_cp * 0.8) clientes_b[2] = int(clientes_b[1] + clientes2 * porc_mult + clientes3 * porc_lp ) clientes_c[2] = int(clientes3 * porc_mult) clientes_a[3] = int(clientes4 * porc_cp + clientes1 * porc_mult + clientes2 * porc_cp * 0.8 + clientes1 * porc_cp * 0.8 + clientes3 * porc_cp * 0.8) clientes_b[3] = int(clientes_b[2] - clientes1 * porc_mult + clientes3 * porc_mult + clientes4 * porc_lp) clientes_c[3] = int(clientes4 * porc_mult) clientes_a[4] = int(clientes5 * porc_cp + clientes1 * porc_mult + clientes2 * porc_mult + clientes4 *0.8* porc_cp + clientes2 * porc_cp * 0.8 + clientes1 * porc_cp * 0.8 + clientes3 * porc_cp * 0.8) clientes_b[4] = int(clientes_b[3] - clientes2 * porc_mult + clientes4 * porc_mult + clientes5 * porc_lp ) clientes_c[4] = int(clientes5 * porc_mult) data2 = pd.DataFrame(anual, columns = ["Depositos a", "Depositos b", "Depositos c", "Dep Total"]) data3 = pd.DataFrame(anual_aum, columns = ["a AUM", "b AUM", "c Aum", "Aum Total"]) data4 = pd.DataFrame([a,b,c]) st.write(data4) data = data.T data4 = data4.T data4.columns = ["Fondo A", "Fondo B", "Fondo C"] data3["Cambios"] = cambios data3["Retiros"] = retiros data3["Clientes a"] = clientes_a data3["Clientes b"] = clientes_b data3["Clientes c"] = clientes_c data3["Dep totales"] = data2["Dep Total"] fig = px.line(data4, x=data4.index, y=data4._) st.plotly_chart(fig, use_container_width=True) st.write(data3.T) st.markdown(get_table_excel_link(data3.T, "Estimación demanda"), unsafe_allow_html=True) import matplotlib.pyplot as plt import numpy as np import streamlit as st import time import statistics def simulacion_final(): import altair as alt from altair import datum with st.form("Form"): cols = st.columns(3) capital_inicial = cols[0].number_input("Capital inicial", value=1000000, format="%d") cap_ahorro = cols[1].number_input("Capacidad de ahorro", value=750000, format='%d') objetivo = cols[2].number_input("Objetivo", value=40000000, format="%u") button_2 = st.form_submit_button("Comenzar simulacion") my_bar = st.sidebar.progress(0) progress = 0 periodo = int(objetivo/cap_ahorro)+1 periodo_cambio = int(periodo*3/5) periodo_cambio = int(periodo*3/5) periodo_cambio2 = int(periodo*4/5) l_1=[capital_inicial] l_2=[0] l_3 = [] l_4 = [] l_5 = [] l_6 = [] volatilidad = [] drawdown = False corte_antes = False cambio = 0 lista2=l_1+l_2+l_3 chart_row = st.empty() if button_2: for j in range(1,periodo+4): lista =np.array(l_1+l_3+l_5) if lista[-1] > objetivo: corte_antes = True corte = j periodo = j break else: if j <= 12: volatilidad.append(0) # elif j < 12 and j >3: # volatilidad.append(statistics.stdev((lista[1:j]/lista[0:j-1]))) else: retornos = ((lista[j-11:j]-cap_ahorro)/lista[j-12:j-1]) volatilidad.append(statistics.stdev(retornos)) if statistics.stdev(retornos) > 0.13 and j==periodo_cambio: drawdown=True cambio =+ 6 if j < periodo_cambio: sig = abs(np.random.normal(0.04,0.1)) a = np.random.normal(0.018,sig) elif j < periodo_cambio2 and not drawdown: sig = abs(np.random.normal(0.03,0.04)) a = np.random.normal(0.01,sig) elif j < periodo_cambio2 and drawdown: sig = abs(np.random.normal(0.04,0.1)) a = np.random.normal(0.018,sig) drawdown=False else: sig = abs(np.random.normal(0.005,0.01)) a = np.random.normal(0,sig) if j < (periodo_cambio + cambio): l_1.append(l_1[j-1]*(1+a) + cap_ahorro ) l_2.append(j) if j >= (periodo_cambio + cambio) and j = periodo_cambio2: if periodo_cambio2 == j: l_5.append(l_3[j - periodo_cambio - cambio]) l_6.append(j-1) l_5.append(l_5[j- periodo_cambio2]*(1+a) + cap_ahorro ) l_6.append(j) vol =pd.DataFrame(volatilidad) cols = st.columns(3) col1, col2 = st.columns(2) #st.line_chart(vol) mas_tmpo = False if lista[-1] < objetivo: delta = objetivo-l_5[-1] t_extra = int(delta/cap_ahorro)+1 periodo_ant=periodo mas_tmpo=True periodo = periodo + t_extra for i in range(t_extra): l_5.append(l_5[-1]+ cap_ahorro) l_6.append(l_6[-1]+ 1) lista =np.array(l_1+l_3+l_5) col1.subheader("Analista") col2.subheader("Cliente") for i in range(periodo+2): time.sleep(0.01) if mas_tmpo==True and i == periodo_ant: st.write(t_extra) col2.error("Mes " + str(i) +": Te faltan " + str(t_extra) + " meses para la meta") time.sleep(3) if corte_antes==True and i == corte: col2.success("Mes " + str(i) +": Felcidiades llegaste antes a la meta") time.sleep(3) if cambio == 6 and i==(periodo_cambio): col1.error("Mes " + str(i) +": Estas en drawdown se recomienda esperar 6 meses más") col2.warning("Mes " + str(i) +": Debes esperar 6 mes mas para cambiarte") time.sleep(3) df = pd.DataFrame() df2 = pd.DataFrame() df3 = pd.DataFrame() df["Mes"]=l_2[0:i+1] df["Valor"]=l_1[0:i+1] if i >= (periodo_cambio+cambio): df2["Mes"]=l_4[0:i-periodo_cambio - cambio+1] df2["Valor"] =l_3[0:i-periodo_cambio - cambio+1] if i >= periodo_cambio2: df3["Mes"]=l_6[0:i-periodo_cambio2+2] df3["Valor"] =l_5[0:i-periodo_cambio2+2] df["Fondo"] = ["Fondo Arriesgado"]*len(df) df2["Fondo"] = ["Fondo Intermedio"]*len(df2) df3["Fondo"] = ["Fondo Conservador"]*len(df3) df_f = pd.concat([df,df2, df3]) df_f["Ahorro"] = df_f["Mes"]*cap_ahorro + capital_inicial if i == (periodo_cambio+cambio): col2.success("Mes " + str(i) +": Debes cambiarte al Fondo Intermedio") time.sleep(3) if i == periodo_cambio2: col2.success("Mes " + str(i) +": Debes cambiarte al Fondo Conservador") time.sleep(3) fig = alt.Chart(df_f).mark_area(opacity=0.6).encode( x=alt.X('Mes', scale=alt.Scale(domain=(0, periodo - 1)) ), y=alt.X('Valor', scale=alt.Scale(domain=(0, max(lista)*1.1)) ), color=alt.Color("Fondo", scale=alt.Scale(scheme='pastel1')) ) bar = fig.mark_bar().encode(y='Ahorro') chart_row.altair_chart(bar + fig, use_container_width=True) my_bar.empty() # from st_card import st_card # with cols[0]: # st_card('Capital proyectado', value=df_f.iloc[-1]["Valor"], show_progress=True) # with cols[1]: # st_card('Ganancia proyectada', value = df_f.iloc[-1]["Valor"] - df_f.iloc[-1]["Ahorro"], # delta=round((df_f.iloc[-1]["Valor"]/df_f.iloc[-1]["Ahorro"]-1)*100,0) , # use_percentage_delta=True, delta_description='de retorno') # with cols[2]: # st_card('Meses', value=int(df_f.iloc[-1]["Mes"]), delta=periodo_cambio, delta_description='En el Fondo Arriesgado') # st.write(df_f) import streamlit.components.v1 as components def candidatos(): html_str =""" D3.js - Mapas

Mapa por región de votos a Gabriel Boric

Fuente: https://www.futuro.cl/2021/11/elecciones-presidenciales-chile-2021-resultados-region-por-region-en-vivo/

""" components.html(html_str, height=1000) # def simulacion_final(): # import altair as alt # from altair import datum # with st.form("Form"): # cols = st.beta_columns(3) # capital_inicial = cols[0].number_input("Objetivo", value=1000000, format="%d") # cap_ahorro = cols[1].number_input("Capacidad de ahorro", value=750000, format='%d') # objetivo = cols[2].number_input("Objetivo", value=40000000, format="%u") # button_2 = st.form_submit_button("Comenzar simulacion") # l_1=[capital_inicial] # l_2=[0] # l_3=[np.nan] # l_4=[np.nan] # text=[] # chart_row = st.empty() # if button_2: # my_bar = st.sidebar.progress(0) # progress = 0 # periodo = int(objetivo/cap_ahorro)+1 # periodo_cambio = int(periodo*3/5) # periodo_cambio2 = int(periodo*4/5) # for j in range(1,periodo): # a = np.random.normal(0.03,0.10) # if j periodo_cambio and j < periodo_cambio2 : # a = a/3 # l_1.append(np.nan) # l_3.append(l_3[j-1]*(1+a) + cap_ahorro) # l_4.append(np.nan) # text.append("") # elif j == periodo_cambio2: # a = a/3 # l_1.append(np.nan) # l_3.append(l_3[j-1]*(1+a) + cap_ahorro) # l_4.append(l_3[j-1]*(1+a) + cap_ahorro) # text.append("") # else: # a = a/5 # l_1.append(np.nan) # l_3.append(np.nan) # l_4.append(l_4[j-1]*(1+a) + cap_ahorro) # text.append("") # l_2.append(j) # drawd =[] # for k in range(2,len(l_1)): # if (l_1[k] - l_1[k-1])/(l_1[k]) < -0.01: # periodo_cambio1_2 = periodo_cambio + 1 # drawd.append(k) # else: # periodo_cambio1_2=periodo_cambio # for i in range(periodo): # progress = (i/periodo) # my_bar = my_bar.progress(progress) # time.sleep(0.001) # df = pd.DataFrame() # df["Mes"]=l_2[0:i+1]+l_2[0:i+1] + l_2[0:i+1] # df["Valor"]=l_1[0:i+1]+l_3[0:i+1] + l_4[0:i+1] # if i <= periodo_cambio: # df["Fondo"]=["Fondo Arriesgado"]*len(df) # if i in drawd: # st.warning("Drawdown") # time.sleep(2) # elif i > periodo_cambio and i <= periodo_cambio2: # df["Fondo"]=["Fondo Arriesgado"]*(periodo_cambio+1) + ["Fondo Intermedio"]*(i-periodo_cambio) + ["Fondo Arriesgado"]*(periodo_cambio + 1) + ["Fondo Intermedio"]*(i-periodo_cambio) + ["Fondo Arriesgado"]*(periodo_cambio+1) + ["Fondo Intermedio"]*(i-periodo_cambio) # else: # a = ["Fondo Arriesgado"] * periodo_cambio # b = ["Fondo Intermedio"] * (periodo_cambio2 - periodo_cambio-1) # c = ["Fondo Conservador"] * (i-periodo_cambio2) # d = ["Fondo Arriesgado"] * (periodo_cambio+2) # e = ["Fondo Intermedio"] * (periodo_cambio2 - (periodo_cambio+2)) # f = ["Fondo Conservador"]*(i-periodo_cambio2+2) # df["Fondo"]= a + b + c + d + e + f + d + e + f # df = df.dropna() # if i == periodo_cambio: # placeholder=st.empty() # placeholder.info("Debes cambiarte al fondo intermedio") # time.sleep(3) # placeholder.empty() # if i == periodo_cambio2: # placeholder=st.empty() # placeholder.info("Debes cambiarte al fondo conservador") # time.sleep(3) # placeholder.empty() # # df=df.dropna() # fig = alt.Chart(df).mark_area(opacity=0.6).encode( # x=alt.X('Mes', # scale=alt.Scale(domain=(0, periodo - 1)) # ), # y=alt.X('Valor', # scale=alt.Scale(domain=(0, max(l_1+l_3+l_4)*1.1)) # ), # color=alt.Color("Fondo", scale=alt.Scale(scheme='category20')) # ) # if i > periodo_cambio and i <= periodo_cambio2: # df["Cambio"]="Cambiate al fondo intermedio" # text = ( # alt.Chart(df[df["Mes"]==periodo_cambio]) # .mark_text(dy=-25, color="black") # .encode(x=alt.X("Mes"), y=alt.Y("Valor"), text="Cambio") # ) # chart_row.altair_chart(fig + text, use_container_width=True) # if i > periodo_cambio2: # df["Cambio"]="Cambiate al fondo conservador" # text = ( # alt.Chart(df[df["Mes"]==periodo_cambio2]) # .mark_text(dy=-25, color="black") # .encode(x=alt.X("Mes"), y=alt.Y("Valor"), text="Cambio") # ) # chart_row.altair_chart(fig, use_container_width=True) # else: # chart_row.altair_chart(fig, use_container_width=True) # cols = st.columns(3) # ganancia=value=l_3[-1] - cap_ahorro * l_2[-1] # my_bar.empty() # # with cols[0]: # # st_card('Capital proyectado', value=l_3[-1], show_progress=True) # # with cols[1]: # # st_card('Ganancia proyectada', value=ganancia, delta=round(ganancia/(cap_ahorro * l_2[-1])*100,0) , # # use_percentage_delta=True, delta_description='de retorno') # # with cols[2]: # # st_card('Meses', value=l_2[-1], delta=periodo_cambio, delta_description='En el Fondo Arriesgado') # st.write(df) def prototipo_simulacion(): # import streamlit as st # import time # import numpy as np # progress_bar = st.sidebar.progress(0) # status_text = st.sidebar.empty() # last_rows = np.random.randn(1, 1) # chart = st.line_chart(last_rows) # for i in range(1, 101): # new_rows = last_rows[-1, :] + np.random.randn(50, 1).cumsum(axis=0) # status_text.text("%i%% Complete" % i) # chart.add_rows(new_rows) # progress_bar.progress(i) # last_rows = new_rows # time.sleep(0.001) # progress_bar.empty() # # Streamlit widgets automatically run the script from top to bottom. Since # # this button is not connected to any other logic, it just causes a plain # # rerun. # st.button("Re-run") # import numpy as np # import matplotlib.pyplot as plt # import matplotlib.animation as animation # import streamlit as st # import streamlit.components.v1 as components # def update_line(num, data, line): # line.set_data(data[..., :num]) # return line, # fig = plt.figure() # # Fixing random state for reproducibility # np.random.seed(19680801) # data = np.random.rand(2, 25) # l, = plt.plot([], [], 'r-') # plt.xlim(0, 1) # plt.ylim(0, 1) # plt.xlabel('x') # plt.title('test') # line_ani = animation.FuncAnimation(fig, update_line, 25, fargs=(data, l), interval=50, blit=True) # st.title("Embed Matplotlib animation in Streamlit") # st.markdown("https://matplotlib.org/gallery/animation/basic_example.html") # components.html(line_ani.to_jshtml(), height=1000) # import matplotlib.pyplot as plt # import numpy as np # import streamlit as st # import time # fig, ax = plt.subplots() # max_x = 5 # max_rand = 10 # x = np.arange(0, max_x) # ax.set_ylim(0, max_rand) # line, = ax.plot(x, np.random.randint(0, max_rand, max_x)) # the_plot = st.pyplot(plt) # def init(): # give a clean slate to start # line.set_ydata([np.nan] * len(x)) # def animate(i): # update the y values (every 1000ms) # line.set_ydata(np.random.randint(0, max_rand, max_x)) # the_plot.pyplot(plt) # init() # for i in range(100): # animate(i) # time.sleep(0.1) import plotly.express as px from datetime import date from datetime import timedelta import numpy as np df = px.data.gapminder() cap_ahorro = 750000 Data = pd.DataFrame() today =date.today() l=[] l2=[] l3=[] l4=[] for i in range(53): for j in range(53): l.append(i) l2.append(j) if j<=i: l3.append(cap_ahorro*j) else: l3.append(0) if j<40: l4.append("Arriesgado") elif j<47: l4.append("Intermedio") else: l4.append("Conservador") l5 = [] l6 = [] Data["Mes"] = l Data["Ahorro"] = l2 Data["Total"] = l3 Data["Fondo"] = l4 fig = px.bar(Data, x="Ahorro", y="Total", color="Fondo", animation_frame="Mes") fig.update_yaxes(range=[0, 50000000]) fig.update_xaxes(range=[0, 53]) st.plotly_chart(fig) button = st.button("Activar") if button: chart_data = pd.DataFrame() chart = st.area_chart(chart_data) for i in range(100): if i<70: chart.add_rows(pd.DataFrame([[i*cap_ahorro,0, 0]], columns=['Fondo 1', 'Fondo 2', 'Fondo 3'])) elif i==70: chart.add_rows(pd.DataFrame([[i*cap_ahorro,i*cap_ahorro,0]], columns=['Fondo 1', 'Fondo 2', 'Fondo 3'])) st.success("Debes cambiarte al fondo intermedio") elif i<85: chart.add_rows(pd.DataFrame([[0,i*cap_ahorro,0]], columns=['Fondo 1', 'Fondo 2', 'Fondo 3'])) elif i==85: chart.add_rows(pd.DataFrame([[0,i*cap_ahorro,i*cap_ahorro]], columns=['Fondo 1', 'Fondo 2', 'Fondo 3'])) st.success("Debes cambiarte al fondo arriesgado") else: chart.add_rows(pd.DataFrame([[0,0, i*cap_ahorro]], columns=['Fondo 1', 'Fondo 2', 'Fondo 3'])) time.sleep(0.1) cap_ahorro = 750000 from plotly.subplots import make_subplots import plotly.graph_objects as go import numpy as np import plotly.graph_objects as go Frames=[] Frames2 =[] l_1=[] l_2=[] l_3=[] text=[] fig = make_subplots(rows=1, cols=1, subplot_titles = ('Subplot (1,1)')) for i in range(53): if i <40: l_1.append(cap_ahorro*i) l_3.append(np.nan) text.append("") elif i ==40: l_1.append(cap_ahorro*i) l_3.append(cap_ahorro*i) text.append("") else: l_1.append(np.nan) l_3.append(cap_ahorro*i) text.append("") l_2.append(i) Frames.append(go.Scatter(x=l_2, y=l_1, mode="lines+text", text=text, textposition="bottom center", textsrc="bottom center", textfont=dict( family="sans serif", size=10, color="Black" ), fill='tozeroy')) Frames2.append(go.Scatter(x=l_2, y=l_3, fill='tozeroy')) go.Annotations Frames_finales=[Frames, Frames2] fig.add_trace(go.Scatter( x= [0], y= [0], mode = 'lines', hoverinfo='name', legendgroup= 'Fondo Arriesgado', line_color= 'rgb(255, 79, 38)', name= 'Fondo Arriesgado', showlegend= True), row=1, col=1) fig.add_trace(go.Scatter( x= [0], y= [0], mode = 'lines', hoverinfo='name', legendgroup= 'Fondo Conservador', line_color= 'rgb(79, 38, 255)', name= 'Fondo Conservador', showlegend= True), row=1, col=1) frames =[dict(name = k, data = [Frames[k],Frames2[k]], traces=[0,1]) for k in range(53) ] updatemenus=[dict( type="buttons", buttons=[dict(label="Play", method="animate", args=[None])])] fig.update_yaxes(range=[0, 50000000]) fig.update_xaxes(range=[0, 53]) annotations1 = [dict( x=40, y=40*cap_ahorro, text=text, xanchor='auto', yanchor='bottom', showarrow=False, )] fig.update(frames=frames), fig.update_layout(updatemenus=updatemenus) st.plotly_chart(fig) import altair as alt from altair import datum l_1=[] l_2=[] l_3=[] for i in range(51): if i <41: l_1.append(cap_ahorro*i) l_3.append(np.nan) text.append("") elif i ==41: l_1.append(cap_ahorro*i) l_3.append(cap_ahorro*i) text.append("") else: l_1.append(np.nan) l_3.append(cap_ahorro*i) text.append("") l_2.append(i) chart_row = st.empty() button_2 = st.button("Comenzar simulació") if button_2: for i in range(51): time.sleep(0.1) df = pd.DataFrame() df["Mes"]=l_2[0:i+1]+l_2[0:i+1] print(df["Mes"]) df["Valor"]=l_1[0:i+1]+l_3[0:i+1] if i <= 41: df["Fondo"]=["Fondo Arriesgado"]*len(df) else: df["Fondo"]=["Fondo Arriesgado"]*41 + ["Fondo Conservador"]*(i-41) + ["Fondo Arriesgado"]*43 + ["Fondo Conservador"]*(i-41) if i == 41: st.success("Debes cambiarte al fondo conservador") time.sleep(1) df=df.dropna() fig = alt.Chart(df).mark_area(opacity=0.6).encode( x=alt.X('Mes', scale=alt.Scale(domain=(0, 50)) ), y=alt.X('Valor', scale=alt.Scale(domain=(0, max(l_1+l_3)*1.1)) ), color=alt.Color("Fondo", scale=alt.Scale(scheme='category20')) ) if i > 41: df["Cambio"]="Cambiate al fondo conservador" text = ( alt.Chart(df[df["Mes"]==41]) .mark_text(dy=-25, color="black") .encode(x=alt.X("Mes"), y=alt.Y("Valor"), text="Cambio") ) chart_row.altair_chart(fig + text, use_container_width=True) else: chart_row.altair_chart(fig, use_container_width=True)