fschwartzer commited on
Commit
da611d3
1 Parent(s): 3bf2525

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +169 -176
app.py CHANGED
@@ -108,132 +108,20 @@ for conta in instituicao_df['Conta'].unique():
108
  # Combine all adjusted rows back into a single DataFrame
109
  filtered_df = pd.concat(adjusted_rows)
110
 
111
- #col1, col2, col3 = st.columns(3) # This divides the page into three equal parts
112
-
113
  # Set custom width for columns
114
- col1, col2, col3, col4, col5 = st.columns([2,1,1,1,1])
115
-
116
- # Display the Forecasts values in the first column
117
- col1.header('Composição da RLIT')
118
 
119
  tab_df = df[df['Instituição'] == selected_instituicao]
120
 
121
  data = []
122
 
123
- for conta in tab_df['Conta'].unique():
124
- # Filter the DataFrame for the current 'Conta'
125
- conta_df = tab_df[tab_df['Conta'] == conta]
126
-
127
- if len(conta_df['Modelo'].unique()) > 1 and "Linear Regression" in conta_df['Modelo'].unique():
128
- conta_df = conta_df[conta_df['Modelo'] == "Linear Regression"]
129
-
130
- # Initialize a variable to store the sum for the current 'Conta'
131
- conta_sum = 0.0
132
-
133
- # Take the first 'Modelo' for simplicity
134
- modelo = conta_df['Modelo'].iloc[0]
135
-
136
- # Iterate over each row in the filtered DataFrame for the current 'Conta'
137
- for _, row in conta_df.iterrows():
138
- lines = row['Forecasts'].split('\n')
139
- for line in lines[:-1]: # Skip the summary line
140
- if line.strip():
141
- parts = line.split()
142
- value = parts[-1]
143
- try:
144
- conta_sum += float(value)
145
- except ValueError:
146
- print(f"Skipping line unable to convert to float: {line}")
147
-
148
- # Append the data to the list
149
- data.append({'Conta': conta, 'Modelo': modelo, 'Próximos 12 meses': conta_sum})
150
-
151
- # Convert the list to a DataFrame
152
- table_data = pd.DataFrame(data)
153
- total_sum = table_data['Próximos 12 meses'].sum()
154
-
155
- labels = table_data['Conta']
156
- sizes = [(i / total_sum) * 100 for i in table_data['Próximos 12 meses']]
157
-
158
- fig1, ax1 = plt.subplots()
159
- ax1.pie(sizes, labels=labels, autopct='%1.1f%%',)
160
- ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
161
-
162
- col1.pyplot(fig1)
163
-
164
-
165
- # Display the Forecasts values in the first column
166
- col2.header('Valores previstos')
167
-
168
- if not filtered_df.empty:
169
- data_string = filtered_df['Forecasts'].iloc[0]
170
-
171
- # Split the string into lines
172
- lines = data_string.split('\n')
173
-
174
- mes = 0
175
-
176
- # Iterate through the lines and extract the values
177
- for line in lines[:-1]: # Skip the last two lines which might not contain forecast data
178
- period, value = line.split()
179
- num_float = float(value)
180
- monetary_value = f'R$ {num_float:,.2f}' # Adding commas for thousands separator
181
- mes += 1
182
- col2.write(f"Mês {mes}: {monetary_value}")
183
- else:
184
- col2.warning('No data available for the selected filters.')
185
-
186
- # Display the Forecasts values as line plots in the second column
187
- col3.header('Gráfico com previsões')
188
-
189
- if not filtered_df.empty:
190
- data_string = filtered_df['Forecasts'].iloc[0]
191
-
192
- # Create a list to store data for each period
193
- data = []
194
-
195
- # Split the string into lines
196
- lines = data_string.split('\n')
197
-
198
- mes = 0
199
-
200
- # Iterate through the lines and extract the values
201
- for line in lines[:-1]:
202
- period, value = line.split()
203
- num_float = float(value)
204
- monetary_value = f'R$ {num_float:,.2f}' # Adding commas for thousands separator
205
- mes += 1
206
- data.append({'Period': int(mes), 'Monetary Value': num_float})
207
-
208
- # Create a DataFrame from the list
209
- chart_data = pd.DataFrame(data)
210
-
211
- # Sort the DataFrame by 'Period'
212
- chart_data = chart_data.sort_values(by='Period')
213
-
214
- # Display line chart with "period" on X-axis and "Monetary Value" on Y-axis
215
- col3.line_chart(chart_data.set_index('Period'))
216
-
217
- else:
218
- col3.warning('No data available for the selected filters.')
219
-
220
- # Display the table in the third column
221
- #col3 = st.columns(1) # You can use st.columns(1) to create a single column layout
222
-
223
- if not filtered_df.empty:
224
- # Filter the DataFrame for the selected institution
225
- tab_df = df[df['Instituição'] == selected_instituicao]
226
-
227
- # Create an empty list to store data
228
- data = []
229
-
230
- # Iterate through each unique 'Conta' in the filtered DataFrame
231
  for conta in tab_df['Conta'].unique():
