Você está na página 1de 12

CURSO DE DISCURSIVA

Padrão de Resposta
Professores Bruno Marques e Marcelo Eustáquio
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

ENUNCIADO

Cebraspe – Inédita/2024
Plano de Dados Abertos do Banco Central do Brasil
Maio/2023 – Abril/2025
A Política de Dados Abertos do Poder Executivo Federal foi instituída pelo Decreto
nº 8.777, de 11 de maio de 2016, e tem por objetivo a disponibilização na
internet – por parte de órgãos e entidades da administração pública federal
direta, autárquica e fundacional – de dados e informações acessíveis ao público
que possam ser livremente lidos por máquina, usados, cruzados e reutilizados,
fomentando-se o controle social, o desenvolvimento tecnológico, o
aprimoramento da cultura de transparência pública e a inovação nos diversos
setores da sociedade. Atendendo ao disposto no referido Decreto, o Ouvidor, na
qualidade de autoridade de monitoramento da LAI, foi designado para atuar no
monitoramento da implementação do Plano de Dados Abertos do Banco Central
do Brasil (PDA/BC).
O Plano de Dados Abertos do Banco Central do Brasil (PDA/BC) estabelece o
modelo de governança, diretrizes e orientações estratégicas e operacionais para
ações de contínua ampliação e aprimoramento da transparência das informações
produzidas pela Autarquia, particularmente pela publicação de bases de dados
em formatos abertos, nos casos em que não haja vedação expressa de acesso,
cobrindo sua expansão, aprofundamento, aperfeiçoamentos e divulgação, de
modo a inclusive permitir a reutilização dos dados públicos pela sociedade.
Desde a edição do primeiro PDA/BC, em 2016, cabe ressaltar a criação do Portal
de Dados Abertos, a realização de concurso de aplicativos, a participação em
eventos de divulgação, a exemplo da Campus Party, além da própria vanguarda
na disponibilização de dados em formato aberto entre os órgãos no governo
federal. Em 11 de abril de 2023 o BC disponibilizava 3.706 bases de dados no
Portal Brasileiro de Dados Abertos, o que representava 30,2% do total de bases
disponibilizados por todos os órgãos do poder público (12.275).
A priorização da disponibilização dos conjuntos de dados pelo BC busca
considerar o grau de demanda potencial das informações como um critério
fundamental, respeitando-se evidentemente os dispositivos legais e
regulamentares e o alinhamento estratégico da Instituição. O BC identifica o
potencial das informações a serem disponibilizadas no Portal por meio, em
especial, de: (1) consultas públicas1 efetuada via pesquisas junto à sociedade
em geral e também junto ao Conselho de Usuários, (2) mapeamento das

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

demandas recepcionadas ao amparo da LAI e via “Fala BR3 ”, (3) identificação


de bases mais acessadas no site, e (4) levantamento realizado junto aos
curadores das bases de dados.
Texto extraído do Plano de Dados Abertos do Banco Central do Brasil – Maio/2023 –
Abril/2025, acessado de
https://www.bcb.gov.br/content/acessoinformacao/acesso_informacao_docs/Plano_Dados_Abe
rtos_BC_mai2023-abr2025.pdf

A biblioteca python-bcb
O python-bcb é uma interface em Pynthon é uma iniciativa derivada do projeto
de Dados Abertos do Banco Central do Brasil estruturada para obter informações
da API de dados abertos da própria instituição. Por meio do python-bcb, pode o
programador acessar dados de moedas, taxas de juros, índices de preços e
informações de instituições financeiras, entre outros dados disponíveis.
A seguir, vê-se como usar a API do Banco Central para recuperar dados da SELIC
entre 01/01/2021 e 31/12/2023 para plotar um gráfico de linhas.

Os dados de serie podem ser usados como parâmetros de funções, como pode
ser observado no fragmento (incompleto) de código a seguir:

Considerando o caráter motivador do texto apresentado e utilizando as


informações presentes nos códigos-fonte Python apresentados e sem utilizar
bibliotecas e funções adicionais da linguagem, discorra sobre:
3

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

1. O conceito de biblioteca e o procedimento a ser seguido para utilizar a


biblioteca utilizar funções da biblioteca python-bcb no código-fonte. [valor:
8,00 pontos]
2. O tipo da variável url_BACEN, utilizada entre as linhas 02 e 05, e a
finalidade do caractere f imediatamente após o operador de atribuição. [valor:
8,00 pontos]
3. O tipo de dados serie_SELIC, inicializada na linha 05 e utilizada como
retorno da função CarregaSELIC, na linha 06. [valor: 8,00 pontos]
4. O conceito de média aritmética e implemente uma função para determinar
a média aritmética das taxas SELIC recuperadas por CarregaSELIC. (7,50
pontos)
5. O conceito de variância e implemente uma função para determinar a
variância das taxas SELIC recuperadas por CarregaSELIC. [valor: 8,00 pontos]
6. Como deve ser completada a implementada a função
inserir_registros_mtsql (X, nome_tabela, conexão) para inserir os dados de do
DataFrame X na tabela nome_tabela do banco de dados acessado por conexão.
[valor: 8,00 pontos]
Obs.: máximo de 80 linhas

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

PADRÃO DE RESPOSTA

Tópico 1: O conceito de biblioteca e o procedimento a ser seguido para


utilizar a biblioteca utilizar funções da biblioteca python-bcb no código-
fonte.
Em Python (e em várias outras linguagens de programação), uma
biblioteca é um conjunto de módulos ou pacotes que oferecem funcionalidades
específicas para facilitar o desenvolvimento de software. Esses módulos podem
incluir classes, funções e constantes que podem ser reutilizados em diferentes
projetos, economizando tempo e esforço ao fornecer implementações prontas
para diversas tarefas, além de serem essenciais para a eficiência no
desenvolvimento, pois permitem que os programadores utilizem soluções
existentes em vez de criar tudo do zero. Para incorporar uma biblioteca no
código fonte, deve-se usar a palavra reservada import.

# Importando a biblioteca math


import math
# Calculando a raiz quadrada de 25
raiz_quadrada = math.sqrt(25)
print(f"A raiz quadrada de {numero} é: {raiz_quadrada}")
# Função para calcular o seno de um ângulo em radianos
angulo_radianos = math.radians(30)
seno_angulo = math.sin(angulo_radianos)
print(f"O seno de {angulo_radianos} radianos é: {seno_angulo}")

No caso da biblioteca python-bcb, deve o programador importa-la


escrevendo import python-bcb caso a mesma esteja instalada no equipamento
onde o código fonte está sendo desenvolvida, que pode ser operacionalizada por
meio do comando pip install python-bcb.
Espera-se que o candidato defina o que é biblioteca (1), indique como utilizá-la
no código-fonte caso esteja instalada no ambiente de desenvolvimento (2) e
mostre como realizar sua instalação (3).
Quesito 2.1
0 – Não abordou o quesito.
1 – Abordou 1 (um) dos itens indicados.
2 – Abordou 2 (dois) dos itens indicados.
3 – Abordou 3 (três) dos itens indicados.

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

Tópico 2: O tipo da variável url_BACEN, utilizada entre as linhas 02 e 05,


