Sistema Nacional de Información e Indicadores de Vivienda

ID Descripción
P0405 Viviendas Verticales
P0406 Viviendas urbanas en PCU U1 y U2
P0411 Subsidios CONAVI

In [2]:
descripciones = {
    'P0405': 'Viviendas Verticales',
    'P0406': 'Viviendas urbanas en PCU U1 y U2',
    'P0411': 'Subsidios CONAVI'
}

In [92]:
# Librerias utilizadas
import pandas as pd
import sys
import urllib
import os
import csv
import zeep
import requests
from lxml import etree
import xmltodict

In [4]:
# Configuracion del sistema
print('Python {} on {}'.format(sys.version, sys.platform))
print('Pandas version: {}'.format(pd.__version__))
import platform; print('Running on {} {}'.format(platform.system(), platform.release()))


Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)] on win32
Pandas version: 0.20.1
Running on Windows 8.1

2. Descarga de datos

Los datos se descargan por medio de una conexión a un servicio SOAP proporcionado por el SNIIV. Para acceder a los datos proporcionados por cada uno de los servicios del SNIIV, tiene que hacerse un POST request, especificando en el encabezado el servicio al que se busca acceder y en el cuerpo de la petición, un XML con parametros para que el servidor de SNIIV pueda regresar una respuesta


In [85]:
# Esta celda contiene textos estándar para los encabezados y el cuerpo de la operación que se solicita al servidor.
# los textos entre corchetes {} sirven para especificar la operacion a la que se busca tener acceso
scheme = r'http://www.conavi.gob.mx:8080/WS_App_SNIIV.asmx?WSDL'       #El scheme siempre es el mismo
SOAPAction = ('http://www.conavi.gob.mx:8080/WS_App_SNIIV/{}')
xmlbody = (
'<?xml version="1.0" encoding="utf-8"?>'
'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
  '<soap:Body>'
    '<{} xmlns="http://www.conavi.gob.mx:8080/WS_App_SNIIV">'
      '<dat></dat>'
    '</{}>'
  '</soap:Body>'
'</soap:Envelope>'
)

In [119]:
# Conexion y descarga de datos
operacion = 'Subsidios'
heads = {'Content-Type': 'text/xml; charset=utf-8', 
           'SOAPAction': SOAPAction.format(operacion)}
body = xmlbody.format(operacion, operacion)
r = requests.post(scheme, data=body, headers=heads)
print(r.content[0:300])


b'<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><SubsidiosResponse xmlns="http://www.conavi.gob.mx:8080/WS_App_SNIIV"><SubsidiosRe'

In [131]:
list(r.headers.keys())


Out[131]:
['Cache-Control',
 'Content-Type',
 'Server',
 'X-AspNet-Version',
 'X-Powered-By',
 'Date',
 'Content-Length']

In [103]:
r = xmltodict.parse(r.content)
r.keys()


Out[103]:
odict_keys(['soap:Envelope'])

In [114]:
# Después de parseada la respuesta a un diccionario de Python, los datos se encuentran varios niveles por debajo, por lo que es 
# necesario explorar estos niveles hasta llegar a los datos útiles
rodict = r['soap:Envelope']['soap:Body']['{}Response'.format(operacion)]['{}Result'.format(operacion)]['app_sniiv_rep_subs']
rodict[0]


Out[114]:
OrderedDict([('cve_ent', '01'),
             ('tipo_ee', 'NO DISPONIBLE'),
             ('modalidad', 'Autoproducción'),
             ('acciones', '11'),
             ('monto', '781626.56')])

In [116]:
# Con los datos parseados en forma de OrderedDict ya es posible hacer un DataFrame de la siguiente manera.
pd.DataFrame(rodict, columns=rodict[0].keys()).head()


Out[116]:
cve_ent tipo_ee modalidad acciones monto
0 01 NO DISPONIBLE Autoproducción 11 781626.56
1 01 INFONAVIT Nueva 234 13556833.79
2 01 INFONAVIT Usada 6 318407.02
3 01 RIF - FOVI Nueva 1 47500
4 02 INFONAVIT Nueva 280 12989084.57

