Para a prova de nível médio do Bacen faltam

quarta-feira, 21 de fevereiro de 2024

Vigésimo sexto tijolo - Preenchendo dados faltantes


Note que o tempo de alguns atletas não foi registrado por algum erro no processo de medição. 

Observando os dados e tendo um conhecimento prévio do desempenho de cada atleta, você, como cientista de dados, resolve que é razoável para este caso específico atribuir o tempo médio de todos os atletas aos dados faltantes.

Primeiramente importamos a biblioteca pandas, a seguir o matplotlib.
Definimos que haverá uma figura e seu tamanho.

import pandas as pd

import matplotlib.pyplot as plt
plt.rc('figure', figsize = (15, 7))

dados = pd.read_csv('amostrado.csv', sep = ';')


Veja que no nosso dataframe columns= Corredor (Nome da pessoa), Melhor tempo (desempenho)



Como é possivel de se notar alguns atletas não possuem dados sobre seus desempenhos. Por isso podemos utilizar uma instrução chamada de fillna. No pandas ela é usada para preencher valores faltantes nas tabelas NaN.


Neste caso ela repitiu o valor do atleta anterior. O atleta Pedro antes sem valor definido recebeu o valor de Marcos. Sandro recebeu o valor de Denis.

Vigésimo quinto tijolo - Mais sobre gráficos

 

Estas linhas representam:

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('figure', figsize = (15, 8))


Inicialmente a primeira é um comando para o jupyter apresentar o gráfico na própria linha, caso use o colab não é necessário pô-lo. As linhas a seguir são importações de bibliotecas. O plt.rc é uma configuração específica do matplotlib para um ajuste do tamanho padrão das figuras criadas/geradas por ele. Como iremos criar 4 gráficos em uma figura é necessário garantir que haja espaço para todas.



Nesta linha abrimos um arquivo que carregado no colab via upload, o uso do sep=';' é para a reconfiguração das informações.

dados = pd.read_csv('/content/sem_outliers.csv', sep=';')
dados

O dataframe gerado é este:



A seguir temos temos outras instruções como definir uma área.

area = plt.figure()

Na área criada iremos criar uma figura com 4 gráficos, por inserimos 4 variáveis são elas:

g1 = area.add_subplot(2, 2, 1)
g2 = area.add_subplot(2, 2, 2)
g3 = area.add_subplot(2, 2, 3)
g4 = area.add_subplot(2, 2, 4)

Cada gráfico terá 2 linhas, 2 colunas, e o último número diz respeito a posição do gráfico dentro da figura. 


Escolhemos criar 4 gráficos distintos, são eles um scatter (um gráfico de dispersão), um histograma, uma amostra que apresentará dados momentâneos, ou seja, a cada atualização o mesmo será apresentará dados diferentes e o quarto gráfico será de barrras.

Em seguida inserimos um título a cada uma. 

g1.scatter(dados.Valor, dados.Area)
g1.set_title('Valor X Area')

g2.hist(dados.Valor)
g2.set_title('Histograma')

dados_g3 = dados.Valor.sample(100)
dados_g3.index = range(dados_g3.shape[0])
g3.plot(dados_g3)
g3.set_title('Amostra (Valor)')

grupo = dados.groupby('Tipo')['Valor']
label = grupo.mean().index
valores = grupo.mean().values
g4.bar(label, valores )
g4.set_title('HistValor Médio por Tipo')

No caso do scatter os dados levados em conta foram Valor x Area



No segundo gráfico o histrograma levou em consideração apenas os dados correspondentes a Valor.


Antes de avançamos, vamos entender melhor um pouco do 3º gráfico. O 3º preciso receber um indice para que as informações contidas não corressem o risco de serem malinterpretadas.

dados_g3 = dados.Valor.sample(100)
dados_g3.index = range(dados_g3.shape[0])
g3.plot(dados_g3)
g3.set_title('Amostra (Valor)')

Como podemos ver, sem o ajuste do indice seria assim a apresentação dos dados.




A variável g4 criou um gráfico cruzando as informações tipo (apartamento, casa, casa de condominio, casa de vila e quitinete) com os valores.

grupo = dados.groupby('Tipo')['Valor']
label = grupo.mean().index
valores = grupo.mean().values
g4.bar(label, valores )
g4.set_title('HistValor Médio por Tipo')


E por fim este o resultado final desta linha de comando esta logo abaixo.

