1
resposta

Erro na execução da atividade

Boa tarde! Tive um erro inesperado na execução da atividade, e não estou conseguindo resolver:

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

dados = pd.read_csv('aluguel_residencial.csv', sep = ';')
dados.head(10)

dados.boxplot(['Valor'])

dados[dados['Valor']>=500000]

valor = dados['Valor']

selecao = (valor >= limite_inferior) & (valor <= limite_superior)
dados_new = dados[selecao]

dados_new.boxplot(['Valor'])

dados.hist(['Valor'])
dados_new.hist(['Valor'])

dados.boxplot(['Valor'], by = ['Tipo'])

grupo_tipo = dados.groupby('Tipo')['Valor']

type(grupo_tipo)

grupo_tipo.groups

Q1 = grupo_tipo.quantile(.25)
Q3 = grupo_tipo.quantile(.75)
IIQ = Q3 - Q1
limite_inf = Q1 -1.5*IIQ
limite_sup = Q3 + 1.5*IIQ

dados_new = pd.DataFrame()
for tipo in grupo_tipo.groups.keys():
    eh_tipo = dados['Tipo'] == tipo
    eh_dentro_limite = (dados['Valor'] >= limite_inf) & (dados['Valor']<=limite_sup[tipo])
    selecao = eh_tipo & eh_dentro_limite
    dados_selecao =dados[selecao]
    dados_new = pd.concat([dados_new, dados_selecao])

ValueError                                Traceback (most recent call last)
Input In [107], in <cell line: 2>()
      2 for tipo in grupo_tipo.groups.keys():
      3     eh_tipo = dados['Tipo'] == tipo
----> 4     eh_dentro_limite = (dados['Valor'] >= limite_inf) & (dados['Valor']<=limite_sup[tipo])
      5     selecao = eh_tipo & eh_dentro_limite
      6     dados_selecao =dados[selecao]

File ~\anaconda3\lib\site-packages\pandas\core\ops\common.py:70, in _unpack_zerodim_and_defer.<locals>.new_method(self, other)
     66             return NotImplemented
     68 other = item_from_zerodim(other)
---> 70 return method(self, other)

File ~\anaconda3\lib\site-packages\pandas\core\arraylike.py:60, in OpsMixin.__ge__(self, other)
     58 @unpack_zerodim_and_defer("__ge__")
     59 def __ge__(self, other):
---> 60     return self._cmp_method(other, operator.ge)

File ~\anaconda3\lib\site-packages\pandas\core\series.py:5617, in Series._cmp_method(self, other, op)
   5614 res_name = ops.get_op_result_name(self, other)
   5616 if isinstance(other, Series) and not self._indexed_same(other):
-> 5617     raise ValueError("Can only compare identically-labeled Series objects")
   5619 lvalues = self._values
   5620 rvalues = extract_array(other, extract_numpy=True, extract_range=True)

ValueError: Can only compare identically-labeled Series object
1 resposta

Olá, Leonardo! Tudo bom?

O log do erro está aponta para um problema no bloco de código, na linha onde é definida a variável eh_dentro_limite. O erro apresentado (Can only compare identically-labeled Series object) fala que existe um problema na comparação de uma pd.Series, isso pode ocorrer em algumas ocasiões: 1) Nós queremos comparar duas colunas, e para isso precisamos de colunas com mesmo índice, 2) Nós queremos comparar cada elemento com um valor real.

Na atividade, buscamos pela segunda opção 2), comparar cada elemento de uma lista dados['Valor'], e no bloco de código há a variável limite_inf e limite_sup que são pd.Series, mas estamos interando sobre um laço de repetição que avalia a cada elemento dessas duas Series (na variável tipo) e compara com todos os elementos de dados['Valor'] para cada interação.

No bloco de código,

dados_new = pd.DataFrame()
for tipo in grupo_tipo.groups.keys():
    eh_tipo = dados['Tipo'] == tipo
    eh_dentro_limite = (dados['Valor'] >= limite_inf) & (dados['Valor']<=limite_sup[tipo])
    selecao = eh_tipo & eh_dentro_limite
    dados_selecao =dados[selecao]
    dados_new = pd.concat([dados_new, dados_selecao])

Na linha

    eh_dentro_limite = (dados['Valor'] >= limite_inf) & (dados['Valor']<=limite_sup[tipo])

Estamos tentando comparar a Series limite_inf ao invés do valor limite_inf[tipo] buscado no laço de interação. E isso nos retorna o erro do caso 1) porque os índices são diferentes.

A solução é acessar o valor da Series limite_inf passando o parâmetro tipo.

    eh_dentro_limite = (dados['Valor'] >= limite_inf[tipo]) & (dados['Valor']<=limite_sup[tipo])

Portanto, o código fica:

dados_new = pd.DataFrame()
for tipo in grupo_tipo.groups.keys():
    eh_tipo = dados['Tipo'] == tipo
    eh_dentro_limite = (dados['Valor'] >= limite_inf[tipo]) & (dados['Valor']<=limite_sup[tipo])
    selecao = eh_tipo & eh_dentro_limite
    dados_selecao =dados[selecao]
    dados_new = pd.concat([dados_new, dados_selecao])

Se ainda tiver alguma dúvida, estou por aqui. Ótimos estudos e grande abraço!

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