e a finalidade do caractere f imediatamente após o operador de
atribuição.
A linguagem Python provê 5 tipos de dados simples ou primitivos, que
armazenam valores individuais e não são compostos por outros valores:
1. Inteiro (int): Representa números inteiros, positivos ou negativos,
sem parte fracionária.
numero_inteiro = 10
2. Ponto Flutuante (float): Representa números decimais, incluindo
parte fracionária, que são separadas por ponto.
numero_decimal = 3.14
3. Booleano (bool): Representa valores lógicos verdadeiro (True) ou
falso (False).
condicao = True
4. Cadeia de Caracteres (str): Representa sequências de caracteres.
texto = "Olá, Python!"
5. Nulo (NoneType): Representa a ausência de valor. É frequentemente
usado para indicar que uma variável não tem um valor atribuído.
valor_nulo = None
Espera-se que o candidato indique que a variável url_BACEN é do tipo string (1),
que é utilizada para representar cadeias finitas de caracteres (2) e que a
finalidade do f logo após o operador de atribuição é permitir a inserção direta
das variáveis data_inicial e data_final na string, utilizando a sintaxe {} para
incorporar o valor dessas variáveis na string formatada, simplificando assim o
processo de concatenação (3).
Quesito 2.2
0 – Não abordou o quesito.
1 – Abordou 1 (um) dos itens indicados.
2 – Abordou 2 (dois) dos itens indicados.
3 – Abordou 3 (três) dos itens indicados.
Tópico 3: O tipo de dados serie_SELIC, inicializada na linha 05 e utilizada
como retorno da função CarregaSELIC, na linha 06.

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

O DataFrame é uma estrutura de dados bidimensional da biblioteca pandas,


que provê maneira flexível e eficiente de armazenar, organizar e manipular
dados tabulares, semelhante a uma planilha ou tabela de banco de dados. São
características do DataFrames no pandas:
1. O DataFrame é bidimensional, ou seja, é organizado em linhas e
colunas. Cada coluna em um DataFrame é uma série pandas, que podem
acessadas individualmente.
2. Os DataFrames têm rótulos de linhas e colunas, em que os rótulos
de colunas representam nomes das variáveis, e os rótulos de linhas são
geralmente os índices numéricos padrão, mas podem ser personalizados.
3. A biblioteca pandas oferece funções para manipulação de
DataFrames, incluindo seleção de colunas, filtragem de dados, adição ou
remoção de colunas, aplicação de funções a dados, etc.
4. Cada coluna em um DataFrame pode conter dados de diferentes
tipos (inteiros, ponto flutuante, strings, etc.). Nesse caso, o pandas é
capaz de lidar automaticamente com a heterogeneidade dos tipos de
dados.
5. Os DataFrames podem ser criados a partir de várias fontes, como
arquivos CSV, Excel, bancos de dados SQL, entre outros. Ademais, os
DataFrames podem ser salvos em diferentes formatos.
6. Os DataFrames facilitam a execução de operações estatísticas e de
agregação como mean() para calcular a média, sum() para determinar a
soma e groupby() para realizar agrupamento, entre outras.
7. Os DataFrames suportam operações elementares entre conjuntos,
como união, interseção e diferença, facilitando a combinação de dados de
diferentes fontes.
Espera-se que o candidato indique que serie_SELIC é uma variável do tipo
DataFrame (1), explique que é caracterizada por ser um arranjo tabular de
dados (2) e apresente uma das características propostas neste padrão de
respostas (3).
Quesito 2.3
0 – Não abordou o quesito.
1 – Abordou 1 (um) dos itens indicados.
2 – Abordou 2 (dois) dos itens indicados.
3 – Abordou 3 (três) dos itens indicados.

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

Tópico 4: O conceito de média aritmética e implemente uma função para


determinar a média aritmética das taxas SELIC recuperadas por
CarregaSELIC.
A média aritmética é uma importante medida de tendência central
determinada pelo resultado da divisão por n da soma de n números dados. Uma
possível implementação em Python é mostrada a seguir:

def media_SELIC(serie):
serie = serie.replace({',':'.'}, regex=True)
serie['valor'] = serie['valor'].astype(float)
soma_valores = 0.0
contador = 0
for valor in serie['valor']:
soma_valores += valor
contador += 1
if contador == 0:
return None
media = soma_valores / contador
return media

Espera-se que o candidato defina média aritmética (1) e apresente


