6
respostas

Outra solução sem usar a coluna ['Valor']

A coluna 'Valor' é utilizada na contagem das quantidades de 'Casa' e 'Apartamento' somente para facilitar o cálculo da porcentagem, pois queremos apenas a contagem da quantidade 'Casa' e 'Apartamento'. Então escolhemos uma coluna qualquer (nesse caso, 'Valor') e fazemos a contagem dos seus elementos:

grupo1 = dados.groupby('Tipo Agregado')['Valor'] # ['Valor'] é só pra ser uma série e facilitar a contagem. Poderia ser qualquer outra coluna do dataframe
label = grupo1.count().index
valores = grupo1.count().values

É um artifício que trás a solução. Mas como não faz sentido lógico para mim, tentei encontrar uma solução sem usar essa "maladragem". Fiz a conta direto do grupo de dataframes:

#grupo1 = data.groupby('Tipo Agregado')['Valor'] 
grupo1 = data.groupby('Tipo Agregado') # conjunto de dataframes ('Casa' e 'Apartamento')

#label = grupo1.count().index
label = [tipo_agregado for tipo_agregado,df_tipo_agregado in grupo1]

#valores = grupo1.count().values
valores = [df_tipo_agregado.shape[0] for tipo_agregado,df_tipo_agregado in grupo1]

Compilei e deu o mesmo gráfico, creio que esteja certa essa solução.

6 respostas

Olá Laura, tudo bem? Espero que sim!

Muito boa solução Laura, de fato trás o mesmo resultado e você pode se sentir à vontade para escolher a forma que deseja resolver. De fato a coluna "Valor" não faz sentido na análise e foi escolhida ao acaso para poder realizar uma contagem.

Bons estudos!

Laura, não consegui executar seu código na solução. Deu erro numa das pizzas. Caso possa, poderia compartilhar ele inteiro? Obrigado!

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

data = pd.read_csv('dados/aluguel_amostra.csv', sep = ';')

area = plt.figure()
g1 = area.add_subplot(1, 2, 1)
g2 = area.add_subplot(1, 2, 2)

#grupo1 = data.groupby('Tipo Agregado')['Valor'] # ['Valor'] é só pra ser uma série e facilitar a contagem. Poderia ser qualquer outra coluna do dataframe
grupo1 = data.groupby('Tipo Agregado') # conjunto de dataframes ('Casa' e 'Apartamento')

#label = grupo1.count().index
label = [tipo_agregado for tipo_agregado,df_tipo_agregado in grupo1]

#valores = grupo1.count().values
valores = [df_tipo_agregado.shape[0] for tipo_agregado,df_tipo_agregado in grupo1]

g1.pie(valores, labels = label, autopct='%1.1f%%')
g1.set_title('Total de Imóveis por Tipo Agregado')

grupo2 = data.groupby('Tipo')['Valor']
label = grupo2.count().index
valores = grupo2.count().values
g2.pie(valores, labels = label, autopct='%1.1f%%', explode = (.1, .1, .1, .1, .1))
g2.set_title('Total de Imóveis por Tipo')

Obrigado, Laura!

Laura, achei legal essa solução alternativa, mas não consegui entender essas variáveis: tipo_agregado e df_tipo_agregado na linha:

label = [tipo_agregado for tipo_agregado,df_tipo_agregado in grupo1]

Pode explicar melhor por favor?

A coluna 'Tipo Agregado' foi criada com o seguinte código:

casa = ['Casa', 'Casa de Condomínio', 'Casa de Vila']
dados['Tipo Agregado'] = dados['Tipo'].apply(lambda x: 'Casa' if x in casa else 'Apartamento')

Ou seja, ela criou uma nova coluna que separa os imóveis em dois tipos: casa ou apartamento. Se o imóvel for casa, casa de condomínio ou casa de vila, ele é do tipo 'casa'. Se ele é qualquer outro (quitinete ou apartamento), o imóvel é do tipo 'apartamento'.

Temos então o dataframe ('data'):

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Vamos agora agrupar os dados conforme a coluna 'Tipo Agregado'. Ou seja, criar dois dataframes a partir do dataframe original 'data', um que agrupa só 'Casa' e outro que agrupa só 'Apartamento'.

grupo1 = data.groupby('Tipo Agregado')

'grupo1' são dois dataframes: um que agrupa só 'Casa' e outro que agrupa só 'Apartamento' (da coluna 'Tipo Agregado'). Eu chamei de df_tipo_agregado. Então, escrevemos:

label = [tipo_agregado for tipo_agregado,df_tipo_agregado in grupo1]

Ou seja, criamos uma lista de tipo_agregado (Casa ou Apartamento) para cada um dos dois dataframes (que eu chamei de df_tipo_agregado) gerados pelo groupby (só temos dois: um para casa e um para apartamento)

A solução original é realmente mais simples, mas eu quis me desafiar a encontrar uma solução que fizesse mais sentido logicamente. Obviamente, foi uma solução mais complicada. Postei no fórum só para documentação mesmo.