Catastro de Navarra, información alfanumérica

Posted on by - 0 comments

Catastro es una fuente de información esencial a la hora de obtener información sobre las características de un activo, pero, y los activos que se encuentran en Navarra o País Vasco, como se puede obtener información de ellos. Estas dos comunidades al tener su respectivos catastros no se pueden consultar con la misma facilidad, por lo tanto aquí va una pequeña herramienta que espero que les ayude con los activos de estas dos comunidades autónomas.

En este caso nos centraremos en la información alfanumérica de Navarra, si lo ven útil se puede hacer algo parecido con las provincias de País Vasco, cada una de estas tiene su respectivo catastro.

Primero se debe de buscar la web en cuestión del catastro que se quiere consultar, cosa que no es fácil, y buscar la página donde se puede consultar la información que se busca, en este caso es:

https://catastro.navarra.es/descargas/

En esta se encuentra un buscador por municipio, lo cual a la hora de evaluar diferentes activos de varias localidades, es un trabajo arduo. Descargamos la información para un municipio en cuestión. Si nos fijamos cada fichero de descarga, se descarga utilizando el código del municipio en cuestión, podemos ver un ejemplo en el siguiente enlace :

https://catastro.navarra.es/descargas/municipios/265/08/alfanumerico.zip

Si indagamos un poco, el último código del último pueblo, en orden alfabético, es el 265, por tanto ya nos surge una idea de como automatizar la descarga, se podría hacer un bucle que vaya del 1 al 265 y que para cada código descargue el fichero en cuestión.

Una vez descargado, en este caso nos vamos a fijar en el fichero municipio, pero en el resto de ficheros podemos encontrar información sobre parcelas urbanas, referencias catastrales, parcelas rurales, ... Lo dicho si ven interesante uno de ellos en cuestión, se podrá realizar otro post sobre este, cualquier petición, ponedla en los comentarios.

Para el caso del código 132 y el fichero municipio, nos encontramos lo siguiente:

132IZAGAONDOA                    Izagaondoa

Que es esta información? Pues bien si nos vamos al fichero .doc que se encuentra dentro de los ficheros descargados, este te indica que para este fichero:

132 es el código del municipio.
AGAONDOA es el nombre en Español.
Izagaondoa es el nombre en Euskera.

Esta delimitación no se podría automatizar? Ya que siempre son las mismas delimitaciones.

Pues bien, en el siguiente script en python, se enseñara como hacer este proceso de forma automática.

import io
import os
import pandas as pd
import requests
import zipfile

# Partes de la url de descarga
url_1 = 'https://catastro.navarra.es/descargas/municipios/'
url_2='/08/alfanumerico.zip'

# Se ha comprobado que el número máximo para un múnicipio es 265, por lo tanto para se hace un bucle de 1 a 300
# por si hay alguno modificación en el futuro que no sea necesario revisar el script
for i in range(1,300):
    try:
        # Se descarga el .zip y se descomprime en la carpeta static/files
        url = url_1 + str(i).zfill(3)  + url_2
        file_name = './static/files/' + str(i).zfill(3) + '/'
        r = requests.get(url)
        # Solo se descangan aquellos que tengan un fichero para descargar
        if r.status_code == 200:
            print(url)
            z = zipfile.ZipFile(io.BytesIO(r.content))
            z.extractall(file_name)
    except:
        # Si no existe un múnicipio con ese número se continua con el siguiente
        continue

# Se establece la variable para guardar los datos
municipios_array = []

# Se buscan los ficheros que se quieren en el directorio
for path, subdirs, files in os.walk('./static/files/'):
    for name in files:
        # En este caso se quiere el fichero que indica el nombre del municipio y su código
        if 'municipios' in name:
            with open(os.path.join(path, name), encoding='cp1252') as sourcefile:
                for line in sourcefile:
                    # Se delimita el fichero, segun las instrucciones del fichero .doc
                    slices = [(0, 3), (3, 33), (33,len(line))]
                    data = [line[slice(*slc)] for slc in slices]
                    municipios_array.append(data)

# Se almacena en una tabla, donde esta se puede guardar en formato csv, xlsx, ...
municipios = pd.DataFrame(municipios_array, columns=['Codigo', 'Nombre Castellano', 'Nombre Euskera'])
municipios['Nombre Euskera'] = municipios['Nombre Euskera'].replace('\\n','', regex=True)

# Se imprime por pantalla el resultado
print(municipios)

La salida de este proceso es:

  Codigo               Nombre Castellano Nombre Euskera
0    077  CORELLA                               Corella
1    263  ZUBIETA                               Zubieta
2    052  BELASCOÁIN                         Belascoáin
3    045  BARASOAIN                           Barásoain
4    174  MORENTIN                             Morentin

