File size: 5,048 Bytes
4b68381
 
c318f99
 
018decc
4b68381
17249dc
df022b3
3910b68
df022b3
 
 
 
3910b68
df022b3
3910b68
df022b3
 
 
 
 
 
3910b68
df022b3
 
 
a268f6c
 
 
 
 
 
 
 
 
 
 
3910b68
a8d856c
cfc693b
3910b68
c318f99
 
4b68381
a8d856c
da0d4b5
 
098ca40
079a1f5
 
098ca40
ad5d544
 
098ca40
b654e25
 
 
 
 
 
 
 
 
 
 
 
ad5d544
b654e25
ad5d544
b654e25
ad5d544
098ca40
b654e25
ad5d544
b654e25
098ca40
a2fbaf9
 
 
 
 
 
 
 
 
 
 
d283271
a2fbaf9
 
 
 
9f3b801
d283271
9f3b801
a2fbaf9
ad5d544
a2fbaf9
 
098ca40
78b5466
1cee5ae
cdcda6d
78b5466
 
bdd90e4
 
78b5466
bdd90e4
78b5466
 
bdd90e4
 
 
 
78b5466
2864c62
 
 
 
 
 
 
 
 
 
7b357aa
 
2864c62
 
 
 
78b5466
bdd90e4
 
 
 
78b5466
 
bdd90e4
2864c62
7d074fa
 
bdd90e4
7d074fa
 
 
78b5466
 
1cee5ae
78b5466
 
2864c62
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
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.')