import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
inmuebles = pd.read_csv('inmuebles_bogota.csv')
inmuebles.head()
inmuebles.shape
inmuebles.columns
inmuebles.info()
inmuebles.describe()
#Quitemos el número de decimales para que se vea mejor
pd.options.display.float_format = '{:.2f}'.format
inmuebles.describe()
inmuebles.Área.mean()
print(f"El inmueble con mayor área tiene {inmuebles.Área.max()} metros cuadrados, mientras que el de menor área posee {inmuebles.Área.min()}")
#cuenta con una máscara los inmuebles que tienen un área inferior a 10 metros cuadrados
inmuebles[inmuebles.Área < 10]
#ahora eliminamos los inmuebles que tienen un área inferior a 10 metros cuadrados y actualizamos el dataframe
inmuebles = inmuebles[inmuebles.Área >= 10]
#veamos si los valores extremos de la columna área tienen sentido ahora:
print(f"El inmueble con mayor área tiene {inmuebles.Área.max()} metros cuadrados, mientras que el de menor área posee {inmuebles.Área.min()}.")
#El signo pesos y los puntos son caracteres que no permiten hacer operaciones matemáticas
inmuebles["valor"] = inmuebles["Valor"].str[1:]
inmuebles["valor"] = inmuebles["valor"].str.replace(".","", regex = True)
#Con el formato actual ahora es válido realizar una conversión de tipo string a tipo numérico:
inmuebles["valor"] = pd.to_numeric(inmuebles["valor"])
#Para mejorar la legibilidad reescalemos los valores de la columna "valor" a millones de pesos:
inmuebles["valor"] = inmuebles["valor"].astype(float)/1000000
inmuebles["valor"].max()
inmuebles["valor"].min()
print(f"El inmueble más costoso tiene un valor de {inmuebles['valor'].max()} Millones de pesos colombianos")
print(f"El inmueble más económico tiene un valor de {inmuebles['valor'].min()} Millones de pesos colombianos")
promedio = inmuebles["valor"].median()
print(f"El promedio de la columna 'valor' es {round(promedio, 2)} Millones de pesos colombianos")
sns.histplot(data=inmuebles["valor"], log_scale=(True, True), stat="count" , bins=50, color='Green',)
#histograma de las fecuencias absolutas de la columna "valor" dividida en intervalos de 50 millones de pesos
#Máscara: es una lista que usa valores booleanos para filtrar un DataFrame
inmuebles_chico = (inmuebles.Barrio == "Chico Reservado")
#creación del subconjunto de datos
Df_chico_reservado = inmuebles[inmuebles_chico]
Df_chico_reservado.head(7)
#Otra manipulación interesante es la cantidad de inmuebles por barrio.
inmuebles.Barrio.value_counts()
#Realiza el mismo gráfico anterior pero con seaborn, coloreado en orden ascendente
sns.countplot(x="Barrio", data=inmuebles, order = inmuebles.Barrio.value_counts(ascending=True).iloc[137:].index , palette="Greens_d")
#El método value_counts() nos permite contar la cantidad de veces que se repite un valor en una columna
plt.xticks(rotation=90)
plt.ylabel("Cantidad de inmuebles")
plt.xlabel("")
plt.title("Cantidad de inmuebles por barrio")
plt.show()
#
datos_barrio = inmuebles.groupby('Barrio').sum()
datos_barrio['Valor_m2_Barrio'] = datos_barrio['valor']/datos_barrio['Área']
datos_barrio
#Guardo en un diccionario la columna Valor_m2_Barrio
m2_barrio = dict(datos_barrio['Valor_m2_Barrio'])
m2_barrio
inmuebles['Valor_m2_Barrio'] = inmuebles['Barrio']
inmuebles['Valor_m2_Millon'] = inmuebles['valor']/inmuebles['Área']
#asigno los valores del diccionario a la columna Valor_m2_Barrio a través de un 'mapeo'
nmuebles['Valor_m2_Barrio'] = inmuebles['Valor_m2_Barrio'].map(m2_barrio)
inmuebles.head(5)
top_barrios = inmuebles["Barrio"].value_counts().head(10).index
#Reseteo el índice para no tener que citar strings
datos_barrio.reset_index(inplace=True)
datos_barrio
datos_barrio.query("Barrio in @top_barrios")
#Gráfico de barras con seaborn
plt.figure(figsize=(16,16))
ax = sns.barplot(x="Barrio", y="Valor_m2_Barrio", data=datos_barrio.query("Barrio in @top_barrios"))
ax.tick_params(axis='x', rotation=45)
ax.set_title("Valor promedio del metro cuadrado para el top10 barrios")
plt.figure(figsize=(10,8))
ax = sns.boxplot(x="Barrio", y="Valor_m2_Millon", data = inmuebles.query('Barrio in @top_barrios'))
ax.tick_params(axis='x', rotation=45)
plt.show()
plt.figure(figsize=(10,8))
ax = sns.boxplot(x="Barrio", y="Valor_m2_Millon", data = inmuebles.query('Barrio in @top_barrios & Valor_m2_Millon < 15'))
ax.tick_params(axis='x', rotation=45)
plt.show()