implementação em Python que utiliza do conceito de média (2), com a sintaxe
correta da linguagem (3) e com eventuais tratamentos de inconsistências (4).
Quesito 2.4
0 – Não abordou o quesito.
1 – Abordou 1 (um) dos itens indicados.
2 – Abordou 2 (dois) dos itens indicados.
3 – Abordou 3 (três) dos itens indicados.
4 – Abordou 4 (quatro) dos itens indicados.
Tópico 5: O conceito de variância e implemente uma função para
determinar a variância das taxas SELIC recuperadas por CarregaSELIC.
A variância é uma medida de dispersão determinada pelo resultado da
divisão por n da soma dos quadrados dos desvios de n números dados em
relação a uma medida de tendência central, normalmente considerada a média
aritmética. Uma possível implementação em Python é mostrada a seguir:
def variancia_SELIC(serie):
serie = serie.replace({',':'.'}, regex=True)
serie['valor'] = serie['valor'].astype(float)
8

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

media = media_SELIC()
soma_valores = 0.0
contador = 0
for valor in serie['valor']:
soma_valores += (media - valor) ** 2
contador += 1
if contador == 0:
return None
variancia = soma_valores / contador
return variância

Espera-se que o candidato defina variância (1) e apresente implementação em


Python que utiliza do conceito de média (2), com a sintaxe correta da linguagem
(3) e com eventuais tratamentos de inconsistências (4).
Quesito 2.5
0 – Não abordou o quesito.
1 – Abordou 1 (um) dos itens indicados.
2 – Abordou 2 (dois) dos itens indicados.
3 – Abordou 3 (três) dos itens indicados.
4 – Abordou 4 (quatro) dos itens indicados.
Tópico 06: Como deve ser completada a implementada a função
inserir_registros_mtsql (serie, nome_tabela, conexão) para inserir os
dados do DataFrame X na tabela nome_tabela do banco de dados
acessado por conexão.
def inserir_registros_mysql(X, nome_tabela, conexao):
X = X.replace({',':'.'}, regex=True)
X['valor'] = X['valor'].astype(float)

# Criar a tabela se ela não existir


criar_tabela_sql = f"""
CREATE TABLE IF NOT EXISTS {nome_tabela} (
data DATE,
valor FLOAT
)
"""
conexao.execute(criar_tabela_sql)

# Inserir os registros na tabela


s_sql = f"INSERT INTO {nome_tabela} (data, valor) VALUES (%s, %s)"
for index, row in X.iterrows():
valores = (row['data'], row['valor'])
conexao.execute(s_sql, valores)
9

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

Espera-se que o candidato estabeleça as strings criar_tabela_sql (1) e inserir_sql


(2) de forma correta, estruture estrutura de repetição para percorrer todos os
elementos do DataFrame (3), com a sintaxe correta da linguagem Python (4) e
com eventuais tratamentos de inconsistências (5).
Quesito 2.5
0 – Não abordou o quesito.
1 – Abordou 1 (um) dos itens indicados.
2 – Abordou 2 (dois) dos itens indicados.
3 – Abordou 3 (três) dos itens indicados.
4 – Abordou 4 (quatro) dos itens indicados.
5 – Abordou 5 (quatro) dos itens indicados.

PROPOSTA DE RESOLUÇÃO

Preliminarmente, destaca-se que uma biblioteca um conjunto de módulos ou