g1.scatter(dados.Valor, dados.Area)
g1.set_title('Valor X Area')

g2.hist(dados.Valor)
g2.set_title('Histograma')

dados_g3 = dados.Valor.sample(100)
dados_g3.index = range(dados_g3.shape[0])
g3.plot(dados_g3)
g3.set_title('Amostra (Valor)')

grupo = dados.groupby('Tipo')['Valor']
label = grupo.mean().index
valores = grupo.mean().values
g4.bar(label, valores )
g4.set_title('HistValor Médio por Tipo')



Os arquivos deste post encontram-se neste link https://github.com/faovieira/mais_sobre_gr-ficos.


segunda-feira, 19 de fevereiro de 2024

Vigésimo quarto tijolo - Removendo Outliers

 































 



















Vigésimo terceiro tijolo - Trabalhando com quartis

 

Foi me proposto realizar o seguinte desafio, descobrir quais os valores dos quartis Q1, Q3, IIQ (intervalor inter quartis)

[Q1], [Q3], [IIQ], [Q1 - 1.5 * IIQ], [Q3 + 1.5 * IIQ]




Após conferirmos nossa base de dados, imprimos um boxplot correspondente. Lembrando que o exercício foi fixado em buscar informações a respeito do Valor m2.




No passo a seguir isolamos os dados do valor m2 em uma Series.
Em seguida definimos a formula para achar os valores dos quartis e do interquartil.



A seleção abaixo é para reduzirmos a abrangência dos valores, assim buscamos minimizar as chances de deparar com as discrepâncias. Criamos o dados_new para não alterarmos nossa base original.
A seleção foi criada para descartar os dados discrepantes.


Abaixo para fins de comparação, temos a base de dados orginal (amostra) e a dados new.



Perceba a organização pelo simples fato de termos arruamado a casa.

















domingo, 18 de fevereiro de 2024

Vigésimo segundo tijolo - reduzindo fórmulas de comparação

 

Minha forma de comparar três números:

import pandas as pd numero_01 = float(input('Digite o primeiro valor: ')) numero_02 = float(input('Digite o segundo valor: ')) numero_03 = float(input('Digite o terceiro valor: ')) print(f"Os números digitados foram: {numero_01}, {numero_02}, {numero_03}") if numero_01 > numero_02 and numero_01 > numero_03: print("O primeiro valor é maior que os demais.") elif numero_02 > numero_01 and numero_02 > numero_03: print("O segundo valor é maior que os demais.") elif numero_03 > numero_01 and numero_03 > numero_02: print("O terceiro valor é maior que os demais.") else: print("Os números são iguais ou há pelo menos dois números iguais.") if numero_01 < numero_02 and numero_01 < numero_03: print("O primeiro valor é menor que os demais.") elif numero_02 < numero_01 and numero_02 < numero_03: print("O segundo valor é menor que os demais.") elif numero_03 < numero_01 and numero_03 < numero_02: print("O terceiro valor é menor que os demais.") else: print("Os números são iguais ou há pelo menos dois números iguais.")



Forma do chatgpt reduzir este script:

O script é

def compara_valores(nome, a, b, c):

maior = max(a, b, c) menor = min(a, b, c) print(f"{nome} é maior que os demais." if a == maior else f"{nome} é menor que os demais." if a == menor else "Os números são iguais ou há pelo menos dois números iguais.") numeros = [float(input(f'Digite o {i+1}º valor: ')) for i in range(3)] print(f"Os números digitados foram: {', '.join(map(str, numeros))}") compara_valores("O primeiro valor", *numeros) compara_valores("O segundo valor", numeros[1], numeros[0], numeros[2]) compara_valores("O terceiro valor", *reversed(numeros))

Ao rodarmos o código veja o que aparece.



Veja a explicação do gpt




```python

numeros = [float(input(f'Digite o {i+1}º valor: ')) for i in range(3)]

```

Esta linha de código cria uma lista chamada `numeros` usando uma compreensão de lista. A compreensão de lista é uma construção concisa e poderosa em Python. Neste caso, ela é usada para solicitar ao usuário a entrada de três valores (números) e convertê-los para ponto flutuante (usando `float`). O f-string (`f'Digite o {i+1}º valor: '`) é usado para exibir uma mensagem personalizada solicitando cada valor.