Mucho más fácil de leer en este formato no?¿

Mapa con timeline en python

Posted on by - 0 comments

Por fin llego, el último post para terminar el mapa. En este último post es el que el usuario puede tomarlo como referencia y utilizar otras librerías para construir el mapa.

Empecemos!!!

Primero se tendrán que geolocalizar todos los municipios presentes en el fichero de transacciones, para este cometido, en mi caso, utilizo Mapbox, el cual dispone de una API, con 50.000 peticiones gratuitas, para este caso más que suficientes.

#Se transforma en dataframe
df_2 = pd.DataFrame(data=table_2, columns=['Localidad', 'Longitud', 'Latitud'])

#Como se cruzara por Localidad, se hace este campo como índice
df_2.set_index('Localidad', inplace=True)

#Se unen las tables de transacciones y de localización de los municipios
df_total = pd.merge(df, df_2, right_index=True, left_index=True)

#Se reemplaza los nulos por 0
df_total.fillna(0, inplace=True)

Una vez se han localizado las localidades, se utiliza la librería folium, para generar el mapa dinámico. Se puede encontrar información de esta librería en folium. Definida la librería que se quiere utilizar, se adaptan los datos para que la libería los pueda interpretar de forma correcta, y una vez realizado esto se genera el mapa en html.

#Se define un vector
df_map = []

#Se transfroman los datos para que la libreria folium los pueda interpretar ver enlace
#https://github.com/python-visualization/folium/blob/master/examples/HeatMapWithTime.ipynb
#Se dee de crear un vector con la localización, y las transccionesa cada periodo
for i in range(len(df_total.transpose()) - 2):
    df_row = []
    for j in range(len(df_total)):
        df_row.append([df_total.iloc[j][-1], df_total.iloc[j][-2], df_total.iloc[j][i]/100000])
    df_map.append(df_row)

#Se importa la librería folium
import folium
import folium.plugins as plugins

#Se inicializa el mapa
m = folium.Map([40., -3.], tiles='stamentoner', zoom_start=6)

#Se genera el mapa con los datos creados
hm = plugins.HeatMapWithTime(
    df_map,
    index=list(df_total.columns.values[:-2].astype(str)),
    auto_play=True,
    min_opacity=0.1,
    radius=5,
)
#Se guarda el mapa en un archivo html
hm.add_to(m)

m.save('trans.html')

Y con esto se tendría en mapa que hay expuesto en Mapa de transacciones

Muchas gracias!!!

Mapa de transacciones inmobiliarias, tratamiento de fichero

Posted on by - 0 comments

Continuando el post anterior, una vez que se tiene el fichero que se quiere tratar, lo primero que se hace es abrir este y analizar el formato en el que se encuentra.

En este caso los datos que se quieren obtener se encuentran en una misma hoja, lo cual simplifica el tratamiento. Por otra parte hay varias celdas combinadas (indicando los años), e imágenes, lo cual puede causar problemas a la hora de importar la hoja.

Es hora de empezar a fijarse en los detalles, que después nos ahorraran muchos cabreos.

  1. Nombre de la hoja, en este caso es "Total ", si, lleva un espacio al final del nombre, hay que tener cuidado con estos detalles.

  2. Numero de filas al principio del fichero que no son necesarias, en este caso vemos que el numero de os trimestres están en la fila 13, por tanto las 12 primeras filas las podemos saltar.

  3. Frecuencia de los datos, en este caso es trimestral.

  4. Si se analiza un poco la tablas, se podrá observar, que hay filas, donde en la columna B estan el nombre de la provincia o comunidad autónoma, pero no tiene datos, por tanto estas se deberán de eliminar.

Con esto se tienen todas las herramientas para convertir el fichero excel, en una tabla de datos, con la que poder trabajar de forma eficiente.

En primer lugar se lee el fichero excel.

#Se importa pandas
import pandas as pd

"""Se lee el fichero excel, pasando como parametros la ruta del fichero y el nombre de la hoja, "transacciones_numicipales.xls",sheet_name="Total " (cuidado con el espacio en el nombre de la hoja) como las primeras 11 filas no contienen datos, se obvian skiprows=12, y se toma como nombre de los campos la primera fila a partir de la 12 header=0"""

df = pd.read_excel("transacciones_municipales.xls",sheet_name="Total ",header=0, skiprows=12)

En segundo lugar se genera un indice con la columna B, aquella donde se encuentran los nombres de todos los municipios.

"""Se genera un íncide de la tabla con la segunda columna, esta esta nombrada como Unnamed: 1, ya que esta celda esta vacía y que el resultado reemplace a la variable existente inplace=True"""

