PPSP2 / src /streamlit_app.py
Pegumenezes's picture
Rename src/app.py to src/streamlit_app.py
2900569 verified
Raw
History Blame Contribute Delete
9.59 kB
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
# --- Dados ---
meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']
dados_2024 = {
'Mes': meses,
'Papel_Papelao': [8047, 11287, 8184, 10183, 5699, 5830, 7465, 5600, 2960, 5175, 9656, 3960],
'Plastico': [6353, 8771, 6993, 8050, 4880, 5296, 5937, 4747, 2446, 4109, 7667, 3367],
'Metal': [1061, 2025, 1121, 1832, 716, 936, 1553, 904, 361, 630, 1904, 569],
'Vidro': [5248, 6929, 6014, 5821, 3697, 3655, 4950, 3360, 1580, 3261, 6173, 2357]
}
df_2024 = pd.DataFrame(dados_2024)
dados_anuais = {
'Ano': [2022, 2023, 2024],
'Papel_Papelao': [18780, 58718, 84046],
'Plastico': [5340, 1041, 8279],
'Metal': [1300, 1737, 19955],
'Vidro': [0, 725, 1709]
}
df_anuais = pd.DataFrame(dados_anuais)
precos = {
'Papel_Papelao': 0.50,
'Plastico': 0.80,
'Metal': 2.00,
'Vidro': 0.30
}
# --- Estatísticas descritivas ---
desc = df_2024.drop(columns='Mes').describe().T
desc['Mediana'] = df_2024.drop(columns='Mes').median()
desc = desc[['mean', 'Mediana', 'std', 'min', 'max']]
desc.columns = ['Média', 'Mediana', 'Desvio Padrão', 'Mínimo', 'Máximo']
# --- Simulação de faturamento ---
estatisticas = {}
for material in precos.keys():
media = df_2024[material].mean()
std = df_2024[material].std()
estatisticas[material] = {'media': media, 'std': std}
def simular_faturamento_anual(estats, precos, fator=1.0, n_sim=1000, seed=42):
np.random.seed(seed)
faturamentos = []
for _ in range(n_sim):
total = 0
for material, stats in estats.items():
medias = stats['media'] * fator
stds = stats['std']
quantidades = np.random.normal(medias, stds, 12)
quantidades = np.clip(quantidades, 0, None)
total += quantidades.sum() * precos[material]
faturamentos.append(total)
return np.array(faturamentos)
cenarios = {
'Base': 1.0,
'Otimista': 1.15,
'Pessimista': 0.85
}
simulacoes = {nome: simular_faturamento_anual(estatisticas, precos, fator=fator) for nome, fator in cenarios.items()}
# --- Streamlit App ---
st.title('Dashboard de Recicláveis e Faturamento')
# Sidebar
materiais_opcoes = ['Todos'] + list(precos.keys())
cenarios_opcoes = ['Todos', 'Otimista', 'Pessimista', 'Base']
material = st.sidebar.selectbox('Selecione o material', materiais_opcoes)
cenario = st.sidebar.selectbox('Selecione o cenário de faturamento', cenarios_opcoes)
# --- Gráficos organizados ---
if material != 'Todos':
# Evolução anual
st.header(f'Evolução Anual de {material}')
fig1 = px.bar(df_anuais, x='Ano', y=material, title=f'Evolução Anual de {material}',
labels={'value': 'Quantidade (kg)', 'Ano': 'Ano'},
template='plotly_white', text_auto=True)
fig1.update_layout(title_font_size=20, xaxis_title='Ano', yaxis_title='Quantidade (kg)')
st.plotly_chart(fig1, use_container_width=True)
# Evolução mensal
st.header(f'Evolução Mensal de {material} em 2024')
fig2 = px.line(df_2024, x='Mes', y=material, markers=True, title=f'Evolução Mensal de {material} em 2024',
labels={'Mes': 'Mês', material: 'Quantidade (kg)'}, template='plotly_white')
fig2.update_layout(title_font_size=20, xaxis_title='Mês', yaxis_title='Quantidade (kg)')
st.plotly_chart(fig2, use_container_width=True)
else:
# Evolução anual de todos
st.header('Evolução Anual de Todos os Materiais')
df_anuais_melt = df_anuais.melt(id_vars='Ano', var_name='Material', value_name='Quantidade')
fig1 = px.bar(df_anuais_melt, x='Ano', y='Quantidade', color='Material', barmode='group',
title='Evolução Anual de Todos os Materiais',
labels={'Quantidade': 'Quantidade (kg)', 'Ano': 'Ano'}, template='plotly_white', text_auto=True)
fig1.update_layout(title_font_size=20, xaxis_title='Ano', yaxis_title='Quantidade (kg)')
st.plotly_chart(fig1, use_container_width=True)
# Evolução mensal de todos
st.header('Evolução Mensal de Todos os Materiais em 2024')
df_2024_melt = df_2024.melt(id_vars='Mes', var_name='Material', value_name='Quantidade')
fig2 = px.line(df_2024_melt, x='Mes', y='Quantidade', color='Material', markers=True,
title='Evolução Mensal de Todos os Materiais em 2024',
labels={'Mes': 'Mês', 'Quantidade': 'Quantidade (kg)'}, template='plotly_white')
fig2.update_layout(title_font_size=20, xaxis_title='Mês', yaxis_title='Quantidade (kg)')
st.plotly_chart(fig2, use_container_width=True)
# Estatísticas descritivas
st.header('Estatísticas Descritivas (2024)')
st.dataframe(desc.style.format('{:,.2f}'))
# Boxplot
st.header('Boxplot dos Materiais em 2024')
fig3 = px.box(df_2024.melt(id_vars='Mes', var_name='Material', value_name='Quantidade'),
x='Material', y='Quantidade', title='Boxplot dos Materiais em 2024',
labels={'Quantidade': 'Quantidade (kg)'}, template='plotly_white')
fig3.update_layout(title_font_size=20, xaxis_title='Material', yaxis_title='Quantidade (kg)')
st.plotly_chart(fig3, use_container_width=True)
# --- Simulação de faturamento ---
st.header('Distribuição do Faturamento Anual Simulado')
# Função para tabela resumo
cores = {'Base': '#1f77b4', 'Otimista': '#2ca02c', 'Pessimista': '#d62728'}
def tabela_resumo(simulacoes):
dados = []
for nome in cenarios.keys():
media = simulacoes[nome].mean()
std = simulacoes[nome].std()
dados.append([nome, f"{media:,.2f}", f"{std:,.2f}"])
df_faturamento_anual = pd.DataFrame(dados, columns=['Cenário', 'Faturamento Anual Médio (R$)', 'Desvio Padrão (R$)'])
return df_faturamento_anual
def grafico_cenarios(simulacoes):
fig = go.Figure()
for nome in cenarios.keys():
fig.add_trace(go.Histogram(
x=simulacoes[nome],
name=nome,
histnorm='probability density',
opacity=0.5,
nbinsx=30,
marker_color=cores[nome],
showlegend=True
))
fig.add_vline(x=simulacoes[nome].mean(), line_dash='dash', line_color=cores[nome],
annotation_text=f'Média {nome}', annotation_position='top right')
fig.update_layout(
barmode='overlay',
title='Distribuição do Faturamento Anual Simulado (2024)',
xaxis_title='Faturamento Total Anual (R$)',
yaxis_title='Densidade',
legend_title='Cenário',
template='plotly_white',
title_font_size=20
)
return fig
if cenario != 'Todos' and material != 'Todos':
dados = simular_faturamento_anual({material: estatisticas[material]}, {material: precos[material]}, fator=cenarios[cenario.capitalize()])
fig4 = px.histogram(dados, nbins=30, title=f'Distribuição do Faturamento Anual Simulado - {material} ({cenario.capitalize()})',
labels={'value': 'Faturamento Anual (R$)'}, template='plotly_white')
fig4.add_vline(x=dados.mean(), line_dash='dash', line_color='red', annotation_text='Média', annotation_position='top right')
fig4.update_layout(title_font_size=20, xaxis_title='Faturamento Anual (R$)', yaxis_title='Frequência')
st.plotly_chart(fig4, use_container_width=True)
st.write(f"Média do faturamento anual ({cenario.capitalize()}): R$ {dados.mean():,.2f}")
elif cenario == 'Todos' and material != 'Todos':
# Tabela resumo
simulacoes_mat = {cen: simular_faturamento_anual({material: estatisticas[material]}, {material: precos[material]}, fator=cenarios[cen]) for cen in cenarios}
st.subheader('Resumo Estatístico dos Cenários')
st.dataframe(tabela_resumo(simulacoes_mat))
# Gráfico de densidade
st.plotly_chart(grafico_cenarios(simulacoes_mat), use_container_width=True)
elif cenario != 'Todos' and material == 'Todos':
# Consolidar faturamento de todos os materiais para o cenário selecionado
dados = simular_faturamento_anual(estatisticas, precos, fator=cenarios[cenario.capitalize()])
fig4 = px.histogram(dados, nbins=30,
title=f'Distribuição do Faturamento Anual Simulado - Todos Materiais ({cenario.capitalize()})',
labels={'value': 'Faturamento Anual (R$)'}, template='plotly_white')
fig4.add_vline(x=dados.mean(), line_dash='dash', line_color='red', annotation_text='Média', annotation_position='top right')
fig4.update_layout(title_font_size=20, xaxis_title='Faturamento Anual (R$)', yaxis_title='Frequência')
st.plotly_chart(fig4, use_container_width=True)
st.write(f"Média do faturamento anual (Todos os Materiais, {cenario.capitalize()}): R$ {dados.mean():,.2f}")
st.write(f"Desvio padrão: R$ {dados.std():,.2f}")
else: # Todos cenários e todos materiais
# Consolidar faturamento de todos os materiais para cada cenário
simulacoes_totais = {cen: simular_faturamento_anual(estatisticas, precos, fator=cenarios[cen]) for cen in cenarios}
st.subheader('Resumo Estatístico Consolidado dos Cenários (Todos os Materiais)')
st.dataframe(tabela_resumo(simulacoes_totais))
st.plotly_chart(grafico_cenarios(simulacoes_totais), use_container_width=True)