Skip to content

Commit

Permalink
Ajuste na descrição do que cada arquivo faz e Inclusão do Indice do M…
Browse files Browse the repository at this point in the history
…KDOCS
  • Loading branch information
romuloreisdev committed Jul 27, 2024
1 parent 44016e6 commit fc7f582
Show file tree
Hide file tree
Showing 9 changed files with 15,556 additions and 1 deletion.
1 change: 1 addition & 0 deletions Dados/.~lock.contratos_final1.xlsx#
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
,BOOK-1A7UOBDCO5/romul,BOOK-1A7UOBDCO5,27.07.2024 13:24,file:///C:/Users/romul/AppData/Roaming/LibreOffice/4;
4 changes: 4 additions & 0 deletions Dados/contratos_final_excel.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Este arquivo transforma o Json dos contratos em planilha
#
# trabalhar a consolidação dele com o arquivo "ordenacao_dados.py"

import pandas as pd
import json

Expand Down
6 changes: 6 additions & 0 deletions Dados/info_empresa.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# verificar a ncessidade de manter este arquivo, pois parece que não tem mais utilidade para o projeto
#Gera o arquivo 'x_empresas_contratadas.csv'

# Lê o arquivo"x_empresas_contratadas.json" e gera o arquivo 'x_empresas_contratadas.csv'


import json
import pandas as pd

Expand Down
4 changes: 4 additions & 0 deletions Dados/ordenacao_dados.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@

#Organiza o arquivo Json para que possa ser lido pelo dashboard, consolida com as informações do arquivo "contrato_final1.xlsx", além de possíbilitar ao usuário que o baixe para trabalhá-lo em planilha Excel > Gera o arquivo "contratos_ordenados_completo.csv"

# trabalhar a consolidação dele com o arquivo "contratos_final_excel"


import pandas as pd
import json
Expand Down
39 changes: 38 additions & 1 deletion docs/Arquitetura.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,41 @@ O projeto LicitaNow visa verificar e mostrar aos usuários os gastos públicos d

### Conclusão

A combinação de HTML, CSS e JavaScript para a estrutura e estilo inicial, junto com a biblioteca Streamlit para funcionalidades interativas e visualizações de dados, nos permitiu criar uma aplicação robusta e fácil de usar. Esta abordagem nos permitiu oferecer uma melhor combinação entre: a flexibilidade e personalização do desenvolvimento web tradicional, e a simplicidade e eficiência do Streamlit para análise de dados.
A combinação de HTML, CSS e JavaScript para a estrutura e estilo inicial, junto com a biblioteca Streamlit para funcionalidades interativas e visualizações de dados, nos permitiu criar uma aplicação robusta e fácil de usar. Esta abordagem nos permitiu oferecer uma melhor combinação entre: a flexibilidade e personalização do desenvolvimento web tradicional, e a simplicidade e eficiência do Streamlit para análise de dados.

### Índice de Arquivos

#### coleta_api.py
Faz buscas no API do PNCP, como resultado, ele gera um arquivo Json

#### coleta_cnpj.py
Faz buscas do casdastro de CNPJ no API https://api.cnpjs.dev/v1 utilizando o arquivo 'contratos_OFICIAL.json' e adiciona a ele o resultado das buscas

#### contratos_final_excel.py
Organiza o arquivo Json para que possa ser lido pelo "ordenacao_dados.py"

#### ordenacao_dados.py
Organiza o arquivo Json para que possa ser lido pelo dashboard, consolida com as informações do arquivo "contrato_final1.xlsx", além de possíbilitar ao usuário que o baixe para trabalhá-lo em planilha Excel > Gera o arquivo "contratos_ordenados_completo.csv"

#### info_empresa.py
verificar a necessidade de manter este arquivo, pois parece que não tem mais utilidade para o projeto

- Lê o arquivo"x_empresas_contratadas.json" e gera o arquivo 'x_empresas_contratadas.csv'

#### Rank_empresas.py
Página de arquivos do ranking das empresas


#### Rank_dos_órgãos.py
Página de arquivos do ranking dos órgãos conntratantes

#### Contato.py
Contato do organização do projeto

#### Sobre.py
Sobre nós