df.set_index('Unnamed: 1', inplace=True)

En tercer lugar, para quitar registros incensarios y limpiar la tabla de datos, se eliminan columnas y filas vacías.

"""Se eliminan las columnas y filas vacias, se especifica que toda la fila este vacia how='all', y que el resultado reemplace a la variable existente inplace=True"""

df.dropna(axis=0, how='all',inplace=True)
df.dropna(axis=1, how='all',inplace=True)

Por último se renombran las columnas con las fechas correspondientes, ya que hasta este momento solo tenían el número de trimestre.

"""Se renombran las columnas, para ello se genera las fechas entre 31/03/2004 y 01/07/2018 (primer trimestre de 2004 
y segundo trimestre de 2018) que son el inicio y el final del fichero que se esta tratando, y la frecuencia con la que
se genera cada nuevo registro es cada 3 meses freq='3M'"""
df.columns = pd.date_range(start='3/31/2004', end='7/1/2018', freq='3M')

#Se imprime por pantalla el resultado
print(df)

Con esto ya se tienen los datos preparados para poder realizar el mapa.

Código completo.

#Se importan la librería pandas
import pandas as pd

"""Se lee el fichero excel, pasando como parametros la ruta del fichero y el nombre de la hoja,
"transacciones_numicipales.xls",sheet_name="Total " (cuidado con el espacio en el nombre de la hoja)
como las primeras 11 filas no contienen datos, se obvian skiprows=12, y se toma como nombre de
los campos la primera fila a partir de la 12 header=0"""
df = pd.read_excel("transacciones_numicipales.xls",sheet_name="Total ",header=0, skiprows=12)

"""Se genera un íncide de la tabla con la segunda columna, esta esta nombrada como Unnamed: 1, 
ya que esta celda esta vacía y que el resultado reemplace a la variable existente inplace=True"""
df.set_index('Unnamed: 1', inplace=True)

"""Se eliminan las columnas y filas vacias, se especifica que toda la fila este vacia how='all', y que el resultado
reemplace a la variable existente inplace=True"""
df.dropna(axis=0, how='all',inplace=True)
df.dropna(axis=1, how='all',inplace=True)

"""Se renombran las columnas, para ello se genera las fechas entre 31/03/2004 y 01/07/2018 (primer trimestre de 2004 
y segundo trimestre de 2018) que son el inicio y el final del fichero que se esta tratando, y la frecuencia con la que
se genera cada nuevo registro es cada 3 meses freq='3M'"""
df.columns = pd.date_range(start='3/31/2004', end='7/1/2018', freq='3M')

#Se imprime por pantalla el resultado
print(df)

Construyendo un mapa con las transacciones inmobiliarias hasta la actualidad

Posted on by - 0 comments

Este es el primero de una serie de post donde se enseña a construir un mapa de calor con las transacciones inmobiliarias hasta la actualidad.

En este primer post, se descargaran los datos que se visualizaran en el mapa, estos datos son las transacciones inmobiliarias municipales. Esta información se obtiene del ministerio de fomento.

Transacciones inmobiliarias

En particular se construirá el mapa con los datos municipales.

La finalidad de este post, es que el mapa se puede actualizar de forma automática, por tanto ahora comienza la diversión!!!

En la web Transacciones inmobiliarias se hará click-derecho sobre el punto 2, transacciones inmobiliarias por municipios, aparecerá un desplegable, en este se debe de seleccionar la opción inspeccionar. Aparecerá una nueva ventana en la parte derecha del buscador y donde una parte del c??digo aparece en azul, esa es la parte que nos interesa!!! Haz click-derecho en

""sedal/34010210.XLS""

y aparecerá la opción de copiar link, seleccionaremos esta. Para comprobar que esta es el archivo que se quiere descargar, se abre una nueva pestaña en el buscador y se pega el link, en ese momento se descargara un archivo excel, este es el archivo que se utilizara para construir el mapa.

A continuación se monstrara el código en python3 para la descarga automática de este fichero, para el cual se utilizara la librería request.

# Se importa request
 import requests


#Se define la url
transacciones = ""http://www.fomento.gob.es/be2/sedal/34010210.XLS""

#Se hace la petición para descargar el fichero excel
resp = requests.get(transacciones)

#Se crea el archivo en el que se va a descarga la información que se ha 
 descargado
output = open('transacciones_municipales.xls', 'wb')

#Se escribe la información descargada en el fichero creado
output.write(resp.content)

#Se cierra el fichero
output.close()

Aparecerá el fichero que se ha descargado en la desde donde se ha ejecutado el script.

Y esto se da por concluido el primer post de esta serie para la construcción de un mapa.