Lo anterior es un ejemplo de cómo pueden obtenerse datos desde el servicio montado por el SNIIV. Con base en este ejemplo es posible hacer una función que realice las peticiones de manera más compacta en cada caso.


In [144]:
def getsoap(operacion):
    scheme = r'http://www.conavi.gob.mx:8080/WS_App_SNIIV.asmx?WSDL'       #El scheme siempre es el mismo
    SOAPAction = ('http://www.conavi.gob.mx:8080/WS_App_SNIIV/{}')
    xmlbody = (
    '<?xml version="1.0" encoding="utf-8"?>'
    '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
      '<soap:Body>'
        '<{} xmlns="http://www.conavi.gob.mx:8080/WS_App_SNIIV">'
          '<dat></dat>'
        '</{}>'
      '</soap:Body>'
    '</soap:Envelope>'
    )
    heads = {'Content-Type': 'text/xml; charset=utf-8', 
           'SOAPAction': SOAPAction.format(operacion)}
    body = xmlbody.format(operacion, operacion)
    r = requests.post(scheme, data=body, headers=heads)
    if r.status_code != 200:          # 
        print('status: {}\n**Operacion terminada**'.format(r.status_code))
        return
    else:
        print('status: {}\nContent Type: {}'.format(r.status_code, r.headers['Content-Type']))
        print('Date: {}\nContent Lenght: {}'.format(r.headers['Date'], r.headers['Content-Length']))
        r = xmltodict.parse(r.content)
#        return r
        rodict = r['soap:Envelope']['soap:Body']['{}Response'.format(operacion)]['{}Result'.format(operacion)][list(test.keys())[0]]
        return pd.DataFrame(rodict, columns=rodict[0].keys()).head()

In [145]:
test = getsoap('viv_vig_x_avnc')


status: 200
Content Type: text/xml; charset=utf-8
Date: Fri, 20 Apr 2018 15:17:40 GMT
Content Lenght: 8422

In [156]:



Out[156]:
'app_sniiv_vv_x_avanc'

In [146]:
test