#### Menu.py
Menu do Dashboard Interativo

1 change: 1 addition & 0 deletions docs/about.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Sobre Nós
183 changes: 183 additions & 0 deletions grafico3_lit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
import streamlit as st
import pandas as pd
import altair as alt
import plotly_express as px

st.set_page_config(page_title="Queridinhas da Licitação", layout='wide')

tipos_de_dados = {
"Código": str,
"Empresa Contratada": str,
"CNPJ": str,
"Valor Recebido": float,
"Descrição": str
}

@st.cache_data
def carregar_dados():
tabela = pd.read_csv("x_empresas_contratadas.csv", dtype=tipos_de_dados)
tabela = tabela.sort_values(by="Valor Recebido", ascending=False).reset_index()
tabela = tabela.drop("index", axis=1)
return tabela

@st.cache_data
def carregar_dados1():
tabela = pd.read_json("contratos_OFICIAL.json")
tabela = tabela.drop("Empresas Contratadas", axis=1)
return tabela

# Função para inicializar o estado da sessão
def init_session_state():
if "page" not in st.session_state:
st.session_state.page = 0
#if "selected_empresa" not in st.session_state:
# st.session_state.selected_empresa = None

# Inicializando o estado da sessão
init_session_state()

# Função para resetar a paginação
def reset_pagination():
st.session_state.page = 0

with st.container():
st.subheader("RANKING DAS EMPRESAS MAIS BENFICIADAS POR DISPENSA DE LICITAÇÃO")
st.write('Informações sobre contratos')
st.write("Quer saber mais sobre nosso projeto? [clique aqui](www.unb.br)")
st.write('---')
data = carregar_dados()
data1= carregar_dados1()

# Sidebar para selecionar a quantidade de empresas e o intervalo de valores recebidos
N = st.sidebar.selectbox("Selecione a quantidade de empresas", [5, 10, 15, 20, 25, 30, 40], on_change=reset_pagination)
min_value = st.sidebar.number_input("Digite o valor mínimo recebido", min_value=0, max_value=6000000000, value=0, on_change=reset_pagination)
max_value = st.sidebar.number_input("Digite o valor máximo recebido", min_value=0, max_value=6000000000, value=6000000000, on_change=reset_pagination)

# Garantir que o valor máximo é sempre maior ou igual ao valor mínimo
if min_value > max_value:
st.sidebar.error("O valor máximo deve ser maior ou igual ao valor mínimo.")

# Função para ajustar a página ao clicar nos botões
def change_page(change):
st.session_state.page += change
st.rerun()

#def selecionar_empresa(event,altair_event):
# st.session_state.selected_empresa = altair_event['Empresa Contratada']
# st.rerun()

# Filtrando os dados com base no intervalo de valores recebidos
df = data[["Código", "Empresa Contratada", "Valor Recebido"]]
df_group = df.groupby(by=["Empresa Contratada"])["Valor Recebido"].sum().reset_index()
df_group = df_group[(df_group["Valor Recebido"] >= min_value) & (df_group["Valor Recebido"] <= max_value)]
df_group = df_group.sort_values(by="Valor Recebido", ascending=False)

# Implementação da paginação
start_idx = st.session_state.page * N
end_idx = start_idx + N
df_page = df_group.iloc[start_idx:end_idx]
df_group_list = df_page["Empresa Contratada"].tolist()

df_grafico = df[df["Empresa Contratada"].isin(df_group_list)]

altura_grafico = max(400, len(df_group_list) * 35) #Ajusta a altura conforme a lista for aumentando

# Criando o gráfico de barras empilhadas
chart = alt.Chart(df_grafico).mark_bar().encode(
x=alt.X('sum(Valor Recebido):Q', title='Valor Total Recebido ($)'),
y=alt.Y('Empresa Contratada:N', sort=df_group_list, title='Empresas Contratadas por Dispensa de Licitação', axis=alt.Axis(labelLimit=170)),
color=alt.Color('Código:N', legend=None), # legend=alt.Legend(title="Contratos")
order=alt.Order('Código:N', sort='ascending')
).properties(
title= alt.TitleParams(
text='Soma dos Valores Recebidos por Contrato',
anchor= "middle",
color = 'rgba(255, 255, 255, 0.5)' ,
fontSize=20,
fontStyle='oblique',
)
).properties(
height=altura_grafico # Define a altura do gráfico
)