```python

print(f"Os números digitados foram: {', '.join(map(str, numeros))}")

```

Aqui, é usada outra f-string para imprimir os números digitados. A função `join` é usada para concatenar os números da lista em uma string, separando-os por vírgulas.

```python

compara_valores("O primeiro valor", *numeros)

compara_valores("O segundo valor", numeros[1], numeros[0], numeros[2])

compara_valores("O terceiro valor", *reversed(numeros))

```

Essas linhas chamam a função `compara_valores` três vezes, cada vez passando uma mensagem e três valores para serem comparados. O operador `*` é usado para desempacotar a lista de números e passar os valores individualmente como argumentos para a função.

```python

def compara_valores(nome, a, b, c):

    maior = max(a, b, c)

    menor = min(a, b, c)

    resultado = (f"{nome} é maior que os demais." if a == maior else

                 f"{nome} é menor que os demais." if a == menor else

                 "Os números são iguais ou há pelo menos dois números iguais.")

    print(resultado)

```

Aqui está a definição da função `compara_valores`. Recebe um nome e três valores (a, b, c). Usa as funções `max` e `min` para determinar o maior e o menor valor. Em seguida, utiliza uma expressão condicional (ternária) para construir uma mensagem com base na comparação do valor `a` com o maior e o menor valor. A mensagem resultante é armazenada em `resultado` e impressa. A função compara os valores e imprime uma mensagem indicando como o valor `a` se compara aos demais.


Vigésimo primeiro tijolo - Exercicio01

Resolvendo exercícios de operações matemática com variáveis & condicionais 

Como isso vai funcionar? vou colocar as minhas respostas e abaixo a forma do professor, se não divergirem, apenas uma forma será apresentada. Importei o pandas, scypy.stats and numpy


1. Some o valor 10 com 30 e exiba na tela 



O que foi feito aqui? Importamos a biblioteca, atribuimos valores as duas variáveis exigíveis, somamos as duas variáveis digitadas e apresentamos o resultado. Basicamente foi isso. Escolhi me utilizar do float ao inves do int, porque eu não qual o número que o usuário irá escolher ao digitar. Como ainda não detenho as técnicas para limitar o tipo de dado inserido optei por ampliar.
Resposta do professor





2. Some os seguintes números: 10, 300, 0.4, 10 

Antes de resolver esta questão é preciso lembrar que estou usando o Colab e que é preciso alterar as variáveis para que linhas as acrescidas não entrem em conflito com as linhas já escritas no script.




Neste segundo exercicio, a ideia é a mesma, mas a quantidade de elementos são outras, porém a didática é ótima por fornecer um aprendizado graduado.


Resposta do professor

Na resolução do professor ele não facultou a possibilidade de um usuário inserir os números que desejasse. Fazendo uso do método sum da biblioteca numpy ele simplificou o cálculo.




3. Desenvolva comandos em Python capaz de calcular a média harmônica entre 5 números. Por exemplo: 2, 3, 5, 6 e 9

Antes de darmos um passo rumo na resolução, vamos verificar qual a definição de média harmônica também conhecida como média subcontrária: 

A média harmônica é uma medida estatística que expressa a taxa média de um conjunto de valores, levando em consideração a reciprocidade dos valores. Ela é definida como o inverso da média aritmética dos inversos dos valores. A média harmônica é especialmente útil quando se lida com taxas médias, como velocidades ou taxas de retorno, porque ela penaliza valores extremamente baixos. Isso significa que a presença de valores muito pequenos terá um impacto significativo na média harmônica, tornando-a menor do que a média aritmética correspondente.

 




Inicialmente importei hmean da biblioteca scipy.stats. O exercício pede para calcular 5 números, por isso a necessidade dos 5 inputs. Criei uma variável com os 5 números digitados e solicitei que fossem apresentados ao usuário na interface por meio do comando print. Assim podemos conferir se os dados foram devidamente inseridos.

