import geopandas as gpd
import pandas as pd
from pyLandUseMX.descargas import *
from pyLandUseMX.usodesuelo import *
from pyLandUseMX.denue import *
from shapely.geometry import Point
Extracción de actividades del DENUE
denue
y coberturas
para extraer actividades y agregarlas en polígonos
En este tutorial vamos a usar la librería para extraer algunas actividades específicas y agregarlas por colonias en la CDMX. Las actividades que vamos a extraer son:
- Bancos
- Tiendas de conveniencia
- Restaurantes
- Bares
- Estaciones de policía
- Estaciones de metrobús
- Estaciones de metro
Empezamos por importar todas las librerías que vamos a usar
Denue
Los bancos, tiendas de conveniencia, restaurantes y bares los vamos a extraer del DENUE
Bancos
Extraer los bancos es muy fácil, primero nos aseguramos de que estén descargados los datos del DENUE para la Cdmx e instanciamos la clase.
= descarga_denue()
pth = Denue.desde_archivo(pth)
denue denue.datos.head()
El archivo ya está descargado
nom_estab | raz_social | codigo_act | nombre_act | per_ocu | tipoCenCom | cve_ent | cve_mun | cve_loc | ageb | manzana | index_right | OBJECTID | Shape_Leng | NOM_CIUDAD | Shape_Le_1 | Shape_Area | CVE_SUN | SUN | geometry | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | COMERCIALIZADORA Y DISTRIBUIDORA DE VÍVERES SA... | COMERCIALIZADORA DE VIVERES SA DE CV | 115113 | Beneficio de productos agrícolas | 6 a 10 personas | None | 09 | 017 | 0001 | 0884 | 018 | 53 | 54 | 630172.981156 | Valle de México | 630.172981 | 781912.110166 | 13 | 13.0 | POINT (-99.06768 19.42209) |
1 | CRIADERO DE TRUCHAS | None | 112512 | Piscicultura y otra acuicultura, excepto camar... | 0 a 5 personas | None | 09 | 008 | 0081 | 0368 | 800 | 53 | 54 | 630172.981156 | Valle de México | 630.172981 | 781912.110166 | 13 | 13.0 | POINT (-99.26444 19.28889) |
2 | EMPACADORA TEOTIHUACAN | EMPACADORA TEOTIHUACAN SA DE CV | 115113 | Beneficio de productos agrícolas | 0 a 5 personas | None | 09 | 006 | 0001 | 0325 | 020 | 53 | 54 | 630172.981156 | Valle de México | 630.172981 | 781912.110166 | 13 | 13.0 | POINT (-99.07238 19.40144) |
3 | FRUTAS CASA GRANDES | FRUTAS CASA GRANDE SPR DE RS DE CV | 115113 | Beneficio de productos agrícolas | 0 a 5 personas | CENTRAL DE ABASTO | 09 | 007 | 0001 | 2475 | 005 | 53 | 54 | 630172.981156 | Valle de México | 630.172981 | 781912.110166 | 13 | 13.0 | POINT (-99.09481 19.37215) |
4 | CRIADERO DE TRUCHAS RANCHO LA ROSITA | None | 112512 | Piscicultura y otra acuicultura, excepto camar... | 0 a 5 personas | None | 09 | 008 | 0075 | 0368 | 800 | 53 | 54 | 630172.981156 | Valle de México | 630.172981 | 781912.110166 | 13 | 13.0 | POINT (-99.27449 19.28433) |
Los bancos los podemos identificar a través de la clave SCIAN 522110 (Instituciones de intermediación crediticia y financiera no bursátil:: Banca Múltiple). Vamos a filtrar los bancos y agregar una columna con la categoría para usarla después cuando agreguemos en colonias
= denue.filtra_scian(['522110'], categoria='Bancos')
bancos 'codigo_act', 'nom_estab', 'Categoria']].head() bancos.datos[[
codigo_act | nom_estab | Categoria | |
---|---|---|---|
577280 | 522110 | BANCO INBURSA AGUILAS AXOMIATLA | Bancos |
577281 | 522110 | BANCO SANTANDER | Bancos |
577282 | 522110 | BANCO INBURSA BODEGA AURRERA LA VIRGEN | Bancos |
577283 | 522110 | BANCO SANTANDER | Bancos |
577284 | 522110 | BANCO SANTANDER | Bancos |
Tiendas de conveniencia
Ahora vamos a extraer las tiendas de conveniencia, estas las podemos encontrar en la clave 462112
que corresponde a “Comercio al por menor en minisupers”
= denue.filtra_scian(['462112'], categoria='Conveniencia')
conveniencia 'codigo_act', 'nom_estab', 'Categoria']].head() conveniencia.datos[[
codigo_act | nom_estab | Categoria | |
---|---|---|---|
220450 | 462112 | ABARROTES Y DULCES EDIMART | Conveniencia |
220463 | 462112 | ABARROTES Y MAS | Conveniencia |
220467 | 462112 | ABARROTES Y REFRESCOS | Conveniencia |
220517 | 462112 | ABARROTES Y VINOS AJUSCO | Conveniencia |
220524 | 462112 | ABARROTES YAZMIN | Conveniencia |
Restaurantes
Los restaurantes los podemos identificar por la clave SCIAN 72251
“Servicios de preparación de alimentos y bebidas alcohólicas y no alcohólicas”
= denue.filtra_scian(['72251'], categoria='Restaurantes')
restaurantes 'codigo_act', 'nom_estab', 'Categoria']].head() restaurantes.datos[[
codigo_act | nom_estab | Categoria | |
---|---|---|---|
725899 | 722514 | ANTOJITOS MEXICANOS | Restaurantes |
725900 | 722513 | ANTOJITOS MEXICANOS | Restaurantes |
725901 | 722513 | ANTOJITOS MEXICANOS | Restaurantes |
725902 | 722519 | ANTOJITOS MEXICANOS | Restaurantes |
725903 | 722513 | ANTOJITOS MEXICANOS | Restaurantes |
Bares
Los Bares se identifican con la clave 722412
“Bares, cantinas y similares”
= denue.filtra_scian(['722412'], categoria='Bares')
bares 'codigo_act', 'nom_estab', 'Categoria']].head() bares.datos[[
codigo_act | nom_estab | Categoria | |
---|---|---|---|
726067 | 722412 | AGUAMIEL Y PULQUES | Bares |
726076 | 722412 | AGUA BENDITA | Bares |
726087 | 722412 | ADRENALINE WINGS | Bares |
726110 | 722412 | ACADEMIA MEXICANA DE SOMMELIERS | Bares |
726244 | 722412 | A DIOS LE PIDO RESTAURANTE BAR | Bares |
Estaciones de policía
También es posible encontrar las estaciones de policía en el Denue usando la clave SCIAN 931410
” Impartición de justicia y mantenimiento de la seguridad y el orden público”
= denue.filtra_scian(['931410'], categoria='Policía')
policia 'codigo_act', 'nom_estab', 'Categoria']].head() policia.datos[[
codigo_act | nom_estab | Categoria | |
---|---|---|---|
988952 | 931410 | MEDICO LEGISTA COORDINACIÓN TERRITORIAL COYOAC... | Policía |
988953 | 931410 | MEDICO LEGISTA | Policía |
988956 | 931410 | MESA DE DERECHOS HUMANOS DEL CEVASEP 1 | Policía |
988959 | 931410 | MINISTERIO PUBLICO AGENCIA COYOACAN 3 | Policía |
988960 | 931410 | MINISTERIO PUBLICO | Policía |
Agregar en colonias
Ya tenemos todos los datos que podemos sacar del Denue, ahora vamos a unirlos en un solo DataFrame y utilizar el módulo coberturas
para agregarlos en las colonias de la CDMX. Vamos a seleccionar solamente las columnas Categoria
y Geometry
para después poder combinar estos datos fácilmente con los que obtengamos de otras fuentes.
= pd.concat([bancos.datos,
datos_denue
conveniencia.datos,
restaurantes.datos,
bares.datos,=0)
policia.datos], axis= datos_denue.loc[:, ['Categoria', 'geometry']]
datos_denue datos_denue.head()
Categoria | geometry | |
---|---|---|
577280 | Bancos | POINT (-99.25366 19.34207) |
577281 | Bancos | POINT (-99.21235 19.31548) |
577282 | Bancos | POINT (-99.10697 19.32200) |
577283 | Bancos | POINT (-99.11336 19.39924) |
577284 | Bancos | POINT (-99.17190 19.39496) |
Ahora ya podemos fácilmente agregar los datos en las colonias, asegurándonos de descargar los datos de las colonias, creando el objeto de la clase Poligonos
y agregando.
= descarga_colonias_cdmx()
pth_colonias = Poligonos.desde_archivo(pth_colonias, 'id')
colonias = colonias.agrega_puntos(datos_denue, clasificacion='Categoria')
denue_colonia denue_colonia.datos.head()
id | Bancos | Bares | Conveniencia | Policía | Restaurantes | nomut | geometry | |
---|---|---|---|---|---|---|---|---|
0 | 1 | 0.0 | 2.0 | 0.0 | 0.0 | 20.0 | AGUILERA | POLYGON ((483311.618 2153254.848, 483332.006 2... |
1 | 2 | 0.0 | 0.0 | 2.0 | 0.0 | 28.0 | ALDANA | POLYGON ((484406.956 2153012.331, 484401.132 2... |
2 | 3 | 0.0 | 0.0 | 2.0 | 0.0 | 68.0 | ANGEL ZIMBRON | POLYGON ((480013.755 2153003.618, 480063.589 2... |
3 | 4 | 2.0 | 0.0 | 2.0 | 0.0 | 74.0 | ARENAL | POLYGON ((484061.118 2152622.284, 484061.678 2... |
4 | 5 | 90.0 | 12.0 | 6.0 | 0.0 | 286.0 | CENTRO DE AZCAPOTZALCO | POLYGON ((480123.402 2154520.928, 480131.648 2... |
Datos abiertos CDMX
Hasta aquí utilizamos el Denue como fuente de datos, pero también podemos utilizar otras fuentes sin pasar por la clase Denue
. Por ejemplo, para obtener los datos de estaciones de metro y metrobús, vamos a utilizar los Datos abiertos de la CDMX
Estaciones de metro
Las estaciones se pueden descargar de aquí. Vienen dos shapes uno con las líneas y otro con las estaciones, en este caso vamos a usar sólo el de las estaciones.
= gpd.read_file("../../datos/descargas/STC_Metro_estaciones_utm14n.zip")
metro metro
SISTEMA | NOMBRE | LINEA | EST | CVE_EST | CVE_EOD17 | TIPO | ALCALDIAS | AÑO | geometry | |
---|---|---|---|---|---|---|---|---|---|---|
0 | STC Metro | Pantitlán | 01 | 01 | STC0101 | 05014 | Terminal / Transbordo | Venustiano Carranza | 1984 | POINT Z (-99.07474 19.41633 0.00000) |
1 | STC Metro | Zaragoza | 01 | 02 | STC0102 | 05020 | Intermedia | Venustiano Carranza | 1969 | POINT Z (-99.08229 19.41192 0.00000) |
2 | STC Metro | Gomez Farías | 01 | 03 | STC0103 | 05007 | Intermedia | Venustiano Carranza | 1969 | POINT Z (-99.09021 19.41648 0.00000) |
3 | STC Metro | Boulevard Puerto Aéreo | 01 | 04 | STC0104 | 05003 | Intermedia | Venustiano Carranza | 1969 | POINT Z (-99.09626 19.41994 0.00000) |
4 | STC Metro | Balbuena | 01 | 05 | STC0105 | 05001 | Intermedia | Venustiano Carranza | 1969 | POINT Z (-99.10277 19.42336 0.00000) |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
190 | STC Metro | Múzquiz | B | 17 | STCLB17 | 05185 | Intermedia | Estado de México - Ecatepec | 2000 | POINT Z (-99.04207 19.50149 0.00000) |
191 | STC Metro | Ecatepec | B | 18 | STCLB18 | 05179 | Intermedia | Estado de México - Ecatepec | 2000 | POINT Z (-99.03607 19.51513 0.00000) |
192 | STC Metro | Olímpica | B | 19 | STCLB19 | 05188 | Intermedia | Estado de México - Ecatepec | 2000 | POINT Z (-99.03334 19.52134 0.00000) |
193 | STC Metro | Plaza Aragón | B | 20 | STCLB20 | 05189 | Intermedia | Estado de México - Ecatepec | 2000 | POINT Z (-99.03018 19.52848 0.00000) |
194 | STC Metro | Ciudad Azteca | B | 21 | STCLB21 | 05177 | Terminal | Estado de México - Ecatepec | 2000 | POINT Z (-99.02751 19.53451 0.00000) |
195 rows × 10 columns
Vamos a quedarnos sólo cona la columna de geometría y, para poder combinarlos bien con los que obtuvimos arriba del Denue, agreguemos una columna con la categoría a la que corresponden
'Categoria'] = "Metro"
metro.loc[:, = metro.loc[:, ['Categoria', 'geometry']]
metro metro.head()
Categoria | geometry | |
---|---|---|
0 | Metro | POINT Z (-99.07474 19.41633 0.00000) |
1 | Metro | POINT Z (-99.08229 19.41192 0.00000) |
2 | Metro | POINT Z (-99.09021 19.41648 0.00000) |
3 | Metro | POINT Z (-99.09626 19.41994 0.00000) |
4 | Metro | POINT Z (-99.10277 19.42336 0.00000) |
Metrobús
Ahora hacemos lo mismo con los datos del metrobús que se pueden descargar de aquí. Estos datos vienen en UTM, entonces vamos a necesitar reproyectarlos para después poderlos concatenar con los otros.
= gpd.read_file("../../datos/descargas/Metrobus_estaciones_rutas_utm14n.zip")
metrobus = metrobus.to_crs(4326)
metrobus 'Categoria'] = "Metrobus"
metrobus.loc[:, = metrobus.loc[:, ['Categoria', 'geometry']]
metrobus metrobus.head()
Categoria | geometry | |
---|---|---|
0 | Metrobus | POINT (-99.08367 19.43531) |
1 | Metrobus | POINT (-99.07725 19.42148) |
2 | Metrobus | POINT (-99.15242 19.44259) |
3 | Metrobus | POINT (-99.15245 19.44214) |
4 | Metrobus | POINT (-99.15327 19.43903) |
Agregar en colonias
Igual que con los datos anteriores, vamos a concatenar estas dos bases para agregarlas en las colonias
= pd.concat([metro, metrobus], axis=0)
transporte = colonias.agrega_puntos(transporte, clasificacion='Categoria')
transporte_colonias transporte_colonias.datos
id | Metro | Metrobus | nomut | geometry | |
---|---|---|---|---|---|
0 | 1 | 0.0 | 0.0 | AGUILERA | POLYGON ((483311.618 2153254.848, 483332.006 2... |
1 | 2 | 0.0 | 0.0 | ALDANA | POLYGON ((484406.956 2153012.331, 484401.132 2... |
2 | 3 | 1.0 | 0.0 | ANGEL ZIMBRON | POLYGON ((480013.755 2153003.618, 480063.589 2... |
3 | 4 | 0.0 | 0.0 | ARENAL | POLYGON ((484061.118 2152622.284, 484061.678 2... |
4 | 5 | 0.0 | 0.0 | CENTRO DE AZCAPOTZALCO | POLYGON ((480123.402 2154520.928, 480131.648 2... |
... | ... | ... | ... | ... | ... |
1810 | 1811 | 0.0 | 0.0 | VILLA PROGRESISTA | POLYGON ((474406.945 2140353.439, 474418.850 2... |
1811 | 1812 | 0.0 | 0.0 | VILLA SOLIDARIDAD | POLYGON ((477048.978 2143204.554, 477054.695 2... |
1812 | 1813 | 0.0 | 0.0 | VILLA VERDUN | POLYGON ((473081.154 2138733.281, 473070.790 2... |
1813 | 1814 | 0.0 | 0.0 | ZENON DELGADO | POLYGON ((477329.014 2144260.214, 477335.725 2... |
1814 | 1815 | 0.0 | 0.0 | ZOTOLTITLA | POLYGON ((475172.282 2139719.331, 475190.495 2... |
1815 rows × 5 columns
Unir datos y exportar
Ya tenemos las bases agregadas pogracias por recordarme jejeje r colonias que extrajimos de dos fuentes diferentes: el Denue y los Datos Abiertos de la CDMX. Ahora vamos a unir ambas bases y exportar los datos como shapefile.
El método Poligonos.agrega_puntos
siempre nos regresa los polígonos originales completos, entonces unirlos es sencillo
= transporte_colonias.datos.merge(denue_colonia.datos[['id','Bancos', 'Bares', 'Conveniencia', 'Policía', 'Restaurantes']], on='id')
completo completo
id | Metro | Metrobus | nomut | geometry | Bancos | Bares | Conveniencia | Policía | Restaurantes | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0.0 | 0.0 | AGUILERA | POLYGON ((483311.618 2153254.848, 483332.006 2... | 0.0 | 2.0 | 0.0 | 0.0 | 20.0 |
1 | 2 | 0.0 | 0.0 | ALDANA | POLYGON ((484406.956 2153012.331, 484401.132 2... | 0.0 | 0.0 | 2.0 | 0.0 | 28.0 |
2 | 3 | 1.0 | 0.0 | ANGEL ZIMBRON | POLYGON ((480013.755 2153003.618, 480063.589 2... | 0.0 | 0.0 | 2.0 | 0.0 | 68.0 |
3 | 4 | 0.0 | 0.0 | ARENAL | POLYGON ((484061.118 2152622.284, 484061.678 2... | 2.0 | 0.0 | 2.0 | 0.0 | 74.0 |
4 | 5 | 0.0 | 0.0 | CENTRO DE AZCAPOTZALCO | POLYGON ((480123.402 2154520.928, 480131.648 2... | 90.0 | 12.0 | 6.0 | 0.0 | 286.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1810 | 1811 | 0.0 | 0.0 | VILLA PROGRESISTA | POLYGON ((474406.945 2140353.439, 474418.850 2... | 2.0 | 0.0 | 0.0 | 0.0 | 6.0 |
1811 | 1812 | 0.0 | 0.0 | VILLA SOLIDARIDAD | POLYGON ((477048.978 2143204.554, 477054.695 2... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1812 | 1813 | 0.0 | 0.0 | VILLA VERDUN | POLYGON ((473081.154 2138733.281, 473070.790 2... | 0.0 | 0.0 | 0.0 | 2.0 | 2.0 |
1813 | 1814 | 0.0 | 0.0 | ZENON DELGADO | POLYGON ((477329.014 2144260.214, 477335.725 2... | 0.0 | 0.0 | 0.0 | 0.0 | 14.0 |
1814 | 1815 | 0.0 | 0.0 | ZOTOLTITLA | POLYGON ((475172.282 2139719.331, 475190.495 2... | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
1815 rows × 10 columns
"../../datos/descargas/actividades_cdmx.shp") completo.to_file(
/tmp/ipykernel_14136/2170292792.py:1: UserWarning: Column names longer than 10 characters will be truncated when saved to ESRI Shapefile.
completo.to_file("../../datos/descargas/actividades_cdmx.shp")