dinodrits commited on
Commit
02879ba
·
1 Parent(s): 3d89494

atualizando

Browse files
Files changed (2) hide show
  1. app.py +117 -81
  2. requirements.txt +2 -1
app.py CHANGED
@@ -1,83 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
  import numpy as np
3
- import matplotlib.pyplot as plt
4
-
5
- st.set_page_config(page_title="Simulação Monte Carlo - PROCAD", layout="wide")
6
-
7
- st.title("Simulação Monte Carlo - PROCAD")
8
- st.markdown("""
9
- Simule a carga de trabalho diária dos procuradores do PROCAD usando Monte Carlo.
10
- Agora é possível escolher diferentes distribuições: **Normal, Triangular, Uniforme ou Exponencial**,
11
- permitindo modelar cenários com ou sem tempo médio bem definido.
12
- """)
13
-
14
- # --- Sidebar para parâmetros ---
15
- st.sidebar.header("Parâmetros da Simulação")
16
- #num_procuradores = st.sidebar.number_input("Número de procuradores", min_value=1, value=30, step=1)
17
- st.markdown("<h4 style='color: #003366;'>Quantidade de procuradores (p)</h4>", unsafe_allow_html=True)
18
- num_procuradores = st.slider("", min_value=1, max_value=60, value=30, step=1)
19
- num_processos = st.sidebar.number_input("Número de processos por dia", min_value=1, value=60, step=1)
20
- distribuicao = st.sidebar.selectbox("Distribuição do tempo de atendimento",
21
- ["Normal","Triangular","Uniforme","Exponencial"])
22
-
23
- param1 = st.sidebar.number_input("Parâmetro 1 (média ou mínimo)", value=4.0)
24
- param2 = st.sidebar.number_input("Parâmetro 2 (desvio, moda ou máximo)", value=1.0)
25
- param3 = st.sidebar.number_input("Parâmetro 3 (Triangular - máximo)", value=6.0)
26
-
27
- horas_trabalho_dia = 8
28
- simulacoes = 1000
29
- todos_workloads = []
30
-
31
- # --- Monte Carlo ---
32
- for _ in range(simulacoes):
33
- if distribuicao == "Normal":
34
- media = param1
35
- desvio = param2
36
- tempos = np.random.normal(loc=media, scale=desvio, size=num_processos)
37
- tempos = np.maximum(tempos, 0.5)
38
- elif distribuicao == "Triangular":
39
- left = param1
40
- mode = param2
41
- right = param3
42
- tempos = np.random.triangular(left=left, mode=mode, right=right, size=num_processos)
43
- elif distribuicao == "Uniforme":
44
- low = param1
45
- high = param2
46
- tempos = np.random.uniform(low=low, high=high, size=num_processos)
47
- elif distribuicao == "Exponencial":
48
- scale = param1
49
- tempos = np.random.exponential(scale=scale, size=num_processos)
50
- else:
51
- st.error("Distribuição não suportada")
52
- st.stop()
53
-
54
- workload = np.zeros(num_procuradores)
55
- for t in tempos:
56
- procurador = np.random.randint(0, num_procuradores)
57
- workload[procurador] += t
58
- todos_workloads.append(workload)
59
-
60
- todos_workloads = np.array(todos_workloads)
61
-
62
- # --- Estatísticas ---
63
- media_workload = np.mean(todos_workloads, axis=0)
64
- prob_sobrecarga = np.mean(np.any(todos_workloads > horas_trabalho_dia, axis=1))
65
-
66
- # --- Plot ---
67
- fig, ax = plt.subplots(figsize=(12,6))
68
- ax.boxplot(todos_workloads, labels=[f"P{p+1}" for p in range(num_procuradores)])
69
- ax.axhline(y=horas_trabalho_dia, color='r', linestyle='--', label="Limite diário (8h)")
70
- ax.set_ylabel("Horas trabalhadas")
71
- ax.set_xlabel("Procuradores")
72
- ax.set_title(f"Distribuição do workload diário - {distribuicao}")
73
- ax.legend()
74
- st.pyplot(fig)
75
-
76
- # --- Resultados ---
77
- st.subheader("Estatísticas")
78
- st.markdown(f"""
79
- - Média de workload por procurador: {media_workload.round(2)}
80
- - Probabilidade de sobrecarga diária: {prob_sobrecarga:.2%}
81
- - Distribuição utilizada: {distribuicao}
82
- - Número de procuradores: {num_procuradores}, Processos por dia: {num_processos}
83
- """)
 