Uma nova variável foi criada. E esta foi nomeada de media_harmonica, nos utilizamos do hmean para realizar o cálculo. Conferimos a fórmula ao usarmos um site de cálculo de médias harmonicas. Segue o link do site para possíveis conferências dos resultados (https://miniwebtool.com/br/harmonic-mean-calculator/)



Resposta do professor


4. Um Cientista de Dados Jr precisa criar sequência de comandos que seja capaz de calcular a média ponderada dos valores digitados pelo usuário. O usuário é capaz de digitar 8 valores. O primeiro número tem peso 0.5 , o segundo 1.0, o terceiro 1.5 até o último valor que tem peso 4, ou seja, os pesos são acrescidos de 0.5 para cada valor. Portanto, o algoritmo deve ser capaz de calcular a média ponderada dos oito valores digitados pelo usuário, cada valor com o seu respectivo peso.

Antes de adentrarmos propriamente dito na resolução, vejamos a definição de uma média ponderada é uma medida estatística que leva em consideração diferentes pesos atribuídos a diferentes elementos da coleção de dados. Em outras palavras, ao calcular a média ponderada, cada valor na coleção contribui para a média de acordo com o seu peso relativo. Essencialmente, para calcular a média ponderada, você multiplica cada valor pelo seu peso e, em seguida, soma esses produtos. Esta soma é então dividida pela soma total dos pesos. Isso é particularmente útil quando você deseja dar mais importância a alguns valores em relação a outros na média final.

Nesta primeira fase importamos o numpy, definimos os pesos conforme o enunciado e adicionamos 8 inputs, neste caso o modo float foi apropriado devido o ponto flutuante nos pesos exigidos previamente.




Nesta segunda fase apresentamos o script de conferencia dos dados inseridos e dos dados pre-existentes. Logo em seguida condicionamos uma variável ao np.average e nela atribuimos os valores e os pesos, neste caso com weights. Por fim podemos verificar o resultado.




Resposta do professor


5. Um programador Jr precisa construir uma mini calculadora. Essa calculadora segue os seguintes padrões: a. Se o usuário digital um valor menor ou igual a 5, a calculadora vai multiplicar esse valor por 10 e retornar o valor resultantes para o usuário b. Se o usuário digitar um número entre 6 e 10, a calculadora multiplica por 20 o número digitado pelo usuário c. Se o usuário digitar um valor maior ou igual a 11, a calculadora soma 100 ao número digitado. Ajude o programador Jr a construir essa calculadora, fornecendo os comandos em Python para ele. 

Neste caso inseri o While True (enquanto for verdade, tradução literal), assim como o break para poder conferir um número maior de valores de forma constante. Lembrando que o break para o loop, caso contrário a ação se repete de forma indefinida.

Se o número digitado for menor que 5 multiplique-o por 10, se for maior ou igual a 6 e menor do que 11 multiplique-o por 20, nos demais caso acrescente 100 unidades.

Basicamente foi esse o script digitado em inglês. para testar todas as possibilidades digitei 5, 6, 11 e 0 para encerrar o código. Lembrando que o "0" é menor do que 5, mas neste caso o sistema entende que deverá ser considerado a faixa entre 5 e 1. A variável 1 foi testada.


Resposta do professor



6. Um programador Jr precisa criar um algoritmo que consiga fazer a comparação entre três valores e exibir qual é o maior e qual é o menor valor digitado. Ajude o programador desenvolvendo o código em Python.


Neste exercicio busquei ser preciso ao invés de enxuto, acredito que haja uma forma mais curta de chegar ao mesmo resultado. Logo no próximo quadro veremos o resultado.



Foi levada em consideração a possibilidade de números iguais.


Não poderíamos deixar de apresentar um exemplo com dos valores iguais:



Resposta do professor







sábado, 17 de fevereiro de 2024

Vigésimo tijolo - Python Pandas: tratando e analisando dados

  

A função cut() é uma ferramenta do pandas que auxilia na criação distribuições de frequências e é possível criar labels para as classes criadas pela função cut(). Ela também permite que sejam especificados os limites de cada classe.

No quadro abaixo trouxemos nosso arquivo já conhecido. e logo abaixo criamos uma classe com as quantidades de quartos possíveis.




Lembrando que podemos selecionar uma colunas de várias maneiras, porém vamos relembrar as duas maneiras usadas no nosso estudo.


Os ( parenteses aqui tem um sentido de intervalo aberto e os [ de intervalo fechado.



Para verificarmos a veracidade de um dataset, precisamos pensar a respeito da construção do mesmo.
cada detalhe conta neste caso vamos procurar por imoveis com o valor de 0 quartos. Durante o processo de criação de um dataset pode ter sido cometido este erro.



Como foi possivel verificar os imoveis de 0-2 quartos foram de 11.855 para 21.692 isso poderia representar uma distorção no resultado final.