From 06fedce7409b28cb6f5faf33051ee52d8f280250 Mon Sep 17 00:00:00 2001 From: Daniel R Date: Thu, 28 Apr 2022 14:49:53 -0300 Subject: [PATCH] =?UTF-8?q?Nova=20Estiliza=C3=A7=C3=A3o=20-=2028/04=20-=20?= =?UTF-8?q?14:47?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Banco de Dados/BancoDados.xlsx | Bin 15953 -> 0 bytes "SegundaAvalia\303\247\303\243o copy.py" | 805 +++++++++++++++++++++++ assets/css.css | 50 ++ assets/logo.png | Bin 0 -> 16669 bytes assets/style.css | 92 --- 5 files changed, 855 insertions(+), 92 deletions(-) delete mode 100644 Banco de Dados/BancoDados.xlsx create mode 100644 "SegundaAvalia\303\247\303\243o copy.py" create mode 100644 assets/css.css create mode 100644 assets/logo.png delete mode 100644 assets/style.css diff --git a/Banco de Dados/BancoDados.xlsx b/Banco de Dados/BancoDados.xlsx deleted file mode 100644 index 6b1adcc241e79dfffbf508c7be6c971b1e9063c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15953 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 diff --git "a/SegundaAvalia\303\247\303\243o copy.py" "b/SegundaAvalia\303\247\303\243o copy.py" new file mode 100644 index 0000000..b0cb0ec --- /dev/null +++ "b/SegundaAvalia\303\247\303\243o copy.py" @@ -0,0 +1,805 @@ +# VERSÃO FINAL - ÚNICA - V1.0 +# ALTERADA EM 03/04 -- 18:30 + + +# EXPORTAÇÕES: +import plotly.express as px +from pandas import read_excel +from dash import Dash, dcc, html, Input, Output, State +import plotly.graph_objects as go +import dash_bootstrap_components as dbc + + +# DECLARAÇÃO DO 1º DATAFRAME: +df1 = read_excel("https://github.com/Trabalho-APC-DASH/Painel-APC/blob/main/Banco%20de%20Dados/Brasil-Exportacao_cafe_por_pais.xlsx?raw=true") + +# DECLARAÇÃO DO 2º DATAFRAME: +df2 = read_excel('https://github.com/Trabalho-APC-DASH/Painel-APC/blob/main/Banco%20de%20Dados/UnidadesReceita.xlsx?raw=true') + +# DECLARAÇÃO DO 3º DATAFRAME: +df3 = read_excel('https://github.com/Trabalho-APC-DASH/Painel-APC/blob/main/Banco%20de%20Dados/Preco_Medio.xlsx?raw=true') + +# DECLARAÇÃO DO 4º DATAFRAME: +df4 = read_excel('https://github.com/Trabalho-APC-DASH/Painel-APC/blob/main/Banco%20de%20Dados/Paises_exportadores_cafe.xlsx?raw=true') + + + +# INÍCIO A ORGANIZAÇÃO DE DADOS: +# ========================================================================= +# DATAFRAME 1) + +# ORGANIZAÇÃO DAS OPÇÕES PARA O DROPDOWN: +def funcao_unique(lista): + + resultado = [] + + unicidade = set(lista) + + for elemento in unicidade: + resultado.append(elemento) + + return resultado + +opcoes = funcao_unique(df1['CONTINENTE']) + +opcoes.insert(0, 'Todos os Continentes') +del opcoes[1] +opcoes2 = ['ARÁBICA (Por sacas de 60kg)', 'CONILLON (Por sacas de 60kg)', 'SOLÚVEL (Por sacas de 60kg)', 'TORRADO (Por sacas de 60kg)', 'TOTAL'] + +# DECLARAÇÃO DE COMO O GRÁFICO IRÁ SER ORGANIZADO: +fig1 = px.bar(df1, x="CONTINENTE", y="TOTAL", color="PAÍS DESTINO", title='Compra de Café Brasileiro por País') + +# =========================================================================== +# DATAFRAME 2) + +# TRANSFORMAÇÃO DO DF2 PARA UMA LISTA MODIFICÁVEL: +lista = df2.values + +# DECLARAÇÃO DO DATAFRAME OFICIAL DO DF2: +dfOf1 = [] + +# REORGANIZAÇÃO DO DF2: +for n in lista: + dfOf1 += [[n[0], n[1], 'Importação Jan/Fev2022']] + dfOf1 += [[n[0], n[3], 'Exportação Jan/Fev2022']] + dfOf1 += [[n[0], n[5], 'Importação Jan/Fev2021']] + dfOf1 += [[n[0], n[7], 'Exportação Jan/Fev2021']] + + +# DECLARAÇÃO DE COMO O GRÁFICO IRÁ SER ORGANIZADO: +fig2 = px.bar(dfOf1, x=0, y=1, color=2, barmode="group", title='Exportação/Importação por Receita Federal', labels={ + '0': 'Unidade Da Receita Federal', + '1': 'Sacas (60kg)', + '2': 'Tipo' + }) + +fig2.update_layout( + paper_bgcolor='rgba(0, 0, 0, 0.2)', + font_color='white', + ) + +receita_filtragem = [] +for n in lista: + receita_filtragem += [n[0]] + +receita_filtragem.insert(0, 'Todos') +# ============================================================================ +# DATAFRAME 3) + + +# MEMORIZAÇÃO DAS COLUNAS DA PRIMEIRA LINHA PRESENTE NO DATAFRAME 3: +opcoes3 = [] +for n in df3: + opcoes3 += [n] + +# EXCLUSÃO DE DADOS DESNECESSÁRIOS PARA EXIBIÇÃO NO GRÁFICO: +del opcoes3[0] +del opcoes3[6] + +# DECLARAÇÃO PRIMÁRIA DE COMO O GRÁFICO IRÁ SER ORGANIZADO: +fig3 = go.Figure() + +for cafe in opcoes3: + fig3.add_trace(go.Scatter(x=df3['Mês/Ano'], y=df3[cafe], + mode='lines', name=cafe)) + +# ATUALIZAÇÃO DE TÍTULO E NOMEAÇÃO DA PARTE VERTICAL DO GRÁFICO E HORIZONTAL: +fig3.update_layout(title='Preço Médio do Café Brasileiro', + xaxis_title='Ano', + yaxis_title='Preço (US$)') + +# INSERÇÃO DE UMA NOVA OPÇÃO PARA O DROPDOWN: +opcoes3.insert(0, 'Todos os Tipos de Café') + +# ============================================================================== +# DATAFRAME 4) + +# TRANSFORMAÇÃO DO DF4 PARA UMA LISTA MODIFICÁVEL: +Lista3 = df4.values + +# LISTA DE TODOS OS PAÍSES DIVIDIDO POR CONTINENTES PARA SER UTILIZADO NO PASSSO MAIS ABAIXO: +Oceania = ['Estados Federados da Micronésia', 'Fiji', 'Ilhas Marshall', 'Ilhas Salomão', 'Kiribati' ,'Nauru', 'Nova Zelândia', 'Palau', 'Papua-Nova Guiné', 'Samoa', 'Tonga', 'Tuvalu', 'Vanuatu', 'Ilhas Cook'] +América_do_Norte = ['Canadá', 'Estados Unidos da América', 'México'] +América_Central = ['Antígua e Barbuda', 'Bahamas', 'Barbados', 'Belize', 'Costa Rica', 'Cuba', 'Dominica', 'El Salvador', 'Granada', 'Guatemala', 'Haiti', 'Honduras', 'Jamaica', 'Nicarágua', 'Panamá', 'República Dominicana', 'Santa Lúcia', 'São Cristóvão e Névis', 'São Vicente e Granadinas', 'Trindade e Tobago'] +América_do_Sul = ['Argentina', 'Bolívia', 'Brasil', 'Chile', 'Colômbia', 'Equador', 'Guiana', 'Guiana Francesa', 'Paraguai', 'Peru', 'Suriname', 'Uruguai', 'Venezuela'] +Europa = ['Albânia', 'Alemanha', 'Andorra', 'Áustria', 'Bélgica', 'Bielorrússia', 'Bósnia e Herzegovina', 'Bulgária', 'Cazaquistão', 'Chipre', 'Croácia', 'Dinamarca', 'Eslováquia', 'Eslovênia', 'Espanha', 'Estônia', 'Finlândia', 'França', 'Grécia', 'Hungria', 'Irlanda', 'Islândia', 'Itália', 'Letônia', 'Liechtenstein', 'Lituânia', 'Luxemburgo', 'Malta', 'Moldávia', 'Mônaco', 'Montenegro', 'Noruega', 'Países Baixos', 'Polônia', 'Portugal', 'Tchéquia', 'Macedônia do Norte', 'Inglaterra', 'Irlanda do Norte', 'Escócia', 'País de Gales', 'Romênia', 'Rússia', 'San Marino', 'Sérvia', 'Suécia', 'Suíça', 'Turquia', 'Ucrânia', 'Vaticano'] +Ásia = ['Timor Leste', 'Birmânia', 'Afeganistão', 'Arábia Saudita', 'Armênia', 'Azerbaijão', 'Bahrein', 'Bangladesh', 'Brunei', 'Butão', 'Camboja', 'Cazaquistão', 'Catar', 'China', 'Chipre', 'Cingapura', 'Coreia do Norte', 'Coreia do Sul', 'Egito', 'Emirados Árabes', 'Filipinas', 'Geórgia', 'Iêmen', 'Índia', 'Indonésia', 'Irã', 'Iraque', 'Israel', 'Japão', 'Jordânia', 'Kuwait', 'Laos', 'Líbano', 'Malásia', 'Maldivas', 'Mianmar', 'Mongólia', 'Nepal', 'Omã', 'Paquistão', 'Quirguistão', 'Rússia', 'Síria', 'Sri Lanka', 'Tajiquistão', 'Tailândia', 'Timor-Leste', 'Turcomenistão', 'Turquia', 'Uzbequistão', 'Vietnã', 'Taiwan', 'República Popular da China'] +África = ['África do Sul', 'Angola', 'Argélia', 'Benim', 'Botswana', 'Burquina Faso', 'Burundi', 'Camarões', 'Chade', 'Costa do Marfim', 'Djibouti', 'Egito', 'Eritreia', 'Etiópia', 'Gabão', 'Gâmbia', 'Gana', 'Guiné', 'Guiné-Bissau', 'Guiné Equatorial', 'Madagáscar', 'Cabo Verde', 'Comores', 'São Tomé e Príncipe', 'Seychelles', 'Lesoto', 'Libéria', 'Líbia', 'Malawi', 'Mali', 'Marrocos', 'Mauritânia', 'Moçambique', 'Namíbia', 'Níger', 'Nigéria', 'Quênia', 'República da África Central', 'República Democrática do Congo', 'República do Congo', 'República de Maurício', 'Ruanda', 'Senegal', 'Serra Leoa', 'Somália', 'Eswatini', 'Sudão', 'Sudão do Sul', 'Tanzânia', 'Togo', 'Tunísia', 'Uganda', 'Zâmbia', 'Zimbábue', 'República Popular do Congo'] + +# DECLARAÇÃO DO DATAFRAME OFICIAL DO DF4: +dfOf3 = [] + +# INÍCIO DE REPETIÇÃO PARA CADA ELEMENTO DA LISTA "ListaDeFiltro" +for ln in Lista3: + for cont in Oceania: # INÍCIO DE REPETIÇÃO PARA CADA ELEMENTO DA LISTA "Oceania" + + if ln[1] == cont: # CASO O PAÍS DA LISTA DE FILTRO SE ENCONTRE NA DA OCEANIA, SEU CONTINENTE SERÁ OCEANIA. + dfOf3 += [[ln[0], ln[1], ln[2],'Oceania']] + + for cont in América_do_Norte: # INÍCIO DE REPETIÇÃO PARA CADA ELEMENTO DA LISTA "América_Do_Norte" + + if ln[1] == cont: # CASO O PAÍS DA LISTA DE FILTRO SE ENCONTRE NA AMÉRICA DO NORTE, SEU CONTINENTE SERÁ AMÉRICA DO NORTE. + dfOf3 += [[ln[0], ln[1], ln[2], 'América do Norte']] + + for cont in América_Central: # MESMA LÓGICA DOS PASSOS ANTERIORES... + if ln[1] == cont: + dfOf3 += [[ln[0], ln[1], ln[2], 'América Central']] + + for cont in América_do_Sul: + if ln[1] == cont: + dfOf3 += [[ln[0], ln[1], ln[2], 'América do Sul']] + + for cont in Europa: + if ln[1] == cont: + dfOf3 += [[ln[0], ln[1], ln[2], 'Europa']] + + for cont in Ásia: + if ln[1] == cont: + dfOf3 += [[ln[0], ln[1], ln[2], 'Ásia']] + + for cont in África: + if ln[1] == cont: + dfOf3 += [[ln[0], ln[1], ln[2], 'África']] + + +# DECLARAÇÃO DE COMO O GRÁFICO IRÁ SER ORGANIZADO: +fig4 = px.scatter_geo(dfOf3, # Definição do DataFrame a ser utilizado + title= 'Produção de Café Anual (Toneladas)', + locations= 0, # As localizações se darão da coluna 0 do DataFrame, que são os ID's + projection= 'orthographic', # Projeção do mapa no tipo Ortográfica + opacity= 1, # Definição da opacidade das bolinhas no mapa + hover_name= 1, # Dado de Nome, que foi definido pela coluna 1 do DataFrame, que é os Países + color= 3, # Definição da separação de cores, definida pela coluna 3 do DataFrame, que são os continentes + hover_data=[2], # Definição de Acrescimo de informação, neste caso a coluna 2 esta sendo acrescentada nos dados do mapa, que são as Produções + labels={'3':'Continente', '0':'País ID', "2":'Produção'} # Renomeação dos tópicos no mapa, para que seja melhor interpretado +) + +fig4.update_geos( + landcolor="#06832F", + oceancolor="#1E8AC9", + showocean=True, + lakecolor="#5FC4D0", +) + +fig4.update_layout( + paper_bgcolor='rgba(0, 0, 0, 0.2)', + font_color='white', + ) +# ======================================================================================= +# INÍCIO PARA EXECUÇÃO DO LAYOUT E INSERÇÃO DOS GRÁFICOS: + + +# CONEXÃO DO APP COM O FRAMEWORK BOOTSTRAP: +app = Dash(external_stylesheets=[dbc.themes.BOOTSTRAP]) + +# --------------------------------------------------------------------------------------- +# CRIAÇÃO EM PARTES DO SITE: + + # A) BARRA LATERAL: + + +# DEFINIÇÕES DE ESTILO PARA A BARRA LATERAL +ESTILO_BARRA_LATERAL = { + "position": "fixed", + "top": 0, + "left": 0, + "bottom": 0, + "width": "16rem", + "padding": "2rem 1rem", + "background-color": "rgba(221, 162, 99, 0)", +} + +# INTENS A SEREM UTILIZADO NA BARRA LATERAL: +items = [ + dbc.DropdownMenuItem("Gráfico 1", n_clicks=0, id='Drop1'), + dbc.DropdownMenuItem(divider=True), + dbc.DropdownMenuItem("Gŕafico 2", n_clicks=0, id='Drop2'), + dbc.DropdownMenuItem(divider=True), + dbc.DropdownMenuItem("Gráfico 3", n_clicks=0, id='Drop3'), +] + +# DEFINIÇÃO DA BARRA LARETAL: +barralateral = html.Div( + [ # TEXTOS: + html.H2("Café☕", className="display-4", style={'color': 'white'}), + html.Hr(), + html.P( + 'Confira o movimento de mercado do Café Brasileiro', className="lead", style={'color': 'white'} + ), + # ÁREA DE NAVEGAÇÃO: + dbc.Nav( + [ + # INSERÇÃO DO DROOPDOWN: + dbc.DropdownMenu( + label="FIltros", children=items, direction="down" + ), + + + html.Hr(), + + html.P('INFO:', style={'color': 'white', 'margin-top': '2vh'}), + + # DEMAIS OPÇÕES (QUE SERÃO OS INFO DE CADA GRÁFICO): + dbc.NavLink("Exportações", href="/page-1", id='menu1'), + dbc.NavLink("Compra", href="/page2", id='menu2'), + dbc.NavLink("Preços", href="/page-4", id='menu3'), + dbc.NavLink("Produções", href="/page-5", id='menu4'), + + # ÁREA PARA ACESSO AOS DESENVOLVEDORES: + html.P('DESENVOLVEDORES:', style={'color': 'white', 'margin-top': '3vh'}), + + html.A('Acesse Aqui', href='Desenvolvedores.html', className='link', target='_Blank'), + + html.Div([ + + # IMAGEM LOGO DA UNB: + html.Img(src='./assets/logo.png', width=200, className='LogoId') + + ], className='Alinhamento'), + + html.Div('Desenvolvido por alunos da Universidade De Brasília - FGA', style={'color': 'black', 'text-align': 'center', 'font-family': 'Century Gothic', 'font-weight': 'bold'}) + ], + vertical=True, + pills=True, + ), + ], + style=ESTILO_BARRA_LATERAL, +) + +# ----------------------------------------------------------------------------------------- +# DECLARAÇÃO EM PARTES DO SITE: + + # B) MODAIS: + +modalPrim1 = html.Div( + [ + dbc.Modal( + [ # TÍTULO DO MODAL: + dbc.ModalHeader(dbc.ModalTitle("Filtro: Primeiro Gráfico (Barras)")), + + # CORPO DO MODAL: + dbc.ModalBody([ + + html.P('Selecione o continente a ser FIltrado:'), + + dcc.Dropdown(opcoes, value='Todos os Continentes', id='Filtro_Continentes', className='Dropdown1', style={ + 'background-color': 'chocolate', + 'border-radius': '14px', + 'border-color': 'transparent', + }), + + + + + html.P('Selecione o Tipo de Café a ser FIltrado:', style={'margin-top': '2vh'}), + + dcc.Dropdown(opcoes2, value='TOTAL', id='Filtro_Tipo', className='Dropdown2', style={ + 'background-color': 'chocolate', + 'border-radius': '14px', + 'border-color': 'transparent', + 'margin-bottom': '1vh', + 'margin-top': '1vh' + }), + ]), + + # RODAPÉ DO MODAL: + dbc.ModalFooter( + dbc.Button( + "Fechar", id="closePrim1", className="ms-auto", n_clicks=0, color='dark', outline=True + ) + ), + ], + id="modalPrim1", + is_open=False, + size='lg' + ), + ] +) + +modalPrim2 = html.Div( + [ + dbc.Modal( + [ + dbc.ModalHeader(dbc.ModalTitle("Filtro: Segundo Gráfico (Barras em Grupos)")), + dbc.ModalBody([ + + html.P('Selecione a Localização da Receita Federal a Ser filtrada:'), + + dcc.Dropdown(receita_filtragem, value='Todos', id='filtro4', className='Dropdown4', style={ + 'background-color': 'chocolate', + 'border-radius': '14px', + 'border-color': 'transparent', + 'margin-bottom': '1vh'}), + + ]), + dbc.ModalFooter( + dbc.Button( + "Fechar", id="closePrim2", className="ms-auto", n_clicks=0, color='dark', outline=True + ) + ), + ], + id="modalPrim2", + is_open=False, + size='lg' + ), + ] +) + +modalPrim3 = html.Div( + [ + dbc.Modal( + [ + dbc.ModalHeader(dbc.ModalTitle("Filtro: Terceiro Gráfico (Linhas)")), + dbc.ModalBody([ + + html.P('Selecione o Tipo de Café a ser filtrado:'), + + dcc.Dropdown(opcoes3, value='Todos os Tipos de Café', id='filtro3', className='Dropdown3', style={ + 'background-color': 'chocolate', + 'border-radius': '14px', + 'border-color': 'transparent', + 'margin-bottom': '1vh'}), + + ]), + dbc.ModalFooter( + dbc.Button( + "Fechar", id="closePrim3", className="ms-auto", n_clicks=0, color='dark', outline=True + ) + ), + ], + id="modalPrim3", + is_open=False, + size='lg' + ), + ] +) + +# DECLARAÇÃO DO 1º MODAL: +modal1 = html.Div( + [ + dbc.Modal( + [ + dbc.ModalHeader(dbc.ModalTitle("Compra de Café Brasileiro")), + dbc.ModalBody("Gráfico em barras, representa a quantidade exportada de café brasileiro entre os principais países compradores do produto"), + dbc.ModalFooter( + dbc.Button( + "Fechar", id="close1", className="ms-auto", n_clicks=0, color='dark', outline=True + ) + ), + ], + id="modal1", + is_open=False, + size='lg' + ), + ] +) + +# DECLARAÇÃO DO 2º MODAL: +modal2 = html.Div( + [ + dbc.Modal( + [ # TÍTULO DO MODAL: + dbc.ModalHeader(dbc.ModalTitle("Importação e Exportação por Receita Federal")), + + # CORPO DO MODAL: + dbc.ModalBody("Dividido entre as receitas federais, este gráfico de barras, divididos em grupos, relata a Exportação e Importação de café."), + + # RODAPÉ DO MODAL: + dbc.ModalFooter( + dbc.Button( + "Fechar", id="close2", className="ms-auto", n_clicks=0, color='dark', outline=True + ) + ), + ], + id="modal2", + is_open=False, + size='lg' + ), + ] +) + +# DECLARAÇÃO DO 3º MODAL: +modal3 = html.Div( + [ + dbc.Modal( + [ # TÍTULO DO MODAL: + dbc.ModalHeader(dbc.ModalTitle("Preço Médio do Café Brasileiro")), + + # CORPO DO MODAL: + dbc.ModalBody("Preço médio calculado mensalmente do café brasileiro, estão representadas neste gráfico de Linhas. (Valores em Dólar US$)."), + + # RODAPÉ DO MODAL: + dbc.ModalFooter( + dbc.Button( + "Fechar", id="close3", className="ms-auto", n_clicks=0, color='dark', outline=True + ) + ), + ], + id="modal3", + is_open=False, + size='lg' + ), + ] +) + +# DECLARAÇÃO DO 4º MODAL: +modal4 = html.Div( + [ + dbc.Modal( + [ # TÍTULO DO MODAL: + dbc.ModalHeader(dbc.ModalTitle("Produção de Café entre Principais Países")), + + # CORPO DO MODAL: + dbc.ModalBody("Os dados de produção do mapa esta localizada em cada ponto de seu local, para navegar entre eles, gire o planeta pressionando e arrastando o mouse."), + + # RODAPÉ DO MODAL: + dbc.ModalFooter( + dbc.Button( + "Fechar", id="close4", className="ms-auto", n_clicks=0, color='dark', outline=True + ) + ), + ], + id="modal4", + is_open=False, + size='lg' + ), + ] +) + + +#----------------------------------------------------------------------------------------- +# DECLARAÇÃO EM PARTES DO SITE: + + # C) GRÁFICOS: + + + +# DECLARAÇÃO EM HTML DO 1º GRÁFICO: +grafico1 = [ + + dcc.Graph( + id='Grafico_dados', + figure=fig1 + ) +] + +# DECLARAÇÃO EM HTML DO 2º GRÁFICO: +grafico2 = [ + + dcc.Graph( + id='Grafico_dados2', + figure=fig2 + ) + +] + +# DECLARAÇÃO EM HTML DO 3º GRÁFICO: +grafico3 = [ + + dcc.Graph( + id='Grafico_dados3', + figure=fig3 + ), + +] + +# DECLARAÇÃO EM HTML DO 4º GRÁFICO: +grafico4 = [ + + dcc.Graph( + id='Grafico_dados4', + figure=fig4 + ) + +] +# ----------------------------------------------------------------------------------- +# DECLARAÇÃO EM PARTES DO SITE: + + # D) LINHAS DO SITE: + + +# ORGANIZAÇÃO EM LINHAS DO SITE, NESTE CASO DA LINHA 1: +Conteudo_Linha1 = [ + + # A LINHA 1 SERÁ COMPOSTA PELOS GRÁFICOS "grafico1" E "grafico2", QUE SÃO VARIÁVEIS DECLARADAS LOGO ACIMA: + dbc.Col(html.Div(grafico1), width=5), + + dbc.Col(html.Div(grafico2), width=5), +] + +# ORGANIZAÇÃO EM LINHAS DO SITE, NESTE CASO DA LINHA 2: +Conteudo_Linha2 = [ + + # A LINHA 1 SERÁ COMPOSTA PELOS GRÁFICOS "grafico3" E "grafico4", QUE SÃO VARIÁVEIS DECLARADAS LOGO ACIMA: + dbc.Col(html.Div(grafico3), width=5), + + dbc.Col(html.Div(grafico4), width=5), +] + +# -------------------------------------------------------------------------------------- +# DECLARAÇÃO FINAL DO SITE: + + # E) LAYOUT: + + +# DECLARAÇÃO DE COMO FICARÁ O LAYOUT: +app.layout = html.Div(className='Tudo', id='Tudo', children=[ + + + html.Div(className='Base', children= [ + + # DIV PARA A PRIMEIRA LINHA: + html.Div(className='PrimeiraColuna' , children=[ + + # A PRIMEIRA LINHA TERÁ O CONTEÚDO DA VARIÁVEL 'Conteudo_Linha1': + dbc.Row( + Conteudo_Linha1, + justify="end", + style={'margin-right': '2vw'} + ) + + ]), + + # DIV PARA A SEGUNDA LINHA: + html.Div(className='SegundaColuna', children=[ + + # A SEGUNDA LINHA TERÁ O CONTEÚDO DA VARIÁVEL 'Conteudo_Linha2': + dbc.Row( + Conteudo_Linha2, + justify="end", + style={'margin-right': '2vw'} + ) + + ]) + ]), barralateral, modal1, modal2, modal3, modal4, modalPrim1, modalPrim2, modalPrim3]) + + +# ===================================================================================================================== +# INICIAÇÃO AOS CALLBACKS: + + # CALLBACK PARA O GRÁFICO 1 (EM BARRAS): + +# DEFINIÇÃO DE FUNÇÃO PARA FILTRAGEM QUE IRÁ SUBSTITUIR A FUNÇÃO 'LOC' DO PANDAS: +def filtragem(dataframe, pesquisa, coluna): + Filtro = [] + + if coluna == None: + + for linha in dataframe: + if linha[0] == pesquisa: + Filtro += [[linha[0], linha[1], linha[2], linha[3], linha[4], linha[5], linha[6]]] + + elif coluna == 3: + + for linha in dataframe: + if linha[0] == pesquisa: + Filtro += [[linha[0], linha[1], linha[2]]] + + + else: + referencia = 2 + for alternativa in opcoes2: + if str(coluna) == str(alternativa): + for linha in dataframe: + if linha[0] == pesquisa: + Filtro += [[linha[0], linha[1], linha[referencia]]] + referencia += 1 + + + return Filtro + + +@app.callback( + Output('Grafico_dados', 'figure'), + Input('Filtro_Tipo', 'value'), + Input('Filtro_Continentes', 'value') +) +def update_de_dash(tipo, continente): + dfFl1 = df1.values + + if tipo == 'TOTAL': + if continente == 'Todos os Continentes': + + fig1 = px.bar(df1, x="CONTINENTE", y="TOTAL", color="PAÍS DESTINO", title='Compra de Café Brasileiro por País por Continente') + + else: + + filtro = filtragem(dfFl1, str(continente), None) + fig1 = px.bar(filtro, x=0, y=6, color=1, title=f'Compra de Café Brasileiro ({continente})', labels={'0': 'CONTINENTE', '6': 'TOTAL', '1': 'PAÍS DESTINO'}) + + else: + if continente == 'Todos os Continentes': + + fig1 = px.bar(df1, x="CONTINENTE", y=str(tipo), color="PAÍS DESTINO", title=f'Compra de Café {tipo} Brasileiro por Continente') + + else: + + filtro = filtragem(dfFl1, str(continente), str(tipo)) + fig1 = px.bar(filtro, x=0, y=2, color=1, title=f'Compra de Café {tipo} Brasileiro ({continente})', labels={'0': 'CONTINENTE', '1': 'PAÍS DESTINO', '2': tipo}) + + fig1.update_layout( + paper_bgcolor='rgba(0, 0, 0, 0.2)', + font_color='white', + + ) + + return fig1 +# ====================================================================================================================== + # CALLBACL PARA O GRÁFICO 2: + +@app.callback( + Output('Grafico_dados2', 'figure'), + Input('filtro4', 'value') +) +def UpdateDeDash01(value): + if value == 'Todos': + fig2 = px.bar(dfOf1, x=0, y=1, color=2, barmode="group", title='Exportação/Importação por Receita Federal', labels={ + '0': 'Unidade Da Receita Federal', + '1': 'Sacas (60kg)', + '2': 'Tipo' + }) + + else: + + fig2filtrada = filtragem(dfOf1, str(value), 3) + fig2 = px.bar(fig2filtrada, x=0, y=1, color=2, barmode="group", title=f'Exportação/Importação da Receita Federal ({value})', labels={ + '0': value, + '1': 'Sacas (60kg)', + '2': 'Tipo' + }) + + fig2.update_layout( + paper_bgcolor='rgba(0, 0, 0, 0.2)', + font_color='white', + ) + + return fig2 + +# ====================================================================================================================== + # CALLBACK PARA O GRÁFICO 3: + + +@app.callback( + Output('Grafico_dados3', 'figure'), + Input('filtro3', 'value') +) +def UpdateDeDash1(value): + if value == 'Todos os Tipos de Café': + + fig3 = go.Figure() + fig3.add_trace(go.Scatter(x=df3['Mês/Ano'], y=df3['Conillon'], + mode='lines', + name='Conillon')) + fig3.add_trace(go.Scatter(x=df3['Mês/Ano'], y=df3['Arábica'], + mode='lines', + name='Arábica')) + fig3.add_trace(go.Scatter(x=df3['Mês/Ano'], y=df3['Total Café Verde'], + mode='lines', name='Total (Café Verde)')) + + fig3.add_trace(go.Scatter(x=df3['Mês/Ano'], y=df3['Torrado'], + mode='lines', name='Torrado')) + fig3.add_trace(go.Scatter(x=df3['Mês/Ano'], y=df3['Solúvel'], + mode='lines', name='Solúvel')) + fig3.add_trace(go.Scatter(x=df3['Mês/Ano'], y=df3['Total Industrializado'], + mode='lines', name='Total (Industrializado)')) + + fig3.update_layout(title='Preço Médio do Café Brasileiro', + xaxis_title='Ano', + yaxis_title='Preço Médio (US$)') + + else: + + fig3 = px.line(df3, x='Mês/Ano', y=str(value), title=f'Preço Médio ({value}) Brasileiro', labels={ str(value) : f'Preço Médio (US$) - {value}'}) + + + fig3.update_layout( + paper_bgcolor='rgba(0, 0, 0, 0.2)', + font_color='white', + ) + + return fig3 + +# ====================================================================================================================== +# CALLBACK PARA OS MODAIS: + + +# PARA O MODAL 1: +@app.callback( + Output("modal1", "is_open"), + [Input("menu1", "n_clicks"), Input("close1", "n_clicks")], + [State("modal1", "is_open")], +) +def toggle_modal(n1, n2, is_open): + if n1 or n2: + return not is_open + return is_open + + +# PARA O MODAL 2: +@app.callback( + Output("modal2", "is_open"), + [Input("menu2", "n_clicks"), Input("close2", "n_clicks")], + [State("modal2", "is_open")], +) +def toggle_modal1(n1, n2, is_open): + if n1 or n2: + return not is_open + return is_open + + +# PARA O MODAL 3: +@app.callback( + Output("modal3", "is_open"), + [Input("menu3", "n_clicks"), Input("close3", "n_clicks")], + [State("modal3", "is_open")], +) +def toggle_modal2(n1, n2, is_open): + if n1 or n2: + return not is_open + return is_open + + +# PARA O MODAL 4: +@app.callback( + Output("modal4", "is_open"), + [Input("menu4", "n_clicks"), Input("close4", "n_clicks")], + [State("modal4", "is_open")], +) +def toggle_modal3(n1, n2, is_open): + if n1 or n2: + return not is_open + return is_open + +@app.callback( + Output("modalPrim1", "is_open"), + [Input("Drop1", "n_clicks"), Input("closePrim1", "n_clicks")], + [State("modalPrim1", "is_open")], +) +def toggle_modal3(n1, n2, is_open): + if n1 or n2: + return not is_open + return is_open + +@app.callback( + Output("modalPrim2", "is_open"), + [Input("Drop2", "n_clicks"), Input("closePrim2", "n_clicks")], + [State("modalPrim2", "is_open")], +) +def toggle_modal3(n1, n2, is_open): + if n1 or n2: + return not is_open + return is_open + +@app.callback( + Output("modalPrim3", "is_open"), + [Input("Drop3", "n_clicks"), Input("closePrim3", "n_clicks")], + [State("modalPrim3", "is_open")], +) +def toggle_modal3(n1, n2, is_open): + if n1 or n2: + return not is_open + return is_open + + +if __name__ == '__main__': + app.run_server(debug=True) \ No newline at end of file diff --git a/assets/css.css b/assets/css.css new file mode 100644 index 0000000..698c773 --- /dev/null +++ b/assets/css.css @@ -0,0 +1,50 @@ +body{ + background: url(CafeGif.gif) no-repeat; + background-size: cover; +} + +.PrimeiraColuna{ + margin-top: 4vh; +} + +.SegundaColuna{ + margin-top: 5vh; +} + +.LogoId{ + margin-top: 17vh; + margin-bottom: 1vh; +} + +.Alinhamento{ + text-align: center; +} + +.Dropdown1{ + text-align: center; + font-family: Century Gothic; + text-transform: uppercase; +} + +.Dropdown2{ + text-align: center; + font-family: Century Gothic; + text-transform: uppercase; +} + +.Dropdown3{ + text-align: center; + font-family: Century Gothic; + text-transform: uppercase; +} + +.Dropdown4{ + text-align: center; + font-family: Century Gothic; + text-transform: uppercase; +} + +.link{ + text-decoration: none; + margin-left: 1vw; +} diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fbac809d8111fcd4472bcb949e1e183dc67b0ca4 GIT binary patch literal 16669 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 Pg9UA9VNjumx%&SAopF