pacotes que oferecem funcionalidades específicas para facilitar o desenvolvimento de
“software”. De acordo com a doutrina, esses módulos podem incluir classes,
funções e constantes que podem ser reutilizados em diferentes projetos,
economizando tempo e esforço ao fornecer implementações prontas para
diversas tarefas, além de serem essenciais para a eficiência no desenvolvimento,
pois permitem que os programadores utilizem soluções existentes em vez de
criar tudo do zero. No contexto de Python, a incorporação da biblioteca python-
bcb se dá por meio da instrução import python-bcb, após instalação no ambiente
de desenvolvimento por meio do comando pip install python-bcb.
Em relação ao tipo de variável usada na função CarregaSELIC, ressalta-se
que url_BACEN é do tipo string. De acordo com os fundamentos da linguagem
Python, uma string é utilizada para armazenar uma cadeia finita de caracteres
limitado por aspas duplas e, entre as linhas 02 e 05 do código apresentado, foi
utilizada para armazenar o endereço de uma API disponibilizada pelo Banco
Central. Ademais, a finalidade do f logo após o operador de atribuição é permitir
a inserção direta das variáveis data_inicial e data_final na string, utilizando a
sintaxe {} para incorporar o valor dessas variáveis na string formatada,
simplificando assim o processo de concatenação.
Ainda analisando tipos de dados de variáveis presentes no código fonte
apresentado, observa-se que serie_SELIC é do tipo DataFrame, ou seja, uma
estrutura de dados bidimensional da biblioteca pandas. De acordo com a doutrina,
os DataFrames possuem funcionalidades para armazenar, organizar e manipular
dados tabulares, semelhante a uma planilha ou tabela de banco de dados, além
10

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

de possuírem rótulos de linhas e colunas que desempenham, respectivamente


nomes das variáveis e índices numéricos. Ademais, cada coluna em um
DataFrame pode conter dados de diferentes tipos, que são tratados
automaticamente pelo Pandas.
No contexto da estatística e da análise de dados, média aritmética é uma
medida de tendência central calculada a partir da divisão por “n” da soma de “n”
números dados. Com base na sintaxe da linguagem Python, uma possível
implementação da função para calcular a média aritmética dos elementos de
uma coluna de um DataFrame é apresentada a seguir:
def media_SELIC(serie):
serie = serie.replace({',':'.'}, regex=True)
serie['valor'] = serie['valor'].astype(float)
soma_valores = 0.0
contador = 0
for valor in serie['valor']:
soma_valores += valor
contador += 1
if contador == 0:
return None
media = soma_valores / contador
return media
Ainda no âmbito das medidas estatísticas, variância é uma medida de
dispersão determinada a partir do resultado da divisão por n da soma dos quadrados
dos desvios de n números dados em relação a uma medida de tendência central,
normalmente considerada a média aritmética. Considerando a sintaxe da linguagem
Python, uma possível implementação da função para calcular a variância dos
elementos de uma coluna de um DataFrame é apresentada a seguir:
def variancia_SELIC(serie):
serie = serie.replace({',':'.'}, regex=True)
serie['valor'] = serie['valor'].astype(float)
media = media_SELIC()
soma_valores = 0.0
contador = 0
for valor in serie['valor']:
soma_valores += (media - valor) ** 2
contador += 1
11

www.voceconcursado.com.br
CURSO DE DISCURSIVA
Profs. Bruno Marques e Marcelo Eustáquio

if contador == 0:
return None
variancia = soma_valores / contador
return variância
Por fim, implementação da função inserir_registros_mtsql (serie,
nome_tabela, conexão) deve observar elementos de conexão passados como
parâmetros usando a variável conexão. Nesses termos e usando Python, uma
possível implementação da função proposta é apresentada a seguir:
def inserir_registros_mysql(X, nome_tabela, conexao):
X = X.replace({',':'.'}, regex=True)
X['valor'] = X['valor'].astype(float)
criar_tabela_sql = f"""
CREATE TABLE IF NOT EXISTS {nome_tabela} (
data DATE,
valor FLOAT)"""
conexao.execute(criar_tabela_sql)
str_sql = f"INSERT INTO {nome_tabela} (data, valor) VALUES (%s, %s)"
for index, row in X.iterrows():
valores = (row['data'], row['valor'])
conexao.execute(str_sql, valores)

12

www.voceconcursado.com.br

Você também pode gostar