st.altair_chart(chart, use_container_width=True)

# Adiciona o botão "Próxima página" abaixo do gráfico
col1, col2 = st.columns([1, 1])
with col1:
if st.button("Página anterior"):
if st.session_state.page > 0:
change_page(-1)

with col2:
if st.button("Próxima página"):
change_page(1)

st.write(" ")
st.write(" ")
st.write(" ")

#Função que irá fazer o gráfico da pizza
def grafico_pie(dataframe):
# Criando o gráfico de rosca com Plotly Express
fig = px.pie(dataframe, values='Valor Recebido', names='Empresa Contratada', title='Distribuição do Contrato',
hole=0.55, # Define o tamanho do buraco no meio (0.4 = 40%)
labels={'Valor Recebido':'Valor', 'Empresa Contratada':'Empresa'},
hover_data={'Valor Recebido': True, 'Empresa Contratada': True})

# Atualizar as fatias do gráfico para mostrar porcentagem e rótulo
fig.update_traces(textposition='inside', textinfo='percent')

# Personalizar o hovertemplate
fig.update_traces(hovertemplate="<b>%{label}</b><br>Valor: %{value}<br>Percentual: %{percent}")

fig.update_layout(

title_x=0.2 # Centralizar o título
)

return fig


df_filtro = df.groupby(by=["Código", "Empresa Contratada"])["Valor Recebido"].sum().reset_index()

def detalhes_contratos(empresa):
contratos = df_filtro["Código"][df_filtro["Empresa Contratada"]== empresa].to_list()
for i,contrato in enumerate(contratos):
df_filtro1 = df_filtro[df_filtro["Código"] == contrato] #Aqui teremos a lista das empresas contratadas dentro desse contrato específico
df_filtro1 = df_filtro1[["Empresa Contratada", "Valor Recebido"]] #Estamos deixando o dataframe apenas com essas duas colunas
orgao = data1["Órgão Entidade"][data1["Código"]== contrato].iloc[0]
data_compra = data1["Ano da Compra"][data1["Código"]== contrato].iloc[0]
objeto = data1["Objeto da Compra"][data1["Código"]== contrato].iloc[0]
valor = data1["Valor Total Homologado"][data1["Código"]== contrato].iloc[0]
valor_formatado = f"{valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")

col1,col2 = st.columns([3,2]) #define a proporção das colunas

with col1:
if i==0:
st.write(" ")
st.markdown(f"<p><span style='color:red;'>Contrato n° {i+1}:</span> <span '>{contrato}</span></p>", unsafe_allow_html=True)
#st.write(f"Contrato n° {i+1}: {contrato}")
st.markdown(f"<p><span style='border-bottom: 2px solid red;'>Ano da compra</span>: {data_compra}</p>", unsafe_allow_html=True)
st.markdown(f"<p><span style='border-bottom: 2px solid red;'>Órgão Responsável</span>: {orgao}</p>", unsafe_allow_html=True)
st.markdown(f"<p><span style='border-bottom: 2px solid red;'>Objeto da compra do contrato</span>: {objeto}</p>", unsafe_allow_html=True)
#st.write(f"Objeto da compra do contrato: {objeto}")
st.markdown(f"<p><span style='border-bottom: 2px solid red;'>Valor Total Homologado</span>: {valor_formatado}</p>", unsafe_allow_html=True)

with col2:
pie = grafico_pie(df_filtro1) #Adicionando o gráfico pie
st.plotly_chart(pie)

st.write("----")
return contratos

escolha = ["Escolha sua empresa"] + df_group_list
empresa_selecionada = st.selectbox("Selecione a Empresa para ver detalhes dos contratos que ela participou: ", escolha)

if empresa_selecionada != "Escolha sua empresa":
contratos = detalhes_contratos(empresa_selecionada)
st.write(" ")
st.write(" ")
st.write(" ")
selecao_contratos = st.selectbox("Selecione o contrato que deseja: ", contratos)
Loading

0 comments on commit fc7f582

Please sign in to comment.