Out[146]:
OrderedDict([('app_sniiv_vv_x_avanc',
              [OrderedDict([('cve_ent', '01'),
                            ('entidad', 'AGUASCALIENTES'),
                            ('viv_proc_m50', '4114'),
                            ('viv_proc_50_99', '2485'),
                            ('viv_term_rec', '1843'),
                            ('viv_term_ant', '6353'),
                            ('total', '14795')]),
               OrderedDict([('cve_ent', '02'),
                            ('entidad', 'BAJA CALIFORNIA'),
                            ('viv_proc_m50', '6289'),
                            ('viv_proc_50_99', '4476'),
                            ('viv_term_rec', '2080'),
                            ('viv_term_ant', '5959'),
                            ('total', '18804')]),
               OrderedDict([('cve_ent', '03'),
                            ('entidad', 'BAJA CALIFORNIA SUR'),
                            ('viv_proc_m50', '1358'),
                            ('viv_proc_50_99', '837'),
                            ('viv_term_rec', '871'),
                            ('viv_term_ant', '2035'),
                            ('total', '5101')]),
               OrderedDict([('cve_ent', '04'),
                            ('entidad', 'CAMPECHE'),
                            ('viv_proc_m50', '328'),
                            ('viv_proc_50_99', '461'),
                            ('viv_term_rec', '70'),
                            ('viv_term_ant', '1894'),
                            ('total', '2753')]),
               OrderedDict([('cve_ent', '05'),
                            ('entidad', 'COAHUILA DE ZARAGOZA'),
                            ('viv_proc_m50', '6635'),
                            ('viv_proc_50_99', '3559'),
                            ('viv_term_rec', '1949'),
                            ('viv_term_ant', '5704'),
                            ('total', '17847')]),
               OrderedDict([('cve_ent', '06'),
                            ('entidad', 'COLIMA'),
                            ('viv_proc_m50', '2229'),
                            ('viv_proc_50_99', '1625'),
                            ('viv_term_rec', '1260'),
                            ('viv_term_ant', '3319'),
                            ('total', '8433')]),
               OrderedDict([('cve_ent', '07'),
                            ('entidad', 'CHIAPAS'),
                            ('viv_proc_m50', '2451'),
                            ('viv_proc_50_99', '2322'),
                            ('viv_term_rec', '813'),
                            ('viv_term_ant', '1468'),
                            ('total', '7054')]),
               OrderedDict([('cve_ent', '08'),
                            ('entidad', 'CHIHUAHUA'),
                            ('viv_proc_m50', '3958'),
                            ('viv_proc_50_99', '3924'),
                            ('viv_term_rec', '2207'),
                            ('viv_term_ant', '6458'),
                            ('total', '16547')]),
               OrderedDict([('cve_ent', '09'),
                            ('entidad', 'CIUDAD DE MÉXICO'),
                            ('viv_proc_m50', '2553'),
                            ('viv_proc_50_99', '3020'),
                            ('viv_term_rec', '3233'),
                            ('viv_term_ant', '6328'),
                            ('total', '15134')]),
               OrderedDict([('cve_ent', '10'),
                            ('entidad', 'DURANGO'),
                            ('viv_proc_m50', '1945'),
                            ('viv_proc_50_99', '1116'),
                            ('viv_term_rec', '867'),
                            ('viv_term_ant', '1544'),
                            ('total', '5472')]),
               OrderedDict([('cve_ent', '11'),
                            ('entidad', 'GUANAJUATO'),
                            ('viv_proc_m50', '9196'),
                            ('viv_proc_50_99', '6031'),
                            ('viv_term_rec', '4589'),
                            ('viv_term_ant', '13576'),
                            ('total', '33392')]),
               OrderedDict([('cve_ent', '12'),
                            ('entidad', 'GUERRERO'),
                            ('viv_proc_m50', '1823'),
                            ('viv_proc_50_99', '1196'),
                            ('viv_term_rec', '2098'),
                            ('viv_term_ant', '1672'),
                            ('total', '6789')]),
               OrderedDict([('cve_ent', '13'),
                            ('entidad', 'HIDALGO'),
                            ('viv_proc_m50', '8279'),
                            ('viv_proc_50_99', '5085'),
                            ('viv_term_rec', '3844'),
                            ('viv_term_ant', '8248'),
                            ('total', '25456')]),
               OrderedDict([('cve_ent', '14'),
                            ('entidad', 'JALISCO'),
                            ('viv_proc_m50', '18151'),
                            ('viv_proc_50_99', '11949'),
                            ('viv_term_rec', '5629'),
                            ('viv_term_ant', '19173'),
                            ('total', '54902')]),
               OrderedDict([('cve_ent', '15'),
                            ('entidad', 'MÉXICO'),
                            ('viv_proc_m50', '13743'),
                            ('viv_proc_50_99', '8942'),
                            ('viv_term_rec', '5190'),
                            ('viv_term_ant', '12919'),
                            ('total', '40794')]),
               OrderedDict([('cve_ent', '16'),
                            ('entidad', 'MICHOACÁN DE OCAMPO'),
                            ('viv_proc_m50', '3317'),
                            ('viv_proc_50_99', '2710'),
                            ('viv_term_rec', '1530'),
                            ('viv_term_ant', '5973'),
                            ('total', '13530')]),
               OrderedDict([('cve_ent', '17'),
                            ('entidad', 'MORELOS'),
                            ('viv_proc_m50', '2224'),
                            ('viv_proc_50_99', '1582'),
                            ('viv_term_rec', '1480'),
                            ('viv_term_ant', '3748'),
                            ('total', '9034')]),
               OrderedDict([('cve_ent', '18'),
                            ('entidad', 'NAYARIT'),
                            ('viv_proc_m50', '1837'),
                            ('viv_proc_50_99', '935'),
                            ('viv_term_rec', '864'),
                            ('viv_term_ant', '2055'),
                            ('total', '5691')]),
               OrderedDict([('cve_ent', '19'),
                            ('entidad', 'NUEVO LEÓN'),
                            ('viv_proc_m50', '26889'),
                            ('viv_proc_50_99', '11263'),
                            ('viv_term_rec', '6961'),
                            ('viv_term_ant', '23737'),
                            ('total', '68850')]),
               OrderedDict([('cve_ent', '20'),
                            ('entidad', 'OAXACA'),
                            ('viv_proc_m50', '657'),
                            ('viv_proc_50_99', '1021'),
                            ('viv_term_rec', '357'),
                            ('viv_term_ant', '975'),
                            ('total', '3010')]),
               OrderedDict([('cve_ent', '21'),
                            ('entidad', 'PUEBLA'),
                            ('viv_proc_m50', '4141'),
                            ('viv_proc_50_99', '4989'),
                            ('viv_term_rec', '2231'),
                            ('viv_term_ant', '6851'),
                            ('total', '18212')]),
               OrderedDict([('cve_ent', '22'),
                            ('entidad', 'QUERÉTARO'),
                            ('viv_proc_m50', '5991'),
                            ('viv_proc_50_99', '4644'),
                            ('viv_term_rec', '5011'),
                            ('viv_term_ant', '11224'),
                            ('total', '26870')]),
               OrderedDict([('cve_ent', '23'),
                            ('entidad', 'QUINTANA ROO'),
                            ('viv_proc_m50', '10688'),
                            ('viv_proc_50_99', '7142'),
                            ('viv_term_rec', '4722'),
                            ('viv_term_ant', '13247'),
                            ('total', '35799')]),
               OrderedDict([('cve_ent', '24'),
                            ('entidad', 'SAN LUIS POTOSÍ'),
                            ('viv_proc_m50', '2383'),
                            ('viv_proc_50_99', '3668'),
                            ('viv_term_rec', '2053'),
                            ('viv_term_ant', '5781'),
                            ('total', '13885')]),
               OrderedDict([('cve_ent', '25'),
                            ('entidad', 'SINALOA'),
                            ('viv_proc_m50', '4567'),
                            ('viv_proc_50_99', '3170'),
                            ('viv_term_rec', '2733'),
                            ('viv_term_ant', '7770'),
                            ('total', '18240')]),
               OrderedDict([('cve_ent', '26'),
                            ('entidad', 'SONORA'),
                            ('viv_proc_m50', '5418'),
                            ('viv_proc_50_99', '3538'),
                            ('viv_term_rec', '2388'),
                            ('viv_term_ant', '5329'),
                            ('total', '16673')]),
               OrderedDict([('cve_ent', '27'),
                            ('entidad', 'TABASCO'),
                            ('viv_proc_m50', '947'),
                            ('viv_proc_50_99', '338'),
                            ('viv_term_rec', '235'),
                            ('viv_term_ant', '1439'),
                            ('total', '2959')]),
               OrderedDict([('cve_ent', '28'),
                            ('entidad', 'TAMAULIPAS'),
                            ('viv_proc_m50', '8050'),
                            ('viv_proc_50_99', '2381'),
                            ('viv_term_rec', '2652'),
                            ('viv_term_ant', '4418'),
                            ('total', '17501')]),
               OrderedDict([('cve_ent', '29'),
                            ('entidad', 'TLAXCALA'),
                            ('viv_proc_m50', '556'),
                            ('viv_proc_50_99', '603'),
                            ('viv_term_rec', '260'),
                            ('viv_term_ant', '637'),
                            ('total', '2056')]),
               OrderedDict([('cve_ent', '30'),
                            ('entidad', 'VERACRUZ DE IGNACIO DE LA LLAVE'),
                            ('viv_proc_m50', '5973'),
                            ('viv_proc_50_99', '4756'),
                            ('viv_term_rec', '3326'),
                            ('viv_term_ant', '8125'),
                            ('total', '22180')]),
               OrderedDict([('cve_ent', '31'),
                            ('entidad', 'YUCATÁN'),
                            ('viv_proc_m50', '4539'),
                            ('viv_proc_50_99', '2989'),
                            ('viv_term_rec', '2894'),
                            ('viv_term_ant', '4843'),
                            ('total', '15265')]),
               OrderedDict([('cve_ent', '32'),
                            ('entidad', 'ZACATECAS'),
                            ('viv_proc_m50', '1242'),
                            ('viv_proc_50_99', '559'),
                            ('viv_term_rec', '335'),
                            ('viv_term_ant', '870'),
                            ('total', '3006')])])])