Spaces:
Sleeping
Sleeping
Update src/streamlit_app.py
Browse files- src/streamlit_app.py +21 -19
src/streamlit_app.py
CHANGED
|
@@ -85,7 +85,7 @@ st.markdown("""
|
|
| 85 |
""", unsafe_allow_html=True)
|
| 86 |
|
| 87 |
|
| 88 |
-
# --- 3. DEFINIÇÃO DAS FUNÇÕES GLOBAIS
|
| 89 |
def formatar_brl(valor): return f"R$ {valor:,.2f}"
|
| 90 |
def formatar_percentual(valor): return f"{valor:.2%}" if pd.notna(valor) and not np.isinf(valor) else "N/A"
|
| 91 |
def calcular_vpl(fluxo_caixa, taxa_desconto):
|
|
@@ -129,7 +129,7 @@ def gerar_fluxo_caixa_projeto(investimento_inicial, receita_anual_base, custos_o
|
|
| 129 |
fluxo_caixa.append(fluxo_liquido_ano)
|
| 130 |
return fluxo_caixa
|
| 131 |
|
| 132 |
-
# --- 4. CARREGAMENTO DE DADOS
|
| 133 |
@st.cache_data
|
| 134 |
def carregar_dados():
|
| 135 |
meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']
|
|
@@ -184,16 +184,11 @@ st.sidebar.info(f"Dados atualizados em: {pd.Timestamp.now(tz='America/Sao_Paulo'
|
|
| 184 |
|
| 185 |
|
| 186 |
# --- 6. LÓGICA DE RENDERIZAÇÃO DAS PÁGINAS ---
|
| 187 |
-
|
| 188 |
-
# ===================================================================
|
| 189 |
-
# PÁGINA 1: ANÁLISE EXPLORATÓRIA
|
| 190 |
-
# ===================================================================
|
| 191 |
if pagina_selecionada == "🔎 Análise Exploratória":
|
| 192 |
st.title("🔎 Análise Exploratória dos Dados de Coleta")
|
| 193 |
st.markdown("O primeiro passo para uma projeção robusta é entender o passado. Aqui, exploramos os dados históricos de coleta para identificar padrões, tendências e pontos de atenção.")
|
| 194 |
st.divider()
|
| 195 |
|
| 196 |
-
# Layout de colunas e seus conteúdos estão DENTRO do IF
|
| 197 |
col1, col2 = st.columns(2)
|
| 198 |
with col1:
|
| 199 |
st.subheader("Coleta Mensal por Material (2024)")
|
|
@@ -232,10 +227,6 @@ if pagina_selecionada == "🔎 Análise Exploratória":
|
|
| 232 |
st.plotly_chart(fig_evol_coleta, use_container_width=True)
|
| 233 |
st.warning("**Observação:** A queda na coleta em 2023, principalmente em Plástico, é um ponto crítico. É crucial investigar se isso reflete a realidade operacional ou uma anomalia nos dados antes de basear decisões estratégicas nessas projeções.")
|
| 234 |
|
| 235 |
-
|
| 236 |
-
# ===================================================================
|
| 237 |
-
# PÁGINA 2: SIMULAÇÃO DE FATURAMENTO
|
| 238 |
-
# ===================================================================
|
| 239 |
elif pagina_selecionada == "🎯 Simulação de Faturamento":
|
| 240 |
st.title("🎯 Simulação e Projeção de Faturamento Anual")
|
| 241 |
st.markdown("Utilizando a técnica de *bootstrapping*, simulamos 2.000 possíveis anos de faturamento com base na volatilidade histórica e nas premissas de preço e eficiência definidas.")
|
|
@@ -284,10 +275,6 @@ elif pagina_selecionada == "🎯 Simulação de Faturamento":
|
|
| 284 |
fig_comp.update_layout(legend_title_text='Material', plot_bgcolor='white', font_color='#333')
|
| 285 |
st.plotly_chart(fig_comp, use_container_width=True)
|
| 286 |
|
| 287 |
-
|
| 288 |
-
# ===================================================================
|
| 289 |
-
# PÁGINA 3: ANÁLISE DE VIABILIDADE
|
| 290 |
-
# ===================================================================
|
| 291 |
elif pagina_selecionada == "📊 Análise de Viabilidade":
|
| 292 |
st.title("📊 Análise de Viabilidade Financeira e Risco")
|
| 293 |
st.markdown("Esta é a etapa final, onde combinamos as projeções de receita com as premissas de investimento e custos para avaliar a viabilidade do projeto sob a ótica de risco.")
|
|
@@ -367,7 +354,22 @@ elif pagina_selecionada == "📊 Análise de Viabilidade":
|
|
| 367 |
st.markdown("---")
|
| 368 |
st.markdown("#### Detalhes da Análise:")
|
| 369 |
conclusoes = []
|
| 370 |
-
if vpl >= 0:
|
| 371 |
-
|
| 372 |
-
|
| 373 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 85 |
""", unsafe_allow_html=True)
|
| 86 |
|
| 87 |
|
| 88 |
+
# --- 3. DEFINIÇÃO DAS FUNÇÕES GLOBAIS ---
|
| 89 |
def formatar_brl(valor): return f"R$ {valor:,.2f}"
|
| 90 |
def formatar_percentual(valor): return f"{valor:.2%}" if pd.notna(valor) and not np.isinf(valor) else "N/A"
|
| 91 |
def calcular_vpl(fluxo_caixa, taxa_desconto):
|
|
|
|
| 129 |
fluxo_caixa.append(fluxo_liquido_ano)
|
| 130 |
return fluxo_caixa
|
| 131 |
|
| 132 |
+
# --- 4. CARREGAMENTO DE DADOS ---
|
| 133 |
@st.cache_data
|
| 134 |
def carregar_dados():
|
| 135 |
meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']
|
|
|
|
| 184 |
|
| 185 |
|
| 186 |
# --- 6. LÓGICA DE RENDERIZAÇÃO DAS PÁGINAS ---
|
|
|
|
|
|
|
|
|
|
|
|
|
| 187 |
if pagina_selecionada == "🔎 Análise Exploratória":
|
| 188 |
st.title("🔎 Análise Exploratória dos Dados de Coleta")
|
| 189 |
st.markdown("O primeiro passo para uma projeção robusta é entender o passado. Aqui, exploramos os dados históricos de coleta para identificar padrões, tendências e pontos de atenção.")
|
| 190 |
st.divider()
|
| 191 |
|
|
|
|
| 192 |
col1, col2 = st.columns(2)
|
| 193 |
with col1:
|
| 194 |
st.subheader("Coleta Mensal por Material (2024)")
|
|
|
|
| 227 |
st.plotly_chart(fig_evol_coleta, use_container_width=True)
|
| 228 |
st.warning("**Observação:** A queda na coleta em 2023, principalmente em Plástico, é um ponto crítico. É crucial investigar se isso reflete a realidade operacional ou uma anomalia nos dados antes de basear decisões estratégicas nessas projeções.")
|
| 229 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 230 |
elif pagina_selecionada == "🎯 Simulação de Faturamento":
|
| 231 |
st.title("🎯 Simulação e Projeção de Faturamento Anual")
|
| 232 |
st.markdown("Utilizando a técnica de *bootstrapping*, simulamos 2.000 possíveis anos de faturamento com base na volatilidade histórica e nas premissas de preço e eficiência definidas.")
|
|
|
|
| 275 |
fig_comp.update_layout(legend_title_text='Material', plot_bgcolor='white', font_color='#333')
|
| 276 |
st.plotly_chart(fig_comp, use_container_width=True)
|
| 277 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 278 |
elif pagina_selecionada == "📊 Análise de Viabilidade":
|
| 279 |
st.title("📊 Análise de Viabilidade Financeira e Risco")
|
| 280 |
st.markdown("Esta é a etapa final, onde combinamos as projeções de receita com as premissas de investimento e custos para avaliar a viabilidade do projeto sob a ótica de risco.")
|
|
|
|
| 354 |
st.markdown("---")
|
| 355 |
st.markdown("#### Detalhes da Análise:")
|
| 356 |
conclusoes = []
|
| 357 |
+
if vpl >= 0:
|
| 358 |
+
conclusoes.append(f"<li><span style='color: {PALETA_CORES_PROFISSIONAL[2]};'>✔</span> **Viabilidade Financeira:** O projeto é considerado **VIÁVEL** com um VPL de **{formatar_brl(vpl)}**.</li>")
|
| 359 |
+
else:
|
| 360 |
+
conclusoes.append(f"<li><span style='color: {PALETA_CORES_PROFISSIONAL[3]};'>❌</span> **Viabilidade Financeira:** O projeto é **INVIÁVEL** com um VPL negativo de **{formatar_brl(vpl)}**.</li>")
|
| 361 |
+
|
| 362 |
+
if not pd.isna(tir) and tir > taxa_desconto:
|
| 363 |
+
conclusoes.append(f"<li><span style='color: {PALETA_CORES_PROFISSIONAL[2]};'>✔</span> **Atratividade do Retorno:** A TIR de **{formatar_percentual(tir)}** supera a TMA de {formatar_percentual(taxa_desconto)}, reforçando a atratividade.</li>")
|
| 364 |
+
else:
|
| 365 |
+
# ESTA É A LINHA CORRIGIDA
|
| 366 |
+
conclusoes.append(f"<li><span style='color: {PALETA_CORES_PROFISSIONAL[3]};'>❌</span> **Atratividade do Retorno:** A TIR de **{formatar_percentual(tir)}** é inferior à TMA, um forte indicador contra o projeto.</li>")
|
| 367 |
+
|
| 368 |
+
if prob_viabilidade > 0.75:
|
| 369 |
+
conclusoes.append(f"<li><span style='color: {PALETA_CORES_PROFISSIONAL[2]};'>✔</span> **Análise de Risco:** A simulação aponta uma **alta probabilidade de sucesso de {formatar_percentual(prob_viabilidade)}**, conferindo robustez à decisão.</li>")
|
| 370 |
+
elif prob_viabilidade > 0.5:
|
| 371 |
+
conclusoes.append(f"<li><span style='color: {PALETA_CORES_PROFISSIONAL[1]};'>⚠️</span> **Análise de Risco:** A probabilidade de sucesso de **{formatar_percentual(prob_viabilidade)} é moderada**, indicando sensibilidade às variações.</li>")
|
| 372 |
+
else:
|
| 373 |
+
conclusoes.append(f"<li><span style='color: {PALETA_CORES_PROFISSIONAL[3]};'>❌</span> **Análise de Risco:** A probabilidade de sucesso de **{formatar_percentual(prob_viabilidade)} é baixa**, indicando um risco elevado.</li>")
|
| 374 |
+
|
| 375 |
+
st.markdown("<ul>" + "".join(conclusoes) + "</ul>", unsafe_allow_html=True)
|