# Librería de manejo de datos
import pandas as pd
import numpy as np
# Extraemos los datps de la página de Datos Abiertos de Colombia
data = pd.read_json('https://www.datos.gov.co/resource/e5yn-j87n.json', encoding='UTF-8')
# Hacemos un análisis de cómo es la estructura de los datos
data.head()
# Creamos una Serie para realizar las transformaciones
data_mun = data[['municipios_de_inluencia']].copy()
# Cambiamos las "y" por comas y los '\n'
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].str.replace(' y ',',')
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].str.replace('\n',',')
# Volvemos los datos listas
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].str.split(',')
# Expandimos los valores dentro de las listas en filas
data_mun = data_mun.explode('municipios_de_inluencia').reset_index(drop=True)
# Borramos los espacios
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].str.strip()
# Arreglamos nombres de los municipios
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].replace(['San Pedro','Santafé de Antioquia'],['San Pedro de los Milagros','Santa Fe de Antioquia'])
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].replace('Santa Fe de Antioquia','Santa Fé de Antioquia')
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].replace('San Andrés de Cuerquia','San Andrés de Cuerquía')
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].replace('Don Matías','Donmatías')
# Índices de datos nulos
id = np.array(data_mun[(data_mun['municipios_de_inluencia']=='') | (data_mun['municipios_de_inluencia']=='de Los Milagros')].index)
# Sacamos los valores nulos
data_mun = data_mun.drop(id).sort_values('municipios_de_inluencia')
# Creamos un DF que contiene que municipio con la cantidad de veces que aparece en alguna área protegida
municipios = pd.DataFrame(data_mun['municipios_de_inluencia'].value_counts().sort_index()).reset_index(drop=False)
municipios.columns= ['Municipio', 'Presencia de áreas']
municipios
# Revisamos qué porción del total de municipios de Antioquia tienen áreas protegidas por Corantioquia
print(str(len(municipios)/125*100) + '%')
#Importamos librería que nos ayudará
import json
# Leemos el archivo que contiene las ubicaciones de los municipios en formato GeoJson
colombia = json.load(open('MunicipiosVeredas1MB2.json','r'))
# Creamos un DataFrame para relacionar ubicaciones con municipios
cities_locations_col = pd.json_normalize(colombia,record_path='features')
# Extraemos solo las ubicaciones en Antioquia (Que poseen el código 5) ya que hay municipios con nombres iguales
# en departamentos diferenes
cities_locations_ant = cities_locations_col.loc[cities_locations_col['properties.DPTO_CCDGO']=='05']
cities_locations_ant.head(1)
municipios['Municipio'] = municipios['Municipio'].str.upper()
municipios.head()
# Juntamos ambos DataFrames
bd_lista = pd.merge(cities_locations_ant,municipios, 'left', right_on='Municipio',left_on='properties.MPIO_CNMBR')
bd_lista['Presencia de áreas'] = bd_lista['Presencia de áreas'].fillna(0)
# Cambiamos el nombre de una columna para una mejor visualización
bd_lista = bd_lista.rename(columns={'properties.DPTOMPIO':'Código Muncipio'})
bd_lista.head(2)
import plotly.express as px
import plotly.io as pio
# pio.renderers.default = 'notebook'
fig = px.choropleth(bd_lista,
locations='Código Muncipio',
geojson=colombia,
featureidkey='properties.MPIO_CCNCT',
color='Presencia de áreas',
hover_name='properties.MPIO_CNMBR'
)
fig.update_geos(showcountries=True,showcoastlines=True,showland=True,fitbounds='locations')
fig.update_layout(
title_text='Cantidad de Áreas Protegidas por Municipios de Antioquia en Corantioquia',
font={'size':15}
)
fig.show();
# Creamos una Serie para realizar las transformaciones
data_mun = data[['municipios_de_inluencia','nombre_del_rea_protegida']].copy()
# Cambiamos las "y" por comas y los '\n'
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].str.replace(' y ',',')
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].str.replace('\n',',')
# Volvemos los datos listas
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].str.split(',')
# Expandimos los valores dentro de las listas en filas
data_mun = data_mun.explode('municipios_de_inluencia').reset_index(drop=True)
# Borramos los espacios
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].str.strip()
# Arreglamos nombres de los municipios
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].replace(['San Pedro','Santafé de Antioquia'],['San Pedro de los Milagros','Santa Fe de Antioquia'])
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].replace('Santa Fe de Antioquia','Santa Fé de Antioquia')
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].replace('San Andrés de Cuerquia','San Andrés de Cuerquía')
data_mun['municipios_de_inluencia'] = data_mun['municipios_de_inluencia'].replace('Don Matías','Donmatías')
# Índices de datos nulos para limpiar
id = np.array(data_mun[(data_mun['municipios_de_inluencia']=='') | (data_mun['municipios_de_inluencia']=='de Los Milagros')].index)
# Sacamos los valores nulos
data_mun = data_mun.drop(id).sort_values('municipios_de_inluencia')
data_mun
# Sacamos los municipios para un ciclo for
municipios = data_mun['municipios_de_inluencia'].unique()
# Creamos un diccionario para almacenar en cada llave (municipio),
# el nombre de cada área protegida por el municipio
dic_mun = {}
# En el for:
for municipio in municipios:
# Creamos el diccionario
dic_mun[municipio]=list(data_mun.loc[data_mun['municipios_de_inluencia']==municipio,'nombre_del_rea_protegida'].values)
# A cada lista la ajustamos para que quede con 3 valores (por defecto nulos)
# para que se ajusten luego a la transformación como DataFrame
if len(dic_mun[municipio]) == 1:
dic_mun[municipio] = dic_mun[municipio] + [np.nan]*2
elif len(dic_mun[municipio]) == 2:
dic_mun[municipio] = dic_mun[municipio] + [np.nan]
# Creamos el DataFrame
df1 = pd.DataFrame.from_dict(dic_mun, orient='index', columns=[f'Área Protegida {i}' for i in range(1,4)])
# Revisemos las áreas protegidas por cada municipio
df1
# Creamos una copia
data_comp = data[['nombre_del_rea_protegida','rea_ha','municipios_de_inluencia']].copy()
# Sacamos la composición relativa de cada área con respecto al total
data_comp['rea_ha (%)'] = data_comp['rea_ha']/data_comp['rea_ha'].sum()
# Ordenamos de mayor a menor
data_comp = data_comp.sort_values('rea_ha (%)',ascending=False)
# Arreglamos el formato de %
data_comp['rea_ha (%)'] = data_comp['rea_ha (%)'].apply(lambda x: '{:.2%}'.format(x))
# Revisemos
data_comp
# Miremos en qué municipios tiene presencia
data_comp['municipios_de_inluencia'].head(1).values
# Extraemos el total del área en Hectáreas
area_ha = data['rea_ha'].sum()
print('El área en Hectáreas de áreas protegidas por Corantioquia es: ', '{:,}'.format(round(area_ha)),'Ha')
area_km2 = area_ha*0.01
print('El área en Km^2 de áreas protegidas por Corantioquia es: ', '{:,}'.format(round(area_km2)), 'Km^2')
area_ant_km2 = 63612
porcion_territorio_protegido = area_km2/area_ant_km2
print('Del total del área del departamento de Antioquia, el: ', '{:.2%}'.format(porcion_territorio_protegido), 'pertenecen a áreas protegidas por Corantiquia')
# Creamos una copia
data_obj = data.copy()
# Tomamos la columnas con los objetos a proteger y los volvemos listas dentro de cada fila
data_obj['atributos_valores_objeto'] = data['atributos_valores_objeto'].apply(lambda x: x.split('\n'))
# Extraemos las únicas columnas que nos interesan
data_obj = data_obj[['nombre_del_rea_protegida','atributos_valores_objeto']]
# Expandimos las listas en cada fila
data_obj = data_obj.explode('atributos_valores_objeto')
# Observamos
data_obj
# Revisamos cuál es el área con más atributos a proteger
print(data_obj['nombre_del_rea_protegida'].value_counts().head(3))
# Guardemos el nombre para búsquedas futuras
area_prot = data_obj['nombre_del_rea_protegida'].value_counts().head(1).index[0]
# Revisemos a qué municipios pertenece y qué atributos cobija
x = data.loc[data['nombre_del_rea_protegida']==area_prot,'municipios_de_inluencia'].values[0]
print('Los municipios que acoge el área de ' + area_prot + ' son ' + x)
data_obj.loc[data_obj['nombre_del_rea_protegida']==area_prot]
# Tomamos la columna que necesitamos y la copiamos
eco = data[['nombre_del_rea_protegida','tipo_de_ecosistema_presente']].copy()
# Visualicemos
eco
# Volvemos cada fila una lista al separarlos por el divisor que es un santo de línea ("\n")
# A la ves, expandimos toda la Series de datos por cada elemento de cada lista con ".explode"
# eco['tipo_de_ecosistema_presente'] = eco['tipo_de_ecosistema_presente'].str.split('\n')
# eco = eco.explode('tipo_de_ecosistema_presente').reset_index(drop=True)
# Generemos una columna que cuente las veces que está un área en este DF
eco['ocurrencias_area'] = eco['nombre_del_rea_protegida'].apply(lambda x: eco['nombre_del_rea_protegida'].value_counts()[x])
# Ordenamos de mayor a menos
eco.sort_values('ocurrencias_area',ascending=False)
# Las áreas con más ecosistemas son:
# Lo volvemos DF para obtener una mejor visualización
pd.DataFrame(eco['tipo_de_ecosistema_presente'].unique())
data['categor_a_de_manejo'].value_counts()
# !pip install session_info
import session_info
session_info.show()