Spaces:
Running
Running
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
df = pd.read_csv('last_results_5.csv') | |
image1 = 'images/rs_pmpa.PNG' | |
title_html = """ | |
<style> | |
@font-face { | |
font-family: 'Quicksand'; | |
src: url('font/Quicksand-VariableFont_wght.ttf') format('truetype'); | |
} | |
body { | |
font-family: 'Quicksand', sans-serif; | |
} | |
.custom-title { | |
color: darkgreen; | |
font-size: 30px; | |
font-weight: bold; | |
} | |
</style> | |
<span class='custom-title'>PREVISÕES DE RECEITAS</span> | |
""" | |
# Set a fixed width for the sidebar | |
st.markdown( | |
""" | |
<style> | |
.sidebar .sidebar-content { | |
width: 300px; | |
} | |
</style> | |
""", | |
unsafe_allow_html=True | |
) | |
with st.sidebar: | |
st.image(image1, use_column_width=True) | |
st.markdown(title_html, unsafe_allow_html=True) | |
selected_instituicao = st.selectbox('Seleciona Instituição', df['Instituição'].unique()) | |
selected_conta = st.selectbox('Seleciona Conta', df['Conta'].unique()) | |
# Filter the DataFrame based on selected values | |
filtered_df = df[(df['Instituição'] == selected_instituicao) & (df['Conta'] == selected_conta)] | |
# Set custom width for columns | |
col1_width = 400 | |
col2_width = 400 | |
col1, col2 = st.columns([col1_width, col2_width]) | |
# Display the Forecasts values in the first column | |
col1.header('Valores previstos') | |
if not filtered_df.empty: | |
data_string = filtered_df['Forecasts'].iloc[0] | |
# Split the string into lines | |
lines = data_string.split('\n') | |
# Iterate through the lines and extract the values | |
for line in lines[:-2]: | |
period, value = line.split() | |
num_float = float(value) | |
monetary_value = f'R$ {num_float:,.2f}' # Adding commas for thousands separator | |
col1.write(f"Período {period}: {monetary_value}") | |
else: | |
col1.warning('No data available for the selected filters.') | |
# Display the Forecasts values as line plots in the second column | |
col2.header('Gráfico com previsões') | |
if not filtered_df.empty: | |
data_string = filtered_df['Forecasts'].iloc[0] | |
# Create a list to store data for each period | |
data = [] | |
# Split the string into lines | |
lines = data_string.split('\n') | |
# Iterate through the lines and extract the values | |
for line in lines[:-2]: | |
period, value = line.split() | |
num_float = float(value) | |
monetary_value = f'R$ {num_float:,.2f}' # Adding commas for thousands separator | |
data.append({'Period': int(period), 'Monetary Value': num_float}) | |
# Create a DataFrame from the list | |
chart_data = pd.DataFrame(data) | |
# Sort the DataFrame by 'Period' | |
chart_data = chart_data.sort_values(by='Period') | |
# Display line chart with "period" on X-axis and "Monetary Value" on Y-axis | |
col2.line_chart(chart_data.set_index('Period')) | |
else: | |
col2.warning('No data available for the selected filters.') | |
# Display the table in the third column | |
col3 = st.columns(1) # You can use st.columns(1) to create a single column layout | |
if not filtered_df.empty: | |
# Filter the DataFrame for the selected institution | |
tab_df = df[df['Instituição'] == selected_instituicao] | |
# Create an empty list to store data | |
data = [] | |
# Iterate through each unique 'Conta' in the filtered DataFrame | |
for conta in tab_df['Conta'].unique(): | |
# Filter the DataFrame for the current 'Conta' | |
conta_df = tab_df[tab_df['Conta'] == conta] | |
# Initialize a variable to store the sum for the current 'Conta' | |
conta_sum = 0.0 | |
# Iterate over each row in the filtered DataFrame for the current 'Conta' | |
for _, row in conta_df.iterrows(): | |
# Split the 'Forecasts' column's multiline string into lines | |
lines = row['Forecasts'].split('\n') | |
# For each line, extract the numeric value and add it to the conta_sum | |
for line in lines: | |
if line.strip(): # Ensure the line is not empty | |
parts = line.split() | |
value = parts[-1] # Take the last element as the value | |
conta_sum += float(value) | |
# Format the sum as a monetary value | |
monetary_value = f'R$ {conta_sum:,.2f}' | |
# Append the sum for the current 'Conta' to the data list | |
data.append({'Conta': conta, 'Valor Monetário': monetary_value}) | |
# Convert the list to a DataFrame | |
table_data = pd.DataFrame(data) | |
# Calculate the grand total sum of all 'Conta' values | |
total_sum = sum(float(row['Valor Monetário'].replace('R$ ', '').replace(',', '')) for row in data) | |
# Create a DataFrame for the "Total" row | |
total_row = pd.DataFrame({'Conta': ['TOTAL'], 'Valor Monetário': [f'R$ {total_sum:,.2f}']}) | |
# Concatenate the "Total" row with the existing table data | |
table_data = pd.concat([table_data, total_row], ignore_index=True) | |
# Display the table | |
st.table(table_data) | |
else: | |
col3.warning('No data available for the selected filters.') |