Thslc99 commited on
Commit
2201c00
·
verified ·
1 Parent(s): c5f1b28

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -11
app.py CHANGED
@@ -58,7 +58,7 @@ hr {{ border: none; border-top: 1px solid #1f2937; margin: 8px 0 16px 0; }}
58
  """, unsafe_allow_html=True)
59
 
60
  # ---------- Utilidades ----------
61
- def _norm_key(s: Optional[str]) -> str:
62
  if s is None:
63
  return ""
64
  s = str(s).strip().lower()
@@ -69,16 +69,83 @@ def _norm_key(s: Optional[str]) -> str:
69
  @st.cache_data(show_spinner=False)
70
  def load_csv(upload) -> pd.DataFrame:
71
  """
72
- A: garante 'escritorio_cat' SEMPRE:
73
- - se não existir no CSV, cria;
74
- - se vier nula, preenche com 'escritorio_responsavel'.
75
  """
76
  if upload is None:
77
  return pd.DataFrame()
78
 
 
79
  df = pd.read_csv(upload)
80
 
81
- # colunas esperadas (inclui 'escritorio_cat')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  cols = [
83
  "processo_numero","cliente","contrario","valor_causa","acao","natureza","area","orgao",
84
  "comarca","tribunal","vara","situacao","data_ajuizamento","posicao_cliente",
@@ -88,11 +155,11 @@ def load_csv(upload) -> pd.DataFrame:
88
  if c not in df.columns:
89
  df[c] = None
90
 
91
- # tipos
92
  df["valor_causa"] = pd.to_numeric(df["valor_causa"], errors="coerce")
93
  df["data_ajuizamento"] = pd.to_datetime(df["data_ajuizamento"], errors="coerce")
94
 
95
- # garantia da categoria: se vazia, usa o responsável
96
  df["escritorio_cat"] = (
97
  df["escritorio_cat"]
98
  .fillna(df["escritorio_responsavel"])
@@ -100,6 +167,7 @@ def load_csv(upload) -> pd.DataFrame:
100
  .replace({"None": None})
101
  )
102
 
 
103
  return df[cols]
104
 
105
  @st.cache_data(show_spinner=False)
@@ -109,10 +177,10 @@ def apply_mapping(df: pd.DataFrame, mapping_json: str) -> pd.DataFrame:
109
  return df
110
  try:
111
  raw = json.loads(mapping_json)
112
- mapping = {_norm_key(k): v for k, v in raw.items()}
113
  out = df.copy()
114
  out["escritorio_cat"] = out["escritorio_responsavel"].apply(
115
- lambda x: mapping.get(_norm_key(x), x)
116
  )
117
  return out
118
  except Exception:
@@ -166,8 +234,7 @@ base = apply_mapping(base, mapping_str)
166
  if "escritorio_cat" not in base.columns:
167
  base["escritorio_cat"] = base.get("escritorio_responsavel", "")
168
  base["escritorio_cat"] = base["escritorio_cat"].fillna(base.get("escritorio_responsavel", "")).astype(str)
169
-
170
- for col in ["tribunal", "natureza", "acao", "data_ajuizamento", "valor_causa"]:
171
  if col not in base.columns:
172
  base[col] = None
173
 
@@ -302,3 +369,4 @@ st.download_button(
302
  )
303
 
304
  st.caption("Feito com Streamlit + Plotly. Visual inspirado no Power BI.")
 
 
58
  """, unsafe_allow_html=True)
59
 
60
  # ---------- Utilidades ----------
61
+ def _norm_text(s: Optional[str]) -> str:
62
  if s is None:
63
  return ""
64
  s = str(s).strip().lower()
 
69
  @st.cache_data(show_spinner=False)
70
  def load_csv(upload) -> pd.DataFrame:
71
  """
72
+ CSV, normaliza cabeçalhos e garante colunas canônicas.
73
+ Garante 'escritorio_cat' (A) e tipagem básica.
 
74
  """
75
  if upload is None:
76
  return pd.DataFrame()
77
 
78
+ # 1) lê CSV
79
  df = pd.read_csv(upload)
80
 
81
+ # 2) normaliza nomes de colunas (lower, sem acento, sem espaços extras)
82
+ original_cols = list(df.columns)
83
+ norm_cols = [_norm_text(c) for c in original_cols]
84
+ rename_map = dict(zip(original_cols, norm_cols))
85
+ df = df.rename(columns=rename_map)
86
+
87
+ # 3) mapeia cabeçalhos comuns -> canônicos
88
+ header_map = {
89
+ # processo
90
+ "numero do processo": "processo_numero",
91
+ "número do processo": "processo_numero",
92
+ "processo numero": "processo_numero",
93
+ "processo": "processo_numero",
94
+ "num do processo": "processo_numero",
95
+ "nº do processo": "processo_numero",
96
+
97
+ # cliente / parte contrária
98
+ "cliente": "cliente",
99
+ "parte contraria": "contrario",
100
+ "parte contrária": "contrario",
101
+ "contrario": "contrario",
102
+
103
+ # valores
104
+ "valor da causa": "valor_causa",
105
+ "valor causa": "valor_causa",
106
+ "valor_causa": "valor_causa",
107
+
108
+ # ação / natureza / área
109
+ "acao": "acao",
110
+ "ação": "acao",
111
+ "natureza": "natureza",
112
+ "area": "area",
113
+ "área": "area",
114
+
115
+ # órgãos / localização
116
+ "orgao": "orgao",
117
+ "órgão": "orgao",
118
+ "comarca": "comarca",
119
+ "tribunal": "tribunal",
120
+ "vara": "vara",
121
+
122
+ # situação / datas / posição do cliente
123
+ "situacao": "situacao",
124
+ "situação": "situacao",
125
+ "data de ajuizamento": "data_ajuizamento",
126
+ "data ajuizamento": "data_ajuizamento",
127
+ "posicao do cliente": "posicao_cliente",
128
+ "posição do cliente": "posicao_cliente",
129
+
130
+ # escritório
131
+ "escritorio responsavel": "escritorio_responsavel",
132
+ "escritório responsavel": "escritorio_responsavel",
133
+ "escritório responsável": "escritorio_responsavel",
134
+ "escritorio_responsavel": "escritorio_responsavel",
135
+ "escritorio cat": "escritorio_cat",
136
+ "categoria escritorio": "escritorio_cat",
137
+ "categoria do escritorio": "escritorio_cat",
138
+
139
+ # página
140
+ "pagina": "pagina_pdf",
141
+ "página": "pagina_pdf",
142
+ "pagina pdf": "pagina_pdf",
143
+ "página pdf": "pagina_pdf",
144
+ }
145
+
146
+ df = df.rename(columns={c: header_map[c] for c in list(df.columns) if c in header_map})
147
+
148
+ # 4) garante as colunas canônicas (cria se não existir)
149
  cols = [
150
  "processo_numero","cliente","contrario","valor_causa","acao","natureza","area","orgao",
151
  "comarca","tribunal","vara","situacao","data_ajuizamento","posicao_cliente",
 
155
  if c not in df.columns:
156
  df[c] = None
157
 
158
+ # 5) tipagem
159
  df["valor_causa"] = pd.to_numeric(df["valor_causa"], errors="coerce")
160
  df["data_ajuizamento"] = pd.to_datetime(df["data_ajuizamento"], errors="coerce")
161
 
162
+ # 6) A: garante categoria (se vazia, usa responsável)
163
  df["escritorio_cat"] = (
164
  df["escritorio_cat"]
165
  .fillna(df["escritorio_responsavel"])
 
167
  .replace({"None": None})
168
  )
169
 
170
+ # devolve apenas canônicas
171
  return df[cols]
172
 
173
  @st.cache_data(show_spinner=False)
 
177
  return df
178
  try:
179
  raw = json.loads(mapping_json)
180
+ mapping = {_norm_text(k): v for k, v in raw.items()}
181
  out = df.copy()
182
  out["escritorio_cat"] = out["escritorio_responsavel"].apply(
183
+ lambda x: mapping.get(_norm_text(x), x)
184
  )
185
  return out
186
  except Exception:
 
234
  if "escritorio_cat" not in base.columns:
235
  base["escritorio_cat"] = base.get("escritorio_responsavel", "")
236
  base["escritorio_cat"] = base["escritorio_cat"].fillna(base.get("escritorio_responsavel", "")).astype(str)
237
+ for col in ["tribunal", "natureza", "acao", "data_ajuizamento", "valor_causa", "processo_numero", "cliente", "contrario"]:
 
238
  if col not in base.columns:
239
  base[col] = None
240
 
 
369
  )
370
 
371
  st.caption("Feito com Streamlit + Plotly. Visual inspirado no Power BI.")
372
+