232
  # Filter the DataFrame for the current 'Conta'
233
  conta_df = tab_df[tab_df['Conta'] == conta]
234
 
235
  if len(conta_df['Modelo'].unique()) > 1 and "Linear Regression" in conta_df['Modelo'].unique():
236
- conta_df = conta_df[conta_df['Modelo'] == "Linear Regression"]
237
 
238
  # Initialize a variable to store the sum for the current 'Conta'
239
  conta_sum = 0.0
@@ -253,79 +141,184 @@ if not filtered_df.empty:
253
  except ValueError:
254
  print(f"Skipping line unable to convert to float: {line}")
255
 
256
- # Format the sum as a monetary value
257
- monetary_value = f'R$ {conta_sum:,.2f}'
258
-
259
  # Append the data to the list
260
- data.append({'Conta': conta, 'Modelo': modelo, 'Próximos 12 meses': monetary_value})
261
 
262
  # Convert the list to a DataFrame
263
  table_data = pd.DataFrame(data)
 
264
 
265
- last_df = ultimo_ano[ultimo_ano['Instituição'] == selected_instituicao]
266
- last_df.drop(['Instituição'], axis=1, inplace=True)
267
- print(last_df)
268
- last_sum = last_df.iloc[:,-1].sum()
269
- def format_currency(x):
270
- return "R${:,.2f}".format(x)
271
- last_df['Últimos 12 meses'] = last_df['Últimos 12 meses'].apply(format_currency)
272
- table_data = pd.merge(table_data, last_df)
273
-
274
- print(table_data)
275
-
276
- try:
277
- # Calculate the grand total sum of 'Próximos 12 meses' and 'Últimos 12 meses' values
278
- total_sum = sum(float(row['Próximos 12 meses'].replace('R$ ', '').replace(',', '')) for row in data)
279
- total_sum_prev = last_sum
280
-
281
- # Append the "Total" row
282
- total_row = pd.DataFrame({
283
- 'Conta': ['TOTAL (RLIT)'],
284
- 'Modelo': [''],
285
- 'Próximos 12 meses': [f'R$ {total_sum:,.2f}'],
286
- 'Últimos 12 meses': [f'R$ {total_sum_prev:,.2f}']
287
- })
288
- table_data = pd.concat([table_data, total_row], ignore_index=True)
289
-
290
- # Additional rows calculations and appending
291
- # Assuming percentages for health and education as previously mentioned
292
- saude_value = total_sum * 0.15
293
- educacao_value = total_sum * 0.25
294
- saude_value_prev = total_sum_prev * 0.15
295
- educacao_value_prev = total_sum_prev * 0.25
296
- saude_row = pd.DataFrame({'Conta': ['Saúde (15% da RLIT)'], 'Modelo': [''], 'Próximos 12 meses': [f'R$ {saude_value:,.2f}'], 'Últimos 12 meses': [f'R$ {saude_value_prev:,.2f}']})
297
- educacao_row = pd.DataFrame({'Conta': ['Educação (25% da RLIT)'], 'Modelo': [''], 'Próximos 12 meses': [f'R$ {educacao_value:,.2f}'], 'Últimos 12 meses': [f'R$ {educacao_value_prev:,.2f}']})
298
-
299
- # Append these rows to the table data
300
- table_data = pd.concat([table_data, saude_row, educacao_row], ignore_index=True)
301
-
302
- table_data.fillna('-', inplace=True)
303
-
304
- # Display the table using Streamlit
305
- st.table(table_data)
306
 