1
+ # import streamlit as st
2
+ # import numpy as np
3
+ # import matplotlib.pyplot as plt
4
+
5
+ # st.set_page_config(page_title="Simulação Monte Carlo - PROCAD", layout="wide")
6
+
7
+ # st.title("Simulação Monte Carlo - PROCAD")
8
+ # st.markdown("""
9
+ # Simule a carga de trabalho diária dos procuradores do PROCAD usando Monte Carlo.
10
+ # Agora é possível escolher diferentes distribuições: **Normal, Triangular, Uniforme ou Exponencial**,
11
+ # permitindo modelar cenários com ou sem tempo médio bem definido.
12
+ # """)
13
+
14
+ # # --- Sidebar para parâmetros ---
15
+ # st.sidebar.header("Parâmetros da Simulação")
16
+ # #num_procuradores = st.sidebar.number_input("Número de procuradores", min_value=1, value=30, step=1)
17
+ # st.markdown("<h4 style='color: #003366;'>Quantidade de procuradores (p)</h4>", unsafe_allow_html=True)
18
+ # num_procuradores = st.slider("", min_value=1, max_value=60, value=30, step=1)
19
+ # num_processos = st.sidebar.number_input("Número de processos por dia", min_value=1, value=60, step=1)
20
+ # distribuicao = st.sidebar.selectbox("Distribuição do tempo de atendimento",
21
+ # ["Normal","Triangular","Uniforme","Exponencial"])
22
+
23
+ # param1 = st.sidebar.number_input("Parâmetro 1 (média ou mínimo)", value=4.0)
24
+ # param2 = st.sidebar.number_input("Parâmetro 2 (desvio, moda ou máximo)", value=1.0)
25
+ # param3 = st.sidebar.number_input("Parâmetro 3 (Triangular - máximo)", value=6.0)
26
+
27
+ # horas_trabalho_dia = 8
28
+ # simulacoes = 1000
29
+ # todos_workloads = []
30
+
31
+ # # --- Monte Carlo ---
32
+ # for _ in range(simulacoes):
33
+ # if distribuicao == "Normal":
34
+ # media = param1
35
+ # desvio = param2
36
+ # tempos = np.random.normal(loc=media, scale=desvio, size=num_processos)
37
+ # tempos = np.maximum(tempos, 0.5)
38
+ # elif distribuicao == "Triangular":
39
+ # left = param1
40
+ # mode = param2
41
+ # right = param3
42
+ # tempos = np.random.triangular(left=left, mode=mode, right=right, size=num_processos)
43
+ # elif distribuicao == "Uniforme":
44
+ # low = param1
45
+ # high = param2
46
+ # tempos = np.random.uniform(low=low, high=high, size=num_processos)
47
+ # elif distribuicao == "Exponencial":
48
+ # scale = param1
49
+ # tempos = np.random.exponential(scale=scale, size=num_processos)
50
+ # else:
51
+ # st.error("Distribuição não suportada")
52
+ # st.stop()
53
+
54
+ # workload = np.zeros(num_procuradores)
55
+ # for t in tempos:
56
+ # procurador = np.random.randint(0, num_procuradores)
57
+ # workload[procurador] += t
58
+ # todos_workloads.append(workload)
59
+
60
+ # todos_workloads = np.array(todos_workloads)
61
+
62
+ # # --- Estatísticas ---
63
+ # media_workload = np.mean(todos_workloads, axis=0)
64
+ # prob_sobrecarga = np.mean(np.any(todos_workloads > horas_trabalho_dia, axis=1))
65
+
66
+ # # --- Plot ---
67
+ # fig, ax = plt.subplots(figsize=(12,6))
68
+ # ax.boxplot(todos_workloads, labels=[f"P{p+1}" for p in range(num_procuradores)])
69
+ # ax.axhline(y=horas_trabalho_dia, color='r', linestyle='--', label="Limite diário (8h)")
70
+ # ax.set_ylabel("Horas trabalhadas")
71
+ # ax.set_xlabel("Procuradores")
72
+ # ax.set_title(f"Distribuição do workload diário - {distribuicao}")
73
+ # ax.legend()
74
+ # st.pyplot(fig)
75
+
76
+ # # --- Resultados ---
77
+ # st.subheader("Estatísticas")
78
+ # st.markdown(f"""
79
+ # - Média de workload por procurador: {media_workload.round(2)}
80
+ # - Probabilidade de sobrecarga diária: {prob_sobrecarga:.2%}
81
+ # - Distribuição utilizada: {distribuicao}
82
+ # - Número de procuradores: {num_procuradores}, Processos por dia: {num_processos}
83
+ # """)
84
+
85
+
86
+
87
  import streamlit as st
88
  import numpy as np
89
+ import plotly.express as px
90
+ import pandas as pd
91
+
92
+ # Slider com label correto
93
+ num_procuradores = st.slider(
94
+ "Número de Procuradores",
95
+ min_value=1, max_value=60, value=30, step=1,
96
+ label_visibility="visible"
97
+ )
98
+
99
+ # Simulação simples de workloads (exemplo)
100
+ np.random.seed(42)
101
+ todos_workloads = [np.random.poisson(lam=100, size=50) for _ in range(num_procuradores)]
102
+
103
+ # Transformar em DataFrame para usar no Plotly
104
+ df = pd.DataFrame({
105
+ "Procurador": np.repeat([f"P{p+1}" for p in range(num_procuradores)], 50),
106
+ "Workload": np.concatenate(todos_workloads)
107
+ })
108
+
109
+ # Criar boxplot interativo
110
+ fig = px.box(
111
+ df,
112
+ x="Procurador",
113
+ y="Workload",
114
+ points="all", # mostra os pontos além do boxplot
115
+ title="Distribuição de workloads por Procurador"
116
+ )
117
+
118
+ # Mostrar no Streamlit
119
+ st.plotly_chart(fig, use_container_width=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -1,3 +1,4 @@
1
  streamlit
2
  numpy
3
- matplotlib
 
 
1
  streamlit
2
  numpy
3
+ plotly.express
4
+ pandas