ricardoadriano commited on
Commit
9f2813b
·
verified ·
1 Parent(s): 4eb201d

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +20 -24
src/streamlit_app.py CHANGED
@@ -32,46 +32,42 @@ def _to_num(s):
32
  errors="coerce"
33
  )
34
 
35
- def _try_read_csv_only_root(path="levantamentoTurmas.csv"):
36
- """
37
- exclusivamente ./levantamentoTurmas.csv na raiz do Space.
38
- Tenta múltiplos separadores e encodings. Não faz upload, nem busca em outras pastas.
39
- """
40
- p = Path(path)
41
- if not p.exists():
42
- return None, f"Arquivo esperado não encontrado: {path} (coloque na raiz do Space)."
43
-
44
  last_err = None
45
  for enc in ("utf-8-sig", "utf-8", "latin1"):
46
  for sep in (None, ",", ";", "\t"): # None = autodetect
47
  try:
48
- df = pd.read_csv(p, sep=sep, engine="python", encoding=enc)
49
  if df.shape[1] == 1 and sep is None:
50
- df = pd.read_csv(p, sep=";", engine="python", encoding=enc)
51
- return df, {"source": str(p), "sep": sep if sep is not None else "auto", "encoding": enc}
52
  except Exception as e:
53
  last_err = e
54
  continue
55
  return None, f"Falha ao ler {path}: {last_err}"
56
 
57
  @st.cache_data(show_spinner=False)
58
- def load_dataframe_root():
59
- df, meta = _try_read_csv_only_root("levantamentoTurmas.csv")
 
60
  if df is None:
61
  return None, meta # mensagem de erro
62
 
63
  # Normalização de cabeçalhos
64
  df.columns = _norm_cols(df.columns)
65
 
66
- # Renomeio inteligente
67
  ren = {}
68
  for c in df.columns:
69
  lc = c.lower()
70
- if _pick(c, [r"^turma"]): ren[c] = "Turma"
71
- elif _pick(c, [r"matriculado"]): ren[c] = "Matriculados"
72
- elif _pick(c, [r"\baprov"]): ren[c] = "Aprovados" if "pct" not in lc else "pct_Aprov"
73
- elif _pick(c, [r"reprov"]): ren[c] = "Reprovados" if "pct" not in lc else "pct_Reprov"
74
- elif _pick(c, [r"desistent|evas"]): ren[c] = "Desistentes" if "pct" not in lc else "pct_Desist"
75
  df = df.rename(columns=ren)
76
 
77
  # Converte números/percentuais
@@ -79,7 +75,7 @@ def load_dataframe_root():
79
  if c in df.columns:
80
  df[c] = _to_num(df[c])
81
 
82
- # Reconstrói contagens se vierem em %
83
  if "Aprovados" not in df.columns and "pct_Aprov" in df.columns:
84
  df["Aprovados"] = (df["pct_Aprov"]/100 * df["Matriculados"]).round()
85
  if "Reprovados" not in df.columns and "pct_Reprov" in df.columns:
@@ -90,7 +86,7 @@ def load_dataframe_root():
90
  need = ["Turma","Matriculados","Aprovados","Reprovados","Desistentes"]
91
  miss = [c for c in need if c not in df.columns]
92
  if miss:
93
- return None, f"Colunas ausentes no CSV raiz: {miss}"
94
 
95
  base = df[need].copy()
96
  for c in need[1:]:
@@ -166,9 +162,9 @@ def sample_turma(base: pd.DataFrame, turma_label: str, n_sim: int, add_k: float,
166
 
167
  # ===================== App =====================
168
  st.title("Simulação de Monte Carlo — Dirichlet–Multinomial")
169
- st.caption("O app lê **./levantamentoTurmas.csv** (raiz do Space). Ajuste os parâmetros na lateral e simule.")
170
 
171
- base, err = load_dataframe_root()
172
  if err:
173
  st.error(err)
174
  st.stop()
 
32
  errors="coerce"
33
  )
34
 
35
+ def _try_read_csv(path: Path):
36
+ """Lê Dados/levantamentoTurmas.csv tentando separadores e encodings comuns."""
37
+ if not path.exists():
38
+ return None, f"Arquivo esperado não encontrado: {path}"
 
 
 
 
 
39
  last_err = None
40
  for enc in ("utf-8-sig", "utf-8", "latin1"):
41
  for sep in (None, ",", ";", "\t"): # None = autodetect
42
  try:
43
+ df = pd.read_csv(path, sep=sep, engine="python", encoding=enc)
44
  if df.shape[1] == 1 and sep is None:
45
+ df = pd.read_csv(path, sep=";", engine="python", encoding=enc)
46
+ return df, {"source": str(path), "sep": sep if sep is not None else "auto", "encoding": enc}
47
  except Exception as e:
48
  last_err = e
49
  continue
50
  return None, f"Falha ao ler {path}: {last_err}"
51
 
52
  @st.cache_data(show_spinner=False)
53
+ def load_dataframe_from_dados():
54
+ csv_path = Path("Dados/levantamentoTurmas.csv")
55
+ df, meta = _try_read_csv(csv_path)
56
  if df is None:
57
  return None, meta # mensagem de erro
58
 
59
  # Normalização de cabeçalhos
60
  df.columns = _norm_cols(df.columns)
61
 
62
+ # Renomeação inteligente
63
  ren = {}
64
  for c in df.columns:
65
  lc = c.lower()
66
+ if _pick(c, [r"^turma"]): ren[c] = "Turma"
67
+ elif _pick(c, [r"matriculado"]): ren[c] = "Matriculados"
68
+ elif _pick(c, [r"\baprov"]): ren[c] = "Aprovados" if "pct" not in lc else "pct_Aprov"
69
+ elif _pick(c, [r"reprov"]): ren[c] = "Reprovados" if "pct" not in lc else "pct_Reprov"
70
+ elif _pick(c, [r"desistent|evas"]): ren[c] = "Desistentes" if "pct" not in lc else "pct_Desist"
71
  df = df.rename(columns=ren)
72
 
73
  # Converte números/percentuais
 
75
  if c in df.columns:
76
  df[c] = _to_num(df[c])
77
 
78
+ # Reconstrói contagens quando vierem apenas em %
79
  if "Aprovados" not in df.columns and "pct_Aprov" in df.columns:
80
  df["Aprovados"] = (df["pct_Aprov"]/100 * df["Matriculados"]).round()
81
  if "Reprovados" not in df.columns and "pct_Reprov" in df.columns:
 
86
  need = ["Turma","Matriculados","Aprovados","Reprovados","Desistentes"]
87
  miss = [c for c in need if c not in df.columns]
88
  if miss:
89
+ return None, f"Colunas ausentes no CSV ({csv_path}): {miss}"
90
 
91
  base = df[need].copy()
92
  for c in need[1:]:
 
162
 
163
  # ===================== App =====================
164
  st.title("Simulação de Monte Carlo — Dirichlet–Multinomial")
165
+ st.caption("O app lê **Dados/levantamentoTurmas.csv**. Ajuste os parâmetros na lateral e simule.")
166
 
167
+ base, err = load_dataframe_from_dados()
168
  if err:
169
  st.error(err)
170
  st.stop()