307
- except Exception as e:
308
- st.error(f"Error in processing data: {str(e)}")
309
 
310
- else:
311
- col5.warning('No data available for the selected filters.')
312
 
 
 
 
 
 
313
 
314
- data = {
315
- "Últimos 12 meses": [saude_value_prev, educacao_value_prev], # Placeholder data for 'Last 12 Months'
316
- "Próximos 12 meses": [saude_value, educacao_value] # Placeholder data for 'Next 12 Months'
317
- }
318
 
319
- # Define the index names
320
- index_names = ["Saúde", "Educação"] # 'Health' and 'Education'
 
 
 
 
 
 
 
321
 
322
- df = pd.DataFrame(data, index=index_names).reset_index().melt(id_vars='index', var_name='Period', value_name='Value')
323
 
324
- # Create the bar chart
325
- fig = px.bar(df, x='index', y='Value', color='Period', barmode='group')
326
- col4.write(fig)
327
 
328
- st.markdown("""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329
  <b>Observação:</b> Previsões realizadas com dados extraídos do Relatório Resumido de Execução Orçamentária (RREO) até o 6º bimestre de 2023 no Sistema de Informações Contábeis e Fiscais do Setor Público Brasileiro (SICONFI).
330
  [Link](https://siconfi.tesouro.gov.br/)
331
- """, unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  # Combine all adjusted rows back into a single DataFrame
109
  filtered_df = pd.concat(adjusted_rows)
110
 
 
 
111
  # Set custom width for columns
112
+ tab1, tab2, tab3, tab4 = st.tabs(["Composição RLIT", "Valores Previstos", "Tabela Resumo", "Comparativo - Saúde e Eduacação"])
 
 
 
113
 
114
  tab_df = df[df['Instituição'] == selected_instituicao]
115
 
116
  data = []
117
 
118
+ with tab1:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  for conta in tab_df['Conta'].unique():
120
  # Filter the DataFrame for the current 'Conta'
121
  conta_df = tab_df[tab_df['Conta'] == conta]
122
 
123
  if len(conta_df['Modelo'].unique()) > 1 and "Linear Regression" in conta_df['Modelo'].unique():
124
+ conta_df = conta_df[conta_df['Modelo'] == "Linear Regression"]
125
 
126
  # Initialize a variable to store the sum for the current 'Conta'
127
  conta_sum = 0.0
 
141
  except ValueError:
142
  print(f"Skipping line unable to convert to float: {line}")
143
 
 
 
 
144
  # Append the data to the list
145
+ data.append({'Conta': conta, 'Modelo': modelo, 'Próximos 12 meses': conta_sum})
146
 
147
  # Convert the list to a DataFrame
148
  table_data = pd.DataFrame(data)
149
+ total_sum = table_data['Próximos 12 meses'].sum()
150
 
151
+ labels = table_data['Conta']
152
+ sizes = [(i / total_sum) * 100 for i in table_data['Próximos 12 meses']]
153
+
154
+ fig1, ax1 = plt.subplots()
155
+ ax1.pie(sizes, labels=labels, autopct='%1.1f%%',)
156
+ ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
 
158
+ st.pyplot(fig1)
 
159
 
160
+ with tab1:
 
161
 
162
+ if not filtered_df.empty:
163
+ data_string = filtered_df['Forecasts'].iloc[0]
164
+
165
+ # Split the string into lines
166
+ lines = data_string.split('\n')
167
 
168
+ mes = 0
 
 
 
169
 
170
+ # Iterate through the lines and extract the values
171
+ for line in lines[:-1]: # Skip the last two lines which might not contain forecast data
172
+ period, value = line.split()
173
+ num_float = float(value)
174
+ monetary_value = f'R$ {num_float:,.2f}' # Adding commas for thousands separator
175
+ mes += 1
176
+ st.write(f"Mês {mes}: {monetary_value}")
177
+ else:
178
+ st.warning('No data available for the selected filters.')
179
 
180
+ # Display the Forecasts values as line plots in the second column
181
 
182
+ if not filtered_df.empty:
183
+ data_string = filtered_df['Forecasts'].iloc[0]
 
184
 
185
+ # Create a list to store data for each period
186
+ data = []
187
+
188
+ # Split the string into lines
189
+ lines = data_string.split('\n')
190
+
191
+ mes = 0
192
+
193
+ # Iterate through the lines and extract the values
194
+ for line in lines[:-1]:
195
+ period, value = line.split()
196
+ num_float = float(value)
197
+ monetary_value = f'R$ {num_float:,.2f}' # Adding commas for thousands separator
198
+ mes += 1
199
+ data.append({'Period': int(mes), 'Monetary Value': num_float})
200
+
201
+ # Create a DataFrame from the list
202
+ chart_data = pd.DataFrame(data)
203
+
204
+ # Sort the DataFrame by 'Period'
205
+ chart_data = chart_data.sort_values(by='Period')
206
+
207
+ # Display line chart with "period" on X-axis and "Monetary Value" on Y-axis
208
+ st.line_chart(chart_data.set_index('Period'))
209
+
210
+ else:
211
+ st.warning('No data available for the selected filters.')
212
+
213
+
214
+ with tab3:
215
+ if not filtered_df.empty:
216
+ # Filter the DataFrame for the selected institution
217
+ tab_df = df[df['Instituição'] == selected_instituicao]
218
+
219
+ # Create an empty list to store data
220
+ data = []
221
+
222
+ # Iterate through each unique 'Conta' in the filtered DataFrame
223
+ for conta in tab_df['Conta'].unique():
224
+ # Filter the DataFrame for the current 'Conta'
225
+ conta_df = tab_df[tab_df['Conta'] == conta]
226
+
227
+ if len(conta_df['Modelo'].unique()) > 1 and "Linear Regression" in conta_df['Modelo'].unique():
228
+ conta_df = conta_df[conta_df['Modelo'] == "Linear Regression"]
229
+
230
+ # Initialize a variable to store the sum for the current 'Conta'
231
+ conta_sum = 0.0
232
+
233
+ # Take the first 'Modelo' for simplicity
234
+ modelo = conta_df['Modelo'].iloc[0]
235
+
236
+ # Iterate over each row in the filtered DataFrame for the current 'Conta'
237
+ for _, row in conta_df.iterrows():
238
+ lines = row['Forecasts'].split('\n')
239
+ for line in lines[:-1]: # Skip the summary line
240
+ if line.strip():
241
+ parts = line.split()
242
+ value = parts[-1]
243
+ try:
244
+ conta_sum += float(value)
245
+ except ValueError:
246
+ print(f"Skipping line unable to convert to float: {line}")
247
+
248
+ # Format the sum as a monetary value
249
+ monetary_value = f'R$ {conta_sum:,.2f}'
250
+
251
+ # Append the data to the list
252
+ data.append({'Conta': conta, 'Modelo': modelo, 'Próximos 12 meses': monetary_value})
253
+
254
+ # Convert the list to a DataFrame
255
+ table_data = pd.DataFrame(data)
256
+
257
+ last_df = ultimo_ano[ultimo_ano['Instituição'] == selected_instituicao]
258
+ last_df.drop(['Instituição'], axis=1, inplace=True)
259
+ print(last_df)
260
+ last_sum = last_df.iloc[:,-1].sum()
261
+ def format_currency(x):
262
+ return "R${:,.2f}".format(x)
263
+ last_df['Últimos 12 meses'] = last_df['Últimos 12 meses'].apply(format_currency)
264
+ table_data = pd.merge(table_data, last_df)
265
+
266
+ print(table_data)
267
+
268
+ try:
269
+ # Calculate the grand total sum of 'Próximos 12 meses' and 'Últimos 12 meses' values
270
+ total_sum = sum(float(row['Próximos 12 meses'].replace('R$ ', '').replace(',', '')) for row in data)
271
+ total_sum_prev = last_sum
272
+
273
+ # Append the "Total" row
274
+ total_row = pd.DataFrame({
275
+ 'Conta': ['TOTAL (RLIT)'],
276
+ 'Modelo': [''],
277
+ 'Próximos 12 meses': [f'R$ {total_sum:,.2f}'],
278
+ 'Últimos 12 meses': [f'R$ {total_sum_prev:,.2f}']
279
+ })
280
+ table_data = pd.concat([table_data, total_row], ignore_index=True)
281
+
282
+ # Additional rows calculations and appending
283
+ # Assuming percentages for health and education as previously mentioned
284
+ saude_value = total_sum * 0.15
285
+ educacao_value = total_sum * 0.25
286
+ saude_value_prev = total_sum_prev * 0.15
287
+ educacao_value_prev = total_sum_prev * 0.25
288
+ saude_row = pd.DataFrame({'Conta': ['Saúde (15% da RLIT)'], 'Modelo': [''], 'Próximos 12 meses': [f'R$ {saude_value:,.2f}'], 'Últimos 12 meses': [f'R$ {saude_value_prev:,.2f}']})
289
+ educacao_row = pd.DataFrame({'Conta': ['Educação (25% da RLIT)'], 'Modelo': [''], 'Próximos 12 meses': [f'R$ {educacao_value:,.2f}'], 'Últimos 12 meses': [f'R$ {educacao_value_prev:,.2f}']})
290
+
291
+ # Append these rows to the table data
292
+ table_data = pd.concat([table_data, saude_row, educacao_row], ignore_index=True)
293
+
294
+ table_data.fillna('-', inplace=True)
295
+
296
+ # Display the table using Streamlit
297
+ st.table(table_data)
298
+
299
+ except Exception as e:
300
+ st.error(f"Error in processing data: {str(e)}")
301
+
302
+ else:
303
+ st.warning('No data available for the selected filters.')
304
+
305
+ st.markdown("""
306
  <b>Observação:</b> Previsões realizadas com dados extraídos do Relatório Resumido de Execução Orçamentária (RREO) até o 6º bimestre de 2023 no Sistema de Informações Contábeis e Fiscais do Setor Público Brasileiro (SICONFI).
307
  [Link](https://siconfi.tesouro.gov.br/)
308
+ """, unsafe_allow_html=True)
309
+
310
+
311
+ with tab4:
312
+ data = {
313
+ "Últimos 12 meses": [saude_value_prev, educacao_value_prev], # Placeholder data for 'Last 12 Months'
314
+ "Próximos 12 meses": [saude_value, educacao_value] # Placeholder data for 'Next 12 Months'
315
+ }
316
+
317
+ # Define the index names
318
+ index_names = ["Saúde", "Educação"] # 'Health' and 'Education'
319
+
320
+ df = pd.DataFrame(data, index=index_names).reset_index().melt(id_vars='index', var_name='Period', value_name='Value')
321
+
322
+ # Create the bar chart
323
+ fig = px.bar(df, x='index', y='Value', color='Period', barmode='group')
324
+ st.write(fig)