Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

mediana de beltrano

Estou com algumas dúvidas neste exercício:

notas_beltrano = df.Beltrano.sample(6, random_state = 101)
notas_beltrano
notas_beltrano = notas_beltrano.sort_values()
notas_beltrano
notas_beltrano.reset_index()
n2 = notas_beltrano.shape[0]
n2
elemento_md2 = n2/2
elemento_md2
notas_beltrano.loc[(elemento_md2 + (elemento_md2 +1))/2]

Vi no fórum uma dúvida similar porém não consegui realizar o exercício. Numa das respostas do fórum afirma que não se realizar o reset.index() (tópico: Erro ao calcular a mediana - TypeError: unsupported operand type(s) for /: 'str' and 'int' ) pois isto criará um DataFrame onde havera uma coluna string com as matérias. Porém mesmo retirando o reset_index() não obtive resultado. No próprio fórum há divergência (tópico: Erro ao incluir 'elemento_md em .loc ) e no próprio exemplo da aula há essa transformação em DataFrame. Outra dúvida que tive ao ver o primeiro tópico (rro ao calcular a mediana - TypeError: unsupported operand type(s) for /: 'str' and 'int' ) é que neste tópico foi usado o iloc enquanto nas aulas foi usado o loc[], pelo que aprendi nos cursos anteriores, apenas o iloc deveria funcionar, já que trabalha com índices. Por último essa linha de código está correta notas_beltrano.loc[(elemento_md2 + (elemento_md2 +1))/2]?

4 respostas

Olá, Marcel, tudo bem?

Sobre esse exercício relacionado ao seu código eu trago 2 observações:

  • Sobre a questão do reset_index eu expliquei a um outro aluno nesse tópico, mas caso tenha alguma dúvida acerca dessa questão posso explanar com mais detalhes.
  • E, em relação a essa linha de código notas_beltrano.loc[(elemento_md2 + (elemento_md2 +1))/2], o uso de .loc() é adequado quando queremos realizar um slice ou pegar trechos de nosso dataframe através dos nomes das colunas. Mas, como estamos o utilizando a variável elemento_md2 que justamente pega a posição do elemento 1 da mediana de nossos valores o método correto a ser utilizado seria o .iloc(). Além disso, como estamos pegando posições seria necessário tirar uma unidade na variável elemento_md2, pois o índice inicia em 0 e não em 1. Ou seja, se o shape[0] retorna 10 é porque temos elementos da posição 0 a 9.

Assim, o séu código funcionaria corretamente da seguinte forma:

# Dividindo o código em pequenos blocos, caso queria testar isoladamente cada bloco na sequência
notas_beltrano = df.Beltrano.sample(6, random_state = 101)
notas_beltrano

notas_beltrano = notas_beltrano.sort_values()
notas_beltrano

n = notas_beltrano.shape[0]
n

metade = int (n / 2) - 1
metade

elemento_md1 = notas_beltrano.iloc[metade]
elemento_md2 = notas_beltrano.iloc[metade + 1]

mediana = (elemento_md1 + elemento_md2) / 2
mediana

Espero ter ajudado e qualquer dúvida é só chamar!

Forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Bom dia Afonso, tudo bem? Muito obrigado pela resposta, porém ainda fiquei meio confuso:

Li o tópico do link que você disponibilizou, porém o que me deixa confuso é que o passo do .reset_index() foi utilizado em sala de aula em exemplo semelhante (o que muda era apenas o fato de ser ímpar (aula 05, aos 3min de aula):

notas_fulano = df['Fulano']
notas_fulano = notas_fulano.sort_values()
notas_fulano = notas_fulano.reset_index()
n = notas_fulano.shape[0]
elemento_md = (n + 1)/ 2
notas_fulano.loc[elemento_md - 1]

O loc[] também foi usado em sala de aula (mesma aula, aos 5:13mins)

Ao tentar fazer os mesmos passos da sala de aula o erro que ocorre com o retorno aparentemente é justamente o fato Ao tentar fazer os mesmos passos da sala de aula o erro que ocorre com o retorno aparentemente é justamente o fato do index não ser número inteiro (mesmo usando o reset_index():

mediana_beltrano = notas_beltrano.iloc[elemento_md2 - 1] TypeError: Cannot index by location index with a non-interger key

solução!

Olá, Marcel!

Não se preocupe que pode confundir um pouco mesmo.

Existem formas diferentes de fazer a mesma operação. O uso do reset_index() ajuda a escolher os nossos valores usando o .loc() atrelado ao valor da varíavel elemento_md, pois o index varia de 0 até 5 no nosso exemplo.

Sendo assim, poderíamos utilizar notas_beltrano.loc[elemento_md - 1] quando utilizamos o reset_index(), pois ele pesquisaria no nosso dataframe notas_beltrano a linha cujo index é igual a 2.

No entanto, o que isso retorna?

Isso retorna a linha inteira dos nosso dados, ou seja, se eu quiser apenas pegar o valor das notas para calcular a mediana, eu seria obrigado a especificar que coluna tem essa nota.

Vou deixar a abaixo três formas possíveis e que segue a ideia do que estamos aprendendo nas aulas de como resolver esse problema.

1. Usando o reset_index() sem .loc() e especificando a coluna das notas

# Dividindo o código em pequenos blocos, caso queria testar isoladamente cada bloco na sequência
notas_beltrano = df.Beltrano.sample(6, random_state = 101)
notas_beltrano

notas_beltrano = notas_beltrano.sort_values()
notas_beltrano

# Usando o reset_index
notas_beltrano = notas_beltrano.reset_index()
notas_beltrano

n = notas_beltrano.shape[0]
n

elemento_md = int (n / 2) - 1
elemento_md

# Não precisa usar .loc(), mas é necessário especificar a coluna onde estão as notas para o cálculo da mediana. O "Beltrano" indica a coluna de notas e o elemento_md a posição da nota no DataFrame.
elemento_md1 = notas_beltrano.Beltrano[elemento_md]
elemento_md2 = notas_beltrano.Beltrano[elemento_md + 1]

mediana = (elemento_md1+ elemento_md2) / 2
mediana

2. Usando o reset_index() com .loc() e especificando a coluna das notas

Note que nesse exemplo, ao utilizar o .loc() adquirimos toda a informação da linha desenhada e não apenas a nota e, portanto, precisamos isolá-la através do comando elemento_md1["Beltrano"] e elemento_md2["Beltrano"], ou se quiser compilar o raciocínio notas_beltrano.loc[elemento_md]["Beltrano"] e notas_beltrano.loc[elemento_md + 1]["Beltrano"].

# Dividindo o código em pequenos blocos, caso queria testar isoladamente cada bloco na sequência
notas_beltrano = df.Beltrano.sample(6, random_state = 101)
notas_beltrano

notas_beltrano = notas_beltrano.sort_values()
notas_beltrano

# Usando o reset_index
notas_beltrano = notas_beltrano.reset_index()
notas_beltrano

n = notas_beltrano.shape[0]
n

elemento_md = int (n / 2) - 1
elemento_md

# Usando o .loc(), isolamos em elemento_md1 e elemento_md2 os dados que nos importam para o cálculo da mediana. Mas para conseguir calculá-la, precisamos extrair apenas os valores das notas.
elemento_md1 = notas_beltrano.loc[elemento_md]
elemento_md2 = notas_beltrano.loc[elemento_md + 1]

# Print exibindo o comportamento supracitado (no tópico tem o print do código)
print(f"Elemento 1:\n{elemento_md1}\n\nElemento 2:\n{elemento_md2}")

# Extraindo apenas os valores das notas
mediana = (elemento_md1["Beltrano"] + elemento_md2["Beltrano"]) / 2
mediana

Trecho do código gerado no print:

Imagem que corresponde ao print do código acima, onde temos a leitura de toda a linha com os elementos para o cálculo da mediana. Nesse exemplo, temos o nome das matérias na coluna index e os valores das notas na coluna Beltrano

 

3. Usando apenas o .iloc()

Esse exemplo é ideêntido ao do tópico anterior do fórum, mas com o ajuste do nome de uma das variáveis para facilitar a interpretação e notar as diferenças entre os códigos.

# Dividindo o código em pequenos blocos, caso queria testar isoladamente cada bloco na sequência
notas_beltrano = df.Beltrano.sample(6, random_state = 101)
notas_beltrano

notas_beltrano = notas_beltrano.sort_values()
notas_beltrano

n = notas_beltrano.shape[0]
n

elemento_md = int (n / 2) - 1
elemento_md

elemento_md1 = notas_beltrano.iloc[elemento_md]
elemento_md2 = notas_beltrano.iloc[elemento_md + 1]

mediana = (elemento_md1 + elemento_md2) / 2
mediana

Qual método é o melhor a se utilizar?

Depende do gosto do freguês (hehehehe). Entretanto, como vimos na aula, existe apenas uma linha de código que ajudaria a fazer o cálculo sem dores de cabeça que seria notas_beltrano.median().

Espero ter ajudado e qualquer dúvida é só chamar!

Bons estudos!

Ahhhh agora entendi tudo!! Nossa demorei, reassisti a aula, tentei refazer por conta própria, vi as 03 opções que vc me passou, fiz e refiz até entender cada linha. Valeu Afonso!! Forte abraço!!