Pegumenezes commited on
Commit
0b95db3
·
verified ·
1 Parent(s): e08c501

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +30 -16
src/streamlit_app.py CHANGED
@@ -29,8 +29,6 @@ st.markdown("""
29
 
30
 
31
  # --- 3. DEFINIÇÃO DAS FUNÇÕES GLOBAIS ---
32
- # Todas as funções foram movidas para o escopo global para evitar o erro de cache.
33
-
34
  def formatar_brl(valor): return f"R$ {valor:,.2f}"
35
  def formatar_percentual(valor): return f"{valor:.2%}" if pd.notna(valor) and not np.isinf(valor) else "N/A"
36
 
@@ -100,10 +98,12 @@ def carregar_dados():
100
  df_anuais = pd.DataFrame(dados_anuais).set_index('Ano')
101
 
102
  precos_iniciais = {'Papel_Papelao': 0.50, 'Plastico': 0.80, 'Metal': 2.00, 'Vidro': 0.30}
103
- return df_2024, df_anuais, precos_iniciais, df_2024_numeric
 
 
104
 
105
  # --- 5. EXECUÇÃO INICIAL E SIDEBAR DE CONTROLES ---
106
- df_2024, df_anuais, precos_iniciais, df_2024_numeric = carregar_dados()
107
 
108
  st.sidebar.title(" Painel de Controle")
109
  st.sidebar.markdown("Use os menus abaixo para navegar entre as análises e ajustar os parâmetros do projeto.")
@@ -115,29 +115,44 @@ pagina_selecionada = st.sidebar.radio( "Menu de Navegação",
115
  )
116
  st.sidebar.divider()
117
 
118
- # Parâmetros Editáveis na Sidebar (código igual ao anterior)
119
  with st.sidebar.expander("⚙️ Premissas Financeiras do Projeto", expanded=True):
120
- investimento_inicial = st.number_input("Investimento Inicial (R$)", min_value=1000.0, value=150000.0, step=10000.0)
121
- custos_operacionais = st.number_input("Custos Operacionais Anuais (R$)", min_value=0.0, value=50000.0, step=5000.0)
 
 
 
 
 
 
 
 
 
 
 
122
  horizonte_projeto = st.slider("Horizonte do Projeto (anos)", 3, 20, 10)
123
  taxa_desconto = st.slider("Taxa de Desconto (TMA) (%)", 5.0, 25.0, 12.0, 0.5) / 100
124
  taxa_crescimento = st.slider("Crescimento Anual (Receitas/Custos) (%)", 0.0, 10.0, 3.0, 0.5) / 100
125
  taxa_reinvestimento = st.slider("Taxa de Reinvestimento (MTIR) (%)", 2.0, 18.0, 10.0, 0.5) / 100
126
 
127
  with st.sidebar.expander("📈 Preços e Cenários de Simulação", expanded=False):
128
- precos_editaveis = {material: st.number_input(f"{material.replace('_', ' ')} (R$/kg)", value=preco, step=0.1, key=f"preco_{material}") for material, preco in precos_iniciais.items()}
129
- fator_pessimista = st.slider("Cenário Pessimista (%)", 0, 100, 85) / 100
 
 
 
 
130
  fator_otimista = st.slider("Cenário Otimista (%)", 100, 200, 115) / 100
131
 
132
  st.sidebar.divider()
133
  st.sidebar.info(f"Última atualização: {pd.Timestamp.now(tz='America/Sao_Paulo').strftime('%d/%m/%Y %H:%M')}")
134
 
135
- # --- 6. LÓGICA DE RENDERIZAÇÃO DAS PÁGINAS ---
136
- # O código aqui dentro permanece o mesmo, mas agora chama as funções globais diretamente.
137
- # Exemplo de chamada direta: formatar_brl(vpl) em vez de funcoes['formatar_brl'](vpl)
 
138
 
139
  if pagina_selecionada == "🔎 Análise Exploratória (EDA)":
140
- # ... (código desta página não precisa de alteração nas chamadas)
141
  st.title("🔎 Análise Exploratória dos Dados de Coleta")
142
  st.markdown("O primeiro passo para qualquer projeção é entender o passado. Aqui, exploramos os dados históricos de coleta para identificar padrões, sazonalidades e anomalias.")
143
  st.divider()
@@ -159,7 +174,6 @@ if pagina_selecionada == "🔎 Análise Exploratória (EDA)":
159
  st.plotly_chart(fig_boxplot, use_container_width=True)
160
  st.info("O **gráfico de linhas** mostra a tendência e sazonalidade ao longo do ano. O **boxplot** revela a volatilidade de cada material: caixas mais 'altas' indicam maior variação mensal, o que se traduz em maior risco e incerteza no faturamento.")
161
 
162
-
163
  elif pagina_selecionada == "🎯 Simulação de Faturamento":
164
  st.title("🎯 Simulação e Projeção de Faturamento Anual")
165
  st.markdown("Utilizando a técnica de bootstrapping, simulamos 2.000 possíveis anos de faturamento com base na volatilidade dos dados de 2024. Isso nos dá uma visão probabilística das receitas do projeto.")
@@ -204,7 +218,7 @@ elif pagina_selecionada == "📊 Análise de Viabilidade":
204
  st.divider()
205
 
206
  receita_anual_media = np.mean(simulacoes_faturamento[cenario_analise])
207
- fluxo_caixa_projeto = gerar_fluxo_caixa_projeto(investimento_inicial, receita_anual_media, custos_operacionais, horizonte_projeto, taxa_crescimento)
208
 
209
  vpl = calcular_vpl(fluxo_caixa_projeto, taxa_desconto)
210
  tir = calcular_tir(fluxo_caixa_projeto)
@@ -235,7 +249,7 @@ elif pagina_selecionada == "📊 Análise de Viabilidade":
235
  with tab_risco:
236
  st.subheader(f"Simulação Monte Carlo para o VPL (Cenário: {cenario_analise})")
237
  receitas_mc = np.random.choice(simulacoes_faturamento[cenario_analise], size=5000, replace=True)
238
- vpls_mc = [calcular_vpl(gerar_fluxo_caixa_projeto(investimento_inicial, r, custos_operacionais, horizonte_projeto, taxa_crescimento), taxa_desconto) for r in receitas_mc]
239
 
240
  prob_viabilidade = (np.array(vpls_mc) >= 0).mean()
241
  vpl_medio_mc = np.mean(vpls_mc)
 
29
 
30
 
31
  # --- 3. DEFINIÇÃO DAS FUNÇÕES GLOBAIS ---
 
 
32
  def formatar_brl(valor): return f"R$ {valor:,.2f}"
33
  def formatar_percentual(valor): return f"{valor:.2%}" if pd.notna(valor) and not np.isinf(valor) else "N/A"
34
 
 
98
  df_anuais = pd.DataFrame(dados_anuais).set_index('Ano')
99
 
100
  precos_iniciais = {'Papel_Papelao': 0.50, 'Plastico': 0.80, 'Metal': 2.00, 'Vidro': 0.30}
101
+ custos_mensais_iniciais = {"Locacao_Maquina": 1100, "Coleta_Destinacao": 350, "Mao_de_Obra": 2500, "Outros": 500}
102
+
103
+ return df_2024, df_anuais, precos_iniciais, df_2024_numeric, custos_mensais_iniciais
104
 
105
  # --- 5. EXECUÇÃO INICIAL E SIDEBAR DE CONTROLES ---
106
+ df_2024, df_anuais, precos_iniciais, df_2024_numeric, custos_mensais_iniciais = carregar_dados()
107
 
108
  st.sidebar.title(" Painel de Controle")
109
  st.sidebar.markdown("Use os menus abaixo para navegar entre as análises e ajustar os parâmetros do projeto.")
 
115
  )
116
  st.sidebar.divider()
117
 
118
+ # --- PREMISSAS FINANCEIRAS COM AS ALTERAÇÕES ---
119
  with st.sidebar.expander("⚙️ Premissas Financeiras do Projeto", expanded=True):
120
+ # Alteração 1: Investimento inicial com novo valor padrão
121
+ investimento_inicial = st.number_input("Investimento Inicial (R$)", min_value=1000.0, value=10000.0, step=1000.0)
122
+
123
+ # Alteração 2: Custos mensais editáveis em vez de custo anual único
124
+ st.markdown("**Custos Fixos Mensais (R$)**")
125
+ custos_mensais_editaveis = {}
126
+ for custo, valor in custos_mensais_iniciais.items():
127
+ custos_mensais_editaveis[custo] = st.number_input(custo.replace("_", " "), value=valor, step=50, key=custo)
128
+
129
+ # O custo anual agora é calculado a partir dos custos mensais
130
+ custos_operacionais_anuais = sum(custos_mensais_editaveis.values()) * 12
131
+ st.info(f"Custo Anual Calculado: **{formatar_brl(custos_operacionais_anuais)}**")
132
+
133
  horizonte_projeto = st.slider("Horizonte do Projeto (anos)", 3, 20, 10)
134
  taxa_desconto = st.slider("Taxa de Desconto (TMA) (%)", 5.0, 25.0, 12.0, 0.5) / 100
135
  taxa_crescimento = st.slider("Crescimento Anual (Receitas/Custos) (%)", 0.0, 10.0, 3.0, 0.5) / 100
136
  taxa_reinvestimento = st.slider("Taxa de Reinvestimento (MTIR) (%)", 2.0, 18.0, 10.0, 0.5) / 100
137
 
138
  with st.sidebar.expander("📈 Preços e Cenários de Simulação", expanded=False):
139
+ st.markdown("**Preços dos Materiais (R$/kg)**")
140
+ precos_editaveis = {material: st.number_input(f"{material.replace('_', ' ')}", value=preco, step=0.1, key=f"preco_{material}") for material, preco in precos_iniciais.items()}
141
+
142
+ st.markdown("**Fatores dos Cenários**")
143
+ # Alteração 3: Cenário pessimista com novo valor padrão
144
+ fator_pessimista = st.slider("Cenário Pessimista (%)", 0, 100, 60) / 100
145
  fator_otimista = st.slider("Cenário Otimista (%)", 100, 200, 115) / 100
146
 
147
  st.sidebar.divider()
148
  st.sidebar.info(f"Última atualização: {pd.Timestamp.now(tz='America/Sao_Paulo').strftime('%d/%m/%Y %H:%M')}")
149
 
150
+
151
+ # --- 6. LÓGICA DE RENDERIZAÇÃO DAS PÁGINAS (sem alterações aqui) ---
152
+ # O restante do código permanece o mesmo, pois ele já utiliza as variáveis
153
+ # que ajustamos na barra lateral.
154
 
155
  if pagina_selecionada == "🔎 Análise Exploratória (EDA)":
 
156
  st.title("🔎 Análise Exploratória dos Dados de Coleta")
157
  st.markdown("O primeiro passo para qualquer projeção é entender o passado. Aqui, exploramos os dados históricos de coleta para identificar padrões, sazonalidades e anomalias.")
158
  st.divider()
 
174
  st.plotly_chart(fig_boxplot, use_container_width=True)
175
  st.info("O **gráfico de linhas** mostra a tendência e sazonalidade ao longo do ano. O **boxplot** revela a volatilidade de cada material: caixas mais 'altas' indicam maior variação mensal, o que se traduz em maior risco e incerteza no faturamento.")
176
 
 
177
  elif pagina_selecionada == "🎯 Simulação de Faturamento":
178
  st.title("🎯 Simulação e Projeção de Faturamento Anual")
179
  st.markdown("Utilizando a técnica de bootstrapping, simulamos 2.000 possíveis anos de faturamento com base na volatilidade dos dados de 2024. Isso nos dá uma visão probabilística das receitas do projeto.")
 
218
  st.divider()
219
 
220
  receita_anual_media = np.mean(simulacoes_faturamento[cenario_analise])
221
+ fluxo_caixa_projeto = gerar_fluxo_caixa_projeto(investimento_inicial, receita_anual_media, custos_operacionais_anuais, horizonte_projeto, taxa_crescimento)
222
 
223
  vpl = calcular_vpl(fluxo_caixa_projeto, taxa_desconto)
224
  tir = calcular_tir(fluxo_caixa_projeto)
 
249
  with tab_risco:
250
  st.subheader(f"Simulação Monte Carlo para o VPL (Cenário: {cenario_analise})")
251
  receitas_mc = np.random.choice(simulacoes_faturamento[cenario_analise], size=5000, replace=True)
252
+ vpls_mc = [calcular_vpl(gerar_fluxo_caixa_projeto(investimento_inicial, r, custos_operacionais_anuais, horizonte_projeto, taxa_crescimento), taxa_desconto) for r in receitas_mc]
253
 
254
  prob_viabilidade = (np.array(vpls_mc) >= 0).mean()
255
  vpl_medio_mc = np.mean(vpls_mc)