Ejercicio

El objetivo de este trabajo es comprobar si se está utilizando la plataforma Airbnb por parte de empresas, en lugar de particulares, para alquiler turístico en el centro de Madrid.

Conjunto de datos

Datos abiertos de Inside Airbnb: Fichero alojamientos Madrid detallado

Solución

Sin usar la librería Pandas

  1. Extraer del fichero de alojamientos una lista con todos los alojamientos, donde cada alojamiento sea un diccionario que contenga el identificador del alojamiento, el identificador del anfitrión, el distrito, el precio y las plazas.

In [46]:
from urllib import request
from urllib.error import URLError
# Leemos el fichero desde la url.
try:
    f = request.urlopen('http://aprendeconalf.es/python/trabajos/datos/madrid-airbnb-listings-small.csv')
    # El fichero no existe
except URLError:
    print('¡La url no existe!')
else:
    # Creamos una lista con las líneas del fichero.
    lineas = f.read().decode('utf-8').splitlines()
    # Extraemos los nombres de las columnas de la primera fila partiendo la cadena por el carácter de tabulación.
    columnas = lineas[0].split('\t')
    seleccion = ['id', 'host_id', 'neighbourhood_group_cleansed', 'accommodates', 'price']
    # Creamos un diccionario para traducir el nombre de las columnas
    traduccion = {'id':'id', 'host_id':'anfitrion', 'neighbourhood_group_cleansed':'distrito', 'accommodates':'plazas', 'price':'precio'}
    # Creamos la lista de alojamientos
    alojamientos = []
    # Recorremos las lineas del fichero desde la 1 hasta el final
    for linea in lineas[1:]:
        # Creamos el diccionario que contendrá la información del alojamiento.
        alojamiento = {}
        # Creamos una lista con los campo partiendo la línea por el carácter de tabulación.
        campos = linea.split('\t')
        # Recorremos los campos de la línea
        for i in range(len(columnas)):
            # Para cada campo añadimos al diccionario el par con clave el nombre de la columna y valor el campo de la posición i.
            if columnas[i] in seleccion:
                alojamiento[traduccion[columnas[i]]] = campos[i]
        # Añadimos el diccionario a la lista de alojamientos.
        alojamientos.append(alojamiento)

    print(alojamientos)


00'}, {'id': '1819060', 'anfitrion': '9525646', 'distrito': 'Arganzuela', 'plazas': '2', 'precio': '$50.00'}, {'id': '1825060', 'anfitrion': '9551147', 'distrito': 'Centro', 'plazas': '4', 'precio': '$49.00'}, {'id': '1826031', 'anfitrion': '3275902', 'distrito': 'Centro', 'plazas': '2', 'precio': '$85.00'}, {'id': '1829496', 'anfitrion': '9570589', 'distrito': 'Salamanca', 'plazas': '4', 'precio': '$90.00'}, {'id': '1830224', 'anfitrion': '5542111', 'distrito': 'Centro', 'plazas': '9', 'precio': '$135.00'}, {'id': '1835915', 'anfitrion': '9597850', 'distrito': 'Centro', 'plazas': '2', 'precio': '$45.00'}, {'id': '1845903', 'anfitrion': '9643400', 'distrito': 'Centro', 'plazas': '3', 'precio': '$80.00'}, {'id': '1846137', 'anfitrion': '9644407', 'distrito': 'Centro', 'plazas': '1', 'precio': '$20.00'}, {'id': '1846297', 'anfitrion': '2519411', 'distrito': 'Retiro', 'plazas': '2', 'precio': '$56.00'}, {'id': '1847117', 'anfitrion': '8108510', 'distrito': 'Retiro', 'plazas': '2', 'precio': '$39.00'}, {'id': '1854759', 'anfitrion': '1364024', 'distrito': 'Latina', 'plazas': '1', 'precio': '$31.00'}, {'id': '1858255', 'anfitrion': '9696587', 'distrito': 'Centro', 'plazas': '6', 'precio': '$139.00'}, {'id': '1859046', 'anfitrion': '9699624', 'distrito': 'Centro', 'plazas': '2', 'precio': '$35.00'}, {'id': '1859879', 'anfitrion': '9548677', 'distrito': 'Centro', 'plazas': '2', 'precio': '$76.00'}, {'id': '1864170', 'anfitrion': '534128', 'distrito': 'Centro', 'plazas': '4', 'precio': '$130.00'}, {'id': '1865189', 'anfitrion': '1172225', 'distrito': 'Chamberí', 'plazas': '2', 'precio': '$100.00'}, {'id': '1867724', 'anfitrion': '534128', 'distrito': 'Chamberí', 'plazas': '6', 'precio': '$185.00'}, {'id': '1867925', 'anfitrion': '534128', 'distrito': 'Chamberí', 'plazas': '6', 'precio': '$185.00'}, {'id': '1868042', 'anfitrion': '534128', 'distrito': 'Chamberí', 'plazas': '8', 'precio': '$194.00'}, {'id': '1868069', 'anfitrion': '534128', 'distrito': 'Chamberí', 'plazas': '8', 'precio': '$194.00'}, {'id': '1868170', 'anfitrion': '9738650', 'distrito': 'Centro', 'plazas': '4', 'precio': '$100.00'}, {'id': '1870392', 'anfitrion': '901218', 'distrito': 'Centro', 'plazas': '3', 'precio': '$38.00'}, {'id': '1870994', 'anfitrion': '8276432', 'distrito': 'Centro', 'plazas': '3', 'precio': '$58.00'}, {'id': '1880524', 'anfitrion': '9790541', 'distrito': 'Centro', 'plazas': '4', 'precio': '$85.00'}, {'id': '1882845', 'anfitrion': '9800520', 'distrito': 'Chamartín', 'plazas': '1', 'precio': '$25.00'}, {'id': '1888610', 'anfitrion': '8705535', 'distrito': 'Centro', 'plazas': '4', 'precio': '$55.00'}, {'id': '1890985', 'anfitrion': '5675916', 'distrito': 'Arganzuela', 'plazas': '2', 'precio': '$18.00'}, {'id': '1894143', 'anfitrion': '8724478', 'distrito': 'Chamberí', 'plazas': '2', 'precio': '$47.00'}, {'id': '1901306', 'anfitrion': '9872400', 'distrito': 'Centro', 'plazas': '2', 'precio': '$68.00'}, {'id': '1903841', 'anfitrion': '9531372', 'distrito': 'Moratalaz', 'plazas': '2', 'precio': '$68.00'}, {'id': '1910871', 'anfitrion': '1985408', 'distrito': 'Centro', 'plazas': '5', 'precio': '$204.00'}, {'id': '1913353', 'anfitrion': '82175', 'distrito': 'Centro', 'plazas': '5', 'precio': '$60.00'}, {'id': '1917537', 'anfitrion': '9940609', 'distrito': 'Centro', 'plazas': '2', 'precio': '$44.00'}, {'id': '1919606', 'anfitrion': '4068912', 'distrito': 'Centro', 'plazas': '4', 'precio': '$38.00'}, {'id': '1921468', 'anfitrion': '4068912', 'distrito': 'Centro', 'plazas': '4', 'precio': '$42.00'}, {'id': '1926546', 'anfitrion': '9278712', 'distrito': 'Centro', 'plazas': '4', 'precio': '$69.00'}, {'id': '1928731', 'anfitrion': '5149901', 'distrito': 'Centro', 'plazas': '2', 'precio': '$66.00'}, {'id': '1940231', 'anfitrion': '9594535', 'distrito': 'Retiro', 'plazas': '3', 'precio': '$40.00'}, {'id': '1942059', 'anfitrion': '1784424', 'distrito': 'Centro', 'plazas': '6', 'precio': '$105.00'}, {'id': '1947685', 'anfitrion': '2991670', 'distrito': 'Salamanca', 'plazas': '1', 'precio': '$19.00'}, {'id': '1947860', 'anfitrion': '498646', 'distrito': 'Puente de Vallecas', 'plazas': '1', 'precio': '$26.00'}, {'id': '1956372', 'anfitrion': '4068912', 'distrito': 'Centro', 'plazas': '5', 'precio': '$42.00'}, {'id': '1972094', 'anfitrion': '4068912', 'distrito': 'Centro', 'plazas': '4', 'precio': '$39.00'}, {'id': '1973442', 'anfitrion': '10189139', 'distrito': 'Centro', 'plazas': '1', 'precio': '$45.00'}, {'id': '1978094', 'anfitrion': '7489861', 'distrito': 'Centro', 'plazas': '4', 'precio': '$75.00'}, {'id': '1980372', 'anfitrion': '1732442', 'distrito': 'Centro', 'plazas': '11', 'precio': '$75.00'}, {'id': '1980833', 'anfitrion': '9250119', 'distrito': 'Centro', 'plazas': '3', 'precio': '$85.00'}, {'id': '1981286', 'anfitrion': '10215430', 'distrito': 'Centro', 'plazas': '2', 'precio': '$40.00'}, {'id': '1990801', 'anfitrion': '4190343', 'distrito': 'Centro', 'plazas': '6', 'precio': '$110.00'}, {'id': '1994074', 'anfitrion': '5542111', 'distrito': 'Centro', 'plazas': '6', 'precio': '$76.00'}, {'id': '1996086', 'anfitrion': '4618994', 'distrito': 'Centro', 'plazas': '2', 'precio': '$49.00'}, {'id': '2001012', 'anfitrion': '353738', 'distrito': 'Centro', 'plazas': '2', 'precio': '$63.00'}, {'id': '2013712', 'anfitrion': '3698116', 'distrito': 'Carabanchel', 'plazas': '1', 'precio': '$21.00'}, {'id': '2024446', 'anfitrion': '10402340', 'distrito': 'Centro', 'plazas': '4', 'precio': '$75.00'}, {'id': '2024643', 'anfitrion': '2444553', 'distrito': 'Centro', 'plazas': '4', 'precio': '$85.00'}, {'id': '2052361', 'anfitrion': '10516522', 'distrito': 'Centro', 'plazas': '3', 'precio': '$75.00'}, {'id': '2052383', 'anfitrion': '6979632', 'distrito': 'Ciudad Lineal', 'plazas': '4', 'precio': '$80.00'}, {'id': '2054398', 'anfitrion': '2750053', 'distrito': 'Tetuán', 'plazas': '3', 'precio': '$68.00'}, {'id': '2059873', 'anfitrion': '10544543', 'distrito': 'Chamberí', 'plazas': '2', 'precio': '$65.00'}, {'id': '2061480', 'anfitrion': '10550853', 'distrito': 'Centro', 'plazas': '4', 'precio': '$59.00'}, {'id': '2062465', 'anfitrion': '762655', 'distrito': 'Centro', 'plazas': '2', 'precio': '$75.00'}, {'id': '2065647', 'anfitrion': '3048290', 'distrito': 'Centro', 'plazas': '4', 'precio': '$85.00'}, {'id': '2070887', 'anfitrion': '8447678', 'distrito': 'Centro', 'plazas': '4', 'precio': '$90.00'}, {'id': '2079509', 'anfitrion': '3048290', 'distrito': 'Centro', 'plazas': '4', 'precio': '$85.00'}, {'id': '2081097', 'anfitrion': '6072314', 'distrito': 'Centro', 'plazas': '6', 'precio': '$50.00'}, {'id': '2085786', 'anfitrion': '10651006', 'distrito': 'Centro', 'plazas': '4', 'precio': '$68.00'}, {'id': '2086594', 'anfitrion': '4839888', 'distrito': 'Retiro', 'plazas': '8', 'precio': '$481.00'}, {'id': '2087574', 'anfitrion': '10654623', 'distrito': 'Centro', 'plazas': '2', 'precio': '$35.00'}, {'id': '2090059', 'anfitrion': '10668178', 'distrito': 'Arganzuela', 'plazas': '4', 'precio': '$80.00'}, {'id': '2091802', 'anfitrion': '4582755', 'distrito': 'Centro', 'plazas': '2', 'precio': '$34.00'}, {'id': '2093073', 'anfitrion': '6564220', 'distrito': 'Centro', 'plazas': '2', 'precio': '$65.00'}, {'id': '2093147', 'anfitrion': '4083688', 'distrito': 'Centro', 'plazas': '4', 'precio': '$59.00'}, {'id': '2095069', 'anfitrion': '4083688', 'distrito': 'Centro', 'plazas': '4', 'precio': '$59.00'}, {'id': '2095159', 'anfitrion': '4083688', 'distrito': 'Centro', 'plazas': '3', 'precio': '$55.00'}, {'id': '2096590', 'anfitrion': '3048290', 'distrito': 'Centro', 'plazas': '8', 'precio': '$95.00'}, {'id': '2099212', 'anfitrion': '10651006', 'distrito': 'Centro', 'plazas': '2', 'precio': '$59.00'}, {'id': '2099260', 'anfitrion': '10651006', 'distrito': 'Centro', 'plazas': '2', 'precio': '$55.00'}, {'id': '2099314', 'anfitrion': '10651006', 'distrito': 'Centro', 'plazas': '10', 'precio': '$99.00'}, {'id': '2100370', 'anfitrion': '3048290', 'distrito': 'Centro', 'plazas': '7', 'precio': '$95.00'}, {'id': '2113275', 'anfitrion': '7649063', 'distrito': 'Centro', 'plazas': '2', 'precio': '$57.00'}, {'id': '2114493', 'anfitrion': '2425848', 'distrito': 'Centro', 'plazas': '6', 'precio': '$199.00'}, {'id': '2116360', 'anfitrion': '1091014', 'distrito': 'Centro', 'plazas': '6', 'precio': '$375.00'}, {'id': '2117068', 'anfitrion': '353738', 'distrito': 'Chamberí', 'plazas': '2', 'precio': '$61.00'}, {'id': '2117115', 'anfitrion': '927713', 'distrito': 'Centro', 'plazas': '4', 'precio': '$65.00'}, {'id': '2129154', 'anfitrion': '4023064', 'distrito': 'Centro', 'plazas': '2', 'precio': '$61.00'}, {'id': '2129245', 'anfitrion': '10863262', 'distrito': 'Carabanchel', 'plazas': '1', 'precio': '$23.00'}, {'id': '2134070', 'anfitrion': '8879142', 'distrito': 'Tetuán', 'plazas': '2', 'precio': '$33.00'}, {'id': '2136159', 'anfitrion': '5542111', 'distrito': 'Centro', 'plazas': '5', 'precio': '$73.00'}, {'id': '2136172', 'anfitrion': '2541550', 'distrito': 'Centro', 'plazas': '9', 'precio': '$125.00'}, {'id': '2139191', 'anfitrion': '10916450', 'distrito': 'Centro', 'plazas': '6', 'precio': '$90.00'}, {'id': '2143824', 'anfitrion': '10940437', 'distrito': 'Centro', 'plazas': '10', 'precio': '$20.00'}, {'id': '2143867', 'anfitrion': '10942518', 'distrito': 'Usera', 'plazas': '2', 'precio': '$28.00'}, {'id': '2143961', 'anfitrion': '10940437', 'distrito': 'Centro', 'plazas': '6', 'precio': '$22.00'}, {'id': '2144000', 'anfitrion': '10940437', 'distrito': 'Centro', 'plazas': '8', 'precio': '$22.00'}, {'id': '2144017', 'anfitrion': '10940437', 'distrito': 'Centro', 'plazas': '8', 'precio': '$21.00'}, {'id': '2144404', 'anfitrion': '10942518', 'distrito': 'Usera', 'plazas': '3', 'precio': '$28.00'}, {'id': '2150416', 'anfitrion': '10974652', 'distrito': 'Centro', 'plazas': '5', 'precio': '$200.00'}, {'id': '2157675', 'anfitrion': '4599639', 'distrito': 'Retiro', 'plazas': '6', 'precio': '$110.00'}, {'id': '2162534', 'anfitrion': '2184051', 'distrito': 'Centro', 'plazas': '2', 'precio': '$50.00'}, {'id': '2179527', 'anfitrion': '11116174', 'distrito': 'Centro', 'plazas': '4', 'precio': '$60.00'}, {'id': '2181669', 'anfitrion': '427419', 'distrito': 'Tetuán', 'plazas': '3', 'precio': '$65.00'}, {'id': '2186049', 'anfitrion': '11146984', 'distrito': 'Hortaleza', 'plazas': '5', 'precio': '$100.00'}, {'id': '2188662', 'anfitrion': '2662680', 'distrito': 'Centro', 'plazas': '4', 'precio': '$135.00'}, {'id': '2190649', 'anfitrion': '11172003', 'distrito': 'Chamberí', 'plazas': '1', 'precio': '$45.00'}, {'id': '2190927', 'anfitrion': '11152132', 'distrito': 'Centro', 'plazas': '2', 'precio': '$70.00'}, {'id': '2192321', 'anfitrion': '11179787', 'distrito': 'Carabanchel', 'plazas': '6', 'precio': '$31.00'}, {'id': '2207960', 'anfitrion': '11262545', 'distrito': 'Arganzuela', 'plazas': '1', 'precio': '$45.00'}, {'id': '2222916', 'anfitrion': '11342272', 'distrito': 'Centro', 'plazas': '2', 'precio': '$30.00'}, {'id': '2224238', 'anfitrion': '11340614', 'distrito': 'Chamartín', 'plazas': '1', 'precio': '$40.00'}, {'id': '2234504', 'anfitrion': '11407661', 'distrito': 'Centro', 'plazas': '2', 'precio': '$49.00'}, {'id': '2235176', 'anfitrion': '1425071', 'distrito': 'Moncloa - Aravaca', 'plazas': '3', 'precio': '$80.00'}, {'id': '2247751', 'anfitrion': '11479457', 'distrito': 'Centro', 'plazas': '4', 'precio': '$120.00'}, {'id': '2254525', 'anfitrion': '11385250', 'distrito': 'Centro', 'plazas': '2', 'precio': '$35.00'}, {'id': '2259724', 'anfitrion': '5002446', 'distrito': 'Centro', 'plazas': '2', 'precio': '$79.00'}, {'id': '2259804', 'anfitrion': '7739367', 'distrito': 'Centro', 'plazas': '4', 'precio': '$65.00'}, {'id': '2265000', 'anfitrion': '7033920', 'distrito': 'Chamartín', 'plazas': '4', 'precio': '$95.00'}, {'id': '2269946', 'anfitrion': '2541550', 'distrito': 'Centro', 'plazas': '4', 'precio': '$67.00'}, {'id': '2281129', 'anfitrion': '11650026', 'distrito': 'Centro', 'plazas': '4', 'precio': '$70.00'}, {'id': '2289744', 'anfitrion': '5500409', 'distrito': 'Centro', 'plazas': '2', 'precio': '$65.00'}, {'id': '2299045', 'anfitrion': '1843216', 'distrito': 'Centro', 'plazas': '3', 'precio': '$69.00'}, {'id': '2301761', 'anfitrion': '11667662', 'distrito': 'Chamartín', 'plazas': '3', 'precio': '$49.00'}, {'id': '2302853', 'anfitrion': '762655', 'distrito': 'Centro', 'plazas': '2', 'precio': '$75.00'}, {'id': '2310368', 'anfitrion': '8584829', 'distrito': 'Chamartín', 'plazas': '2', 'precio': '$75.00'}, {'id': '2313370', 'anfitrion': '3447304', 'distrito': 'Centro', 'plazas': '2', 'precio': '$40.00'}, {'id': '2319136', 'anfitrion': '8515277', 'distrito': 'Retiro', 'plazas': '6', 'precio': '$137.00'}, {'id': '2325516', 'anfitrion': '10037966', 'distrito': 'Arganzuela', 'plazas': '3', 'precio': '$58.00'}, {'id': '2325805', 'anfitrion': '4615520', 'distrito': 'Centro', 'plazas': '2', 'precio': '$78.00'}, {'id': '2328281', 'anfitrion': '2561320', 'distrito': 'Centro', 'plazas': '6', 'precio': '$140.00'}, {'id': '2335410', 'anfitrion': '7331716', 'distrito': 'Centro', 'plazas': '3', 'precio': '$60.00'}, {'id': '2342966', 'anfitrion': '11964814', 'distrito': 'Ciudad Lineal', 'plazas': '1', 'precio': '$29.00'}, {'id': '2343687', 'anfitrion': '9805902', 'distrito': 'Centro', 'plazas': '4', 'precio': '$200.00'}, {'id': '2346257', 'anfitrion': '2933277', 'distrito': 'Centro', 'plazas': '3', 'precio': '$82.00'}, {'id': '2355344', 'anfitrion': '12027564', 'distrito': 'Centro', 'plazas': '2', 'precio': '$70.00'}, {'id': '2355580', 'anfitrion': '12028707', 'distrito': 'Centro', 'plazas': '5', 'precio': '$120.00'}, {'id': '2355635', 'anfitrion': '12028707', 'distrito': 'Centro', 'plazas': '6', 'precio': '$120.00'}, {'id': '2355655', 'anfitrion': '12028707', 'distrito': 'Centro', 'plazas': '10', 'precio': '$300.00'}, {'id': '2362731', 'anfitrion': '2536524', 'distrito': 'San Blas - Canillejas', 'plazas': '2', 'precio': '$25.00'}, {'id': '2364463', 'anfitrion': '12077356', 'distrito': 'Centro', 'plazas': '4', 'precio': '$50.00'}, {'id': '2369290', 'anfitrion': '12105600', 'distrito': 'Centro', 'plazas': '5', 'precio': '$55.00'}, {'id': '2375490', 'anfitrion': '757672', 'distrito': 'Centro', 'plazas': '4', 'precio': '$120.00'}, {'id': '2380554', 'anfitrion': '4967875', 'distrito': 'Retiro', 'plazas': '4', 'precio': '$94.00'}, {'id': '2387880', 'anfitrion': '12183135', 'distrito': 'Centro', 'plazas': '6', 'precio': '$100.00'}, {'id': '2393322', 'anfitrion': '5031865', 'distrito': 'Latina', 'plazas': '5', 'precio': '$70.00'}, {'id': '2397912', 'anfitrion': '12252321', 'distrito': 'Moncloa - Aravaca', 'plazas': '1', 'precio': '$27.00'}, {'id': '2416770', 'anfitrion': '4190343', 'distrito': 'Centro', 'plazas': '6', 'precio': '$75.00'}, {'id': '2417867', 'anfitrion': '8705535', 'distrito': 'Centro', 'plazas': '4', 'precio': '$62.00'}, {'id': '2441722', 'anfitrion': '12481365', 'distrito': 'Centro', 'plazas': '6', 'precio': '$85.00'}, {'id': '2451913', 'anfitrion': '378073', 'distrito': 'Centro', 'plazas': '6', 'precio': '$85.00'}, {'id': '2452815', 'anfitrion': '4975799', 'distrito': 'Centro', 'plazas': '4', 'precio': '$85.00'}, {'id': '2471370', 'anfitrion': '5542111', 'distrito': 'Centro', 'plazas': '4', 'precio': '$65.00'}, {'id': '2472459', 'anfitrion': '12641432', 'distrito': 'Centro', 'plazas': '4', 'precio': '$75.00'}, {'id': '2482267', 'anfitrion': '12698367', 'distrito': 'Moncloa - Aravaca', 'plazas': '3', 'precio': '$78.00'}, {'id': '2484622', 'anfitrion': '7038627', 'distrito': 'Centro', 'plazas': '2', 'precio': '$64.00'}, {'id': '2487986', 'anfitrion': '12202578', 'distrito': 'Arganzuela', 'plazas': '2', 'precio': '$30.00'}, {'id': '2488934', 'anfitrion': '11824804', 'distrito': 'Centro', 'plazas': '4', 'precio': '$85.00'}, {'id': '2493084', 'anfitrion': '5514970', 'distrito': 'Chamartín', 'plazas': '5', 'precio': '$175.00'}, {'id': '2500666', 'anfitrion': '10569881', 'distrito': 'Centro', 'plazas': '4', 'precio': '$110.00'}, {'id': '2500683', 'anfitrion': '12799099', 'distrito': 'Centro', 'plazas': '7', 'precio': '$84.00'}, {'id': '2503991', 'anfitrion': '12791313', 'distrito': 'Centro', 'plazas': '4', 'precio': '$100.00'}, {'id': '2519785', 'anfitrion': '12691164', 'distrito': 'Centro', 'plazas': '2', 'precio': '$45.00'}, {'id': '2520674', 'anfitrion': '12904592', 'distrito': 'Salamanca', 'plazas': '3', 'precio': '$90.00'}, {'id': '2520679', 'anfitrion': '12904592', 'distrito': 'Salamanca', 'plazas': '3', 'precio': '$90.00'}, {'id': '2527911', 'anfitrion': '1890653', 'distrito': 'Centro', 'plazas': '2', 'precio': '$58.00'}, {'id': '2551440', 'anfitrion': '605612', 'distrito': 'Centro', 'plazas': '1', 'precio': '$34.00'}, {'id': '2558321', 'anfitrion': '13097473', 'distrito': 'Centro', 'plazas': '3', 'precio': '$49.00'}, {'id': '2572249', 'anfitrion': '4677030', 'distrito': 'Moncloa - Aravaca', 'plazas': '4', 'precio': '$90.00'}, {'id': '2583917', 'anfitrion': '845407', 'distrito': 'Centro', 'plazas': '2', 'precio': '$400.00'}, {'id': '2586229', 'anfitrion': '6128492', 'distrito': 'Salamanca', 'plazas': '2', 'precio': '$50.00'}, {'id': '2587493', 'anfitrion': '4008643', 'distrito': 'Chamartín', 'plazas': '7', 'precio': '$125.00'}, {'id': '2587755', 'anfitrion': '13250761', 'distrito': 'Chamberí', 'plazas': '3', 'precio': '$200.00'}, {'id': '2588548', 'anfitrion': '13253937', 'distrito': 'Retiro', 'plazas': '6', 'precio': '$100.00'}, {'id': '2604787', 'anfitrion': '13340216', 'distrito': 'Centro', 'plazas': '5', 'precio': '$70.00'}, {'id': '2606926', 'anfitrion': '845407', 'distrito': 'Centro', 'plazas': '2', 'precio': '$110.00'}, {'id': '2622839', 'anfitrion': '9757922', 'distrito': 'Centro', 'plazas': '4', 'precio': '$80.00'}, {'id': '2624314', 'anfitrion': '13440901', 'distrito': 'Centro', 'plazas': '2', 'precio': '$100.00'}, {'id': '2630673', 'anfitrion': '13474925', 'distrito': 'Centro', 'plazas': '3', 'precio': '$50.00'}, {'id': '2630840', 'anfitrion': '2864064', 'distrito': 'Centro', 'plazas': '4', 'precio': '$61.00'}, {'id': '2635535', 'anfitrion': '13492658', 'distrito': 'Centro', 'plazas': '2', 'precio': '$24.00'}, {'id': '2638909', 'anfitrion': '13513088', 'distrito': 'Centro', 'plazas': '5', 'precio': '$80.00'}, {'id': '2641385', 'anfitrion': '13523635', 'distrito': 'Tetuán', 'plazas': '2', 'precio': '$100.00'}, {'id': '2644193', 'anfitrion': '13537715', 'distrito': 'Latina', 'plazas': '4', 'precio': '$70.00'}, {'id': '2650925', 'anfitrion': '13569734', 'distrito': 'Centro', 'plazas': '3', 'precio': '$109.00'}, {'id': '2652829', 'anfitrion': '13569734', 'distrito': 'Centro', 'plazas': '2', 'precio': '$109.00'}, {'id': '2654613', 'anfitrion': '13590063', 'distrito': 'Centro', 'plazas': '2', 'precio': '$30.00'}, {'id': '2658189', 'anfitrion': '1156753', 'distrito': 'Chamberí', 'plazas': '2', 'precio': '$65.00'}, {'id': '2658864', 'anfitrion': '4294898', 'distrito': 'Centro', 'plazas': '2', 'precio': '$46.00'}, {'id': '2673231', 'anfitrion': '13686767', 'distrito': 'Chamberí', 'plazas': '4', 'precio': '$60.00'}, {'id': '2673648', 'anfitrion': '13689103', 'distrito': 'Chamberí', 'plazas': '4', 'precio': '$65.00'}, {'id': '2676912', 'anfitrion': '3447304', 'distrito': 'Centro', 'plazas': '2', 'precio': '$40.00'}, {'id': '2682364', 'anfitrion': '13732037', 'distrito': 'Centro', 'plazas': '4', 'precio': '$75.00'}, {'id': '2684726', 'anfitrion': '13742566', 'distrito': 'Centro', 'plazas': '4', 'precio': '$60.00'}, {'id': '2684767', 'anfitrion': '13742566', 'distrito': 'Centro', 'plazas': '3', 'precio': '$67.00'}, {'id': '2686592', 'anfitrion': '13751801', 'distrito': 'Centro', 'plazas': '1', 'precio': '$21.00'}, {'id': '2701211', 'anfitrion': '1650712', 'distrito': 'Salamanca', 'plazas': '4', 'precio': '$165.00'}, {'id': '2704499', 'anfitrion': '13841663', 'distrito': 'Centro', 'plazas': '3', 'precio': '$85.00'}, {'id': '2706194', 'anfitrion': '1843216', 'distrito': 'Centro', 'plazas': '4', 'precio': '$69.00'}, {'id': '2707743', 'anfitrion': '5542111', 'distrito': 'Centro', 'plazas': '5', 'precio': '$67.00'}]
  1. Crear una función que reciba la lista de alojamientos y devuelva el número de alojamientos en cada distrito.

In [47]:
def alojamientos_distritos(alojamientos):
    '''
    Función que devuelve un diccionario con el número de alojamientos en cada distrito.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    
    Devuelve: Un diccionario con el número de alojamientos por distrito. 
    '''

    # Creamos el diccionario
    alojamiento_distritos = {}
    # Recorremos la lista de alojamientos
    for alojamiento in alojamientos:
        # Si el distrito ya aparece como clave del diccionario, incrementamos su valor en uno
        if alojamiento['distrito'] in alojamiento_distritos.keys():
            alojamiento_distritos[alojamiento['distrito']] += 1
        # Si el distrito no aparece como clave del diccionario, lo añadimos con valor 1.
        else:
            alojamiento_distritos[alojamiento['distrito']] = 1
    return alojamiento_distritos

# Ejemplo
print(alojamientos_distritos(alojamientos))


{'Chamartín': 22, 'Latina': 19, 'Centro': 618, 'Arganzuela': 44, 'Salamanca': 51, 'Tetuán': 19, 'Fuencarral - El Pardo': 5, 'Ciudad Lineal': 23, 'Chamberí': 69, 'Villaverde': 5, 'Hortaleza': 12, 'Moncloa - Aravaca': 18, 'Carabanchel': 14, 'Retiro': 35, 'San Blas - Canillejas': 14, 'Villa de Vallecas': 5, 'Barajas': 6, 'Usera': 5, 'Puente de Vallecas': 11, 'Moratalaz': 4, 'Vicálvaro': 1}
  1. Crear una función que reciba la lista de alojamientos y un número de ocupantes y devuelva la lista de alojamientos con un número de plazas mayor o igual que el número de ocupantes.

In [48]:
def filtrar_plazas(alojamientos, plazas):
    '''
    Función que devuelve una lista con los alojamientos que tienen un número de plazas mayor o igual que uno dado.

    Parámetros: 
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    Devuelve: Un diccionario con el número de alojamientos por distrito.
    - plazas: Es un entero con el número mínimo de plazas.

    Devuelve: Una lista con los alojamientos que tienen un número de plazas mayor o igual que plazas.
    '''

    return [alojamiento for alojamiento in alojamientos if int(alojamiento['plazas']) >= plazas]

# Ejemplo
filtro = filtrar_plazas(alojamientos, 10)
print(filtro)


[{'id': '256004', 'anfitrion': '1732442', 'distrito': 'Centro', 'plazas': '12', 'precio': '$80.00'}, {'id': '264054', 'anfitrion': '1370007', 'distrito': 'Centro', 'plazas': '12', 'precio': '$480.00'}, {'id': '536574', 'anfitrion': '447969', 'distrito': 'Arganzuela', 'plazas': '10', 'precio': '$70.00'}, {'id': '685152', 'anfitrion': '3494012', 'distrito': 'Hortaleza', 'plazas': '12', 'precio': '$155.00'}, {'id': '688795', 'anfitrion': '1732442', 'distrito': 'Centro', 'plazas': '10', 'precio': '$75.00'}, {'id': '745728', 'anfitrion': '3797913', 'distrito': 'Centro', 'plazas': '12', 'precio': '$250.00'}, {'id': '773861', 'anfitrion': '1732442', 'distrito': 'Centro', 'plazas': '12', 'precio': '$75.00'}, {'id': '834562', 'anfitrion': '4365768', 'distrito': 'Barajas', 'plazas': '10', 'precio': '$110.00'}, {'id': '970485', 'anfitrion': '5302455', 'distrito': 'Retiro', 'plazas': '16', 'precio': '$350.00'}, {'id': '1044902', 'anfitrion': '5751753', 'distrito': 'Moncloa - Aravaca', 'plazas': '16', 'precio': '$85.00'}, {'id': '1980372', 'anfitrion': '1732442', 'distrito': 'Centro', 'plazas': '11', 'precio': '$75.00'}, {'id': '2099314', 'anfitrion': '10651006', 'distrito': 'Centro', 'plazas': '10', 'precio': '$99.00'}, {'id': '2143824', 'anfitrion': '10940437', 'distrito': 'Centro', 'plazas': '10', 'precio': '$20.00'}, {'id': '2355655', 'anfitrion': '12028707', 'distrito': 'Centro', 'plazas': '10', 'precio': '$300.00'}]
  1. Crear una función que reciba la lista de alojamientos un distrito, y devuelva los 10 alojamientos más baratos del distrito.

In [49]:
def alojamientos_baratos(alojamientos, distrito, n):
    '''
    Función que devuelve una lista con los n alojamientos más baratos en un distrito dado.

    Parámetros: 
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    Devuelve: Un diccionario con el número de alojamientos por distrito.
    - distrito: Es una cadena con el nombre del distrito.
    - n: Es un entero con el número de alojamientos a devolver.

    Devuelve: Una lista con los n alojamientos más baratos del distrito dado.
    '''

    # Filtramos los alojamientos del distrito
    alojamientos_distrito = [alojamiento for alojamiento in alojamientos if alojamiento['distrito'] == distrito]
    # Definimos una función de ordenación con la clave para la ordenación
    def orden(dict): return float(dict['precio'][1:])
    # Ordenamos la lista de alojamientos con la función de ordenación
    ranking_alojamientos = sorted(alojamientos_distrito, key = orden)
    return ranking_alojamientos[:n]

# Ejemplo
top_arganzuela = alojamientos_baratos(alojamientos, 'Arganzuela', 10)
print(top_arganzuela)


[{'id': '1890985', 'anfitrion': '5675916', 'distrito': 'Arganzuela', 'plazas': '2', 'precio': '$18.00'}, {'id': '896291', 'anfitrion': '4778528', 'distrito': 'Arganzuela', 'plazas': '2', 'precio': '$19.00'}, {'id': '537234', 'anfitrion': '2638528', 'distrito': 'Arganzuela', 'plazas': '1', 'precio': '$22.00'}, {'id': '691344', 'anfitrion': '655088', 'distrito': 'Arganzuela', 'plazas': '1', 'precio': '$23.00'}, {'id': '375472', 'anfitrion': '1888816', 'distrito': 'Arganzuela', 'plazas': '2', 'precio': '$24.00'}, {'id': '748854', 'anfitrion': '1888816', 'distrito': 'Arganzuela', 'plazas': '1', 'precio': '$24.00'}, {'id': '883037', 'anfitrion': '4674072', 'distrito': 'Arganzuela', 'plazas': '1', 'precio': '$24.00'}, {'id': '26825', 'anfitrion': '114340', 'distrito': 'Arganzuela', 'plazas': '1', 'precio': '$25.00'}, {'id': '605697', 'anfitrion': '2999728', 'distrito': 'Arganzuela', 'plazas': '2', 'precio': '$25.00'}, {'id': '1592439', 'anfitrion': '4043145', 'distrito': 'Arganzuela', 'plazas': '1', 'precio': '$25.00'}]
  1. Crear una función que reciba la lista de alojamientos y devuelva un diccionario con los anfitriones y el número de alojamientos que posee cada uno.

In [50]:
def alojamientos_anfitriones(alojamientos):
    '''
    Función que devuelve un diccionario con el número de alojamientos de cada anfitrión.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    
    Devuelve: Un diccionario con el número de alojamientos por anfitrión. 
    '''

    # Creamos el diccionario
    alojamiento_anfitriones = {}
    # Recorremos la lista de alojamientos
    for alojamiento in alojamientos:
        # Si el anfitrión ya aparece como clave del diccionario, incrementamos su valor en uno
        if alojamiento['anfitrion'] in alojamiento_anfitriones.keys():
            alojamiento_anfitriones[alojamiento['anfitrion']] += 1
        # Si el anfitrión no aparece como clave del diccionario, lo añadimos con valor 1.
        else:
            alojamiento_anfitriones[alojamiento['anfitrion']] = 1
    return alojamiento_anfitriones

# Ejemplo
anfitriones = alojamientos_anfitriones(alojamientos)
print(anfitriones)


{'13660': 1, '83531': 2, '101471': 1, '101653': 1, '114340': 1, '130907': 3, '132883': 1, '288380': 1, '303845': 1, '353616': 1, '353738': 5, '364585': 2, '378073': 5, '391014': 1, '401552': 1, '368907': 2, '448981': 1, '259229': 1, '487095': 1, '495849': 1, '499977': 2, '510570': 1, '527760': 1, '5795235': 3, '533936': 1, '534128': 12, '534515': 1, '361930': 2, '564773': 1, '574498': 1, '557423': 1, '605612': 3, '606925': 2, '632589': 1, '650803': 1, '666482': 1, '723539': 1, '739627': 1, '740087': 5, '780107': 1, '796746': 1, '805726': 4, '814490': 3, '816497': 1, '845399': 4, '596469': 8, '850654': 2, '877571': 4, '927343': 3, '852616': 2, '967721': 1, '749212': 1, '75944': 1, '1004721': 1, '1008659': 1, '124972': 2, '1031664': 1, '669927': 1, '1090760': 1, '1732442': 5, '1168897': 1, '1174648': 1, '1172225': 2, '1130651': 2, '1212528': 1, '630482': 2, '1351231': 1, '1367452': 1, '1351865': 2, '1373873': 1, '1374415': 1, '1370007': 1, '1406073': 1, '1466005': 1, '1473247': 1, '1478367': 1, '1496188': 2, '901218': 6, '1522694': 2, '4677030': 3, '1596220': 1, '1598163': 1, '1095831': 4, '1636378': 1, '1650712': 3, '1702905': 1, '1716726': 1, '1713427': 1, '1713524': 2, '1714541': 5, '1714866': 1, '1721158': 1, '1722284': 1, '1721232': 1, '1694537': 1, '1703448': 2, '1738288': 1, '1738846': 1, '1751133': 2, '1791341': 2, '1729503': 1, '1836617': 1, '1868359': 1, '1888816': 2, '1892467': 1, '1895571': 1, '1902834': 1, '1981346': 1, '1408525': 15, '1893660': 1, '2024487': 1, '1973909': 1, '2044655': 4, '2056009': 1, '2068619': 1, '9934732': 1, '1719263': 2, '2107994': 1, '2111994': 2, '2124765': 1, '2134007': 1, '1450430': 1, '2146727': 1, '2160658': 1, '2184051': 3, '1280726': 1, '2201302': 1, '2230279': 1, '617086': 1, '2296476': 1, '2302267': 1, '2307294': 1, '2320165': 1, '2322563': 1, '2332600': 1, '2367126': 1, '2376101': 2, '2376402': 1, '2391244': 1, '2417075': 2, '2419064': 1, '2433045': 1, '2436735': 1, '2456671': 2, '2467212': 1, '2470700': 1, '2480913': 1, '1932547': 1, '2501740': 1, '2517520': 1, '2536524': 5, '2538187': 1, '1150912': 1, '2561320': 3, '2563986': 1, '2564339': 5, '1652272': 1, '2576044': 1, '2249249': 1, '1134989': 1, '2613319': 1, '2569497': 1, '2619962': 1, '2634967': 2, '447969': 1, '2638528': 1, '2659070': 1, '2661721': 1, '1284868': 1, '2680319': 1, '2709614': 1, '2673517': 1, '1091014': 4, '2702003': 1, '2659765': 1, '2713304': 1, '2727360': 1, '2740430': 1, '2747005': 3, '2779192': 1, '2785251': 2, '2795931': 1, '2347489': 1, '1689652': 1, '2312712': 1, '2847013': 2, '2847360': 1, '2857508': 1, '2864064': 5, '2566589': 1, '2902269': 1, '2267893': 1, '2913511': 2, '153391': 6, '2940355': 1, '2952250': 2, '2678039': 1, '1567773': 1, '2960080': 2, '2990747': 1, '2991670': 6, '2993477': 1, '2783896': 2, '2999728': 1, '2581715': 1, '3010452': 1, '3017315': 2, '2174652': 1, '3053021': 1, '3062041': 1, '2773350': 1, '3117754': 1, '3121587': 1, '3141727': 1, '3214130': 2, '3290138': 1, '3226403': 2, '3235676': 1, '3244793': 1, '3249358': 1, '1375487': 1, '3329487': 1, '3352121': 1, '3385307': 1, '3432379': 1, '3317937': 1, '3466426': 1, '3469687': 1, '9228673': 2, '3483233': 2, '3487329': 1, '1941314': 1, '3494012': 1, '3508577': 1, '3357259': 1, '655088': 2, '3540348': 2, '3544353': 1, '3021792': 1, '3569462': 1, '3571619': 1, '3534151': 1, '3606346': 3, '3477002': 1, '3540591': 2, '3648882': 1, '3654886': 1, '3654108': 1, '3689490': 1, '3691303': 1, '3698406': 1, '1954334': 1, '3724500': 1, '3726310': 1, '2555202': 1, '3746437': 1, '3759135': 1, '2172169': 1, '498646': 2, '1566057': 1, '3797913': 4, '3730591': 1, '3821608': 1, '3825783': 1, '3771869': 1, '2236658': 1, '1735664': 1, '3591751': 1, '1625657': 1, '3951702': 1, '3898452': 2, '216570': 1, '3438657': 1, '3960415': 1, '3961468': 1, '3983613': 2, '3998859': 1, '690223': 1, '4008643': 2, '2670977': 1, '4012290': 1, '4032439': 1, '4036376': 1, '4053105': 1, '2695144': 1, '4069734': 1, '2991925': 4, '4083688': 4, '4083766': 1, '4112877': 1, '4068975': 1, '4118311': 1, '4103866': 2, '4128029': 1, '4132185': 1, '4161237': 1, '4180632': 1, '4181071': 1, '4198169': 1, '4203067': 1, '4235741': 1, '4277536': 1, '4159117': 1, '4281126': 4, '4286142': 1, '4292037': 3, '4295642': 1, '4305310': 2, '1341870': 1, '4211443': 3, '4280501': 1, '2333408': 1, '4354906': 1, '4356259': 1, '4365768': 1, '4190662': 1, '4310374': 1, '4084426': 2, '4279976': 1, '3298293': 1, '4410687': 1, '2489796': 1, '4424170': 2, '4424222': 2, '1331093': 2, '4433597': 1, '4424070': 1, '3726732': 5, '4247556': 1, '584351': 1, '4502639': 1, '1714750': 2, '4522970': 1, '3631892': 1, '2668849': 1, '2419618': 1, '4312150': 1, '4582755': 2, '1221103': 1, '4504807': 1, '4603165': 1, '4628173': 1, '3917443': 1, '2646146': 4, '4674072': 1, '4677458': 1, '4684397': 1, '4697070': 1, '4710774': 1, '4665174': 1, '4735460': 7, '4739098': 1, '4740276': 1, '1467260': 1, '4762305': 1, '4777959': 1, '4778528': 1, '266650': 1, '4819459': 1, '4826927': 1, '4831338': 1, '4839888': 7, '4860266': 1, '4903694': 1, '4905854': 1, '4651429': 1, '1574604': 1, '4967875': 4, '4974280': 1, '4975799': 3, '4977367': 1, '5031865': 2, '5052379': 1, '5084073': 1, '5114074': 1, '1738341': 1, '5132742': 1, '4722486': 1, '1425071': 2, '5198285': 1, '5211661': 1, '2483139': 1, '1647109': 1, '5302455': 1, '6363695': 1, '5347216': 1, '5360317': 1, '5386601': 1, '5389129': 1, '4839698': 1, '3585435': 1, '5343904': 1, '5516172': 1, '5521269': 1, '5528551': 1, '5542111': 12, '5577429': 1, '4361819': 3, '5606144': 1, '5618733': 1, '5649948': 1, '5712665': 1, '5719307': 1, '5722524': 1, '5751753': 1, '5759904': 1, '5785483': 3, '5798033': 1, '5801580': 1, '5814460': 1, '571765': 1, '5824815': 1, '2214378': 1, '5735364': 1, '5869715': 1, '5876034': 1, '5896428': 1, '5918751': 1, '5918969': 1, '5935817': 1, '5950981': 1, '2228918': 1, '5941001': 1, '3612732': 1, '5997842': 1, '993166': 1, '6053704': 2, '6072314': 3, '6075016': 1, '6104199': 1, '6112385': 1, '6119221': 1, '6152491': 1, '6191568': 2, '6191686': 1, '5870563': 1, '1450378': 2, '641820': 1, '6241052': 1, '6270912': 1, '6284655': 1, '6282893': 2, '6319722': 1, '6284734': 1, '4599639': 6, '547389': 1, '1706029': 2, '6369472': 1, '6408401': 1, '6420689': 1, '6412103': 1, '6427023': 1, '6436336': 1, '6443996': 1, '6466920': 1, '6483080': 1, '6490189': 1, '4790263': 1, '3331390': 1, '4440463': 1, '6636854': 1, '6566447': 3, '6711092': 1, '6598518': 1, '6749419': 1, '6754321': 1, '6755278': 1, '6818751': 1, '6832983': 1, '6730063': 1, '6774354': 1, '2067969': 1, '6844474': 1, '6861593': 1, '4304796': 2, '6928584': 1, '2833018': 2, '4003806': 1, '6944433': 1, '6871745': 1, '142989': 1, '7049661': 1, '4190343': 3, '7062138': 1, '6774514': 1, '7117225': 1, '7122460': 1, '7149341': 1, '7153063': 1, '7170175': 1, '7201628': 1, '7218465': 2, '1470394': 2, '7223907': 1, '5919800': 1, '7033920': 2, '7249376': 1, '3105381': 1, '7302534': 1, '7306349': 1, '7394119': 1, '7375454': 1, '7395294': 1, '4147804': 1, '7420783': 1, '7489861': 2, '2741468': 1, '7552386': 1, '7595958': 1, '5633658': 1, '7448200': 1, '7751680': 1, '5500409': 2, '7820252': 1, '7823688': 2, '6019735': 1, '7828783': 1, '7850049': 1, '7652350': 1, '7943769': 1, '8099011': 1, '8125749': 1, '8130428': 1, '8158807': 1, '8192639': 1, '4229531': 1, '8231348': 1, '8345477': 1, '8385568': 1, '6816328': 1, '3275902': 2, '8449261': 1, '4043145': 1, '3908006': 1, '8508444': 1, '1666293': 1, '7874554': 1, '8532170': 1, '5790036': 1, '1973600': 1, '3514685': 1, '8578326': 1, '8577935': 1, '6271519': 1, '3519148': 1, '8607668': 1, '8631882': 1, '8647044': 3, '8664077': 1, '8705535': 4, '8719029': 1, '8724268': 1, '1766434': 1, '8242728': 1, '8789737': 2, '8807899': 1, '8814428': 1, '8608997': 1, '8624564': 1, '8879010': 1, '8879142': 2, '8901422': 1, '8933508': 1, '8983711': 1, '8986611': 1, '8996173': 1, '1216993': 1, '9042464': 1, '4023064': 3, '4231218': 2, '9137401': 1, '9145004': 1, '5537924': 1, '9172209': 1, '9210324': 1, '9222331': 1, '3488397': 1, '3150192': 1, '9243583': 1, '9244612': 1, '9277975': 1, '3661209': 1, '9290112': 1, '7129474': 1, '5883486': 1, '8622607': 1, '6915283': 1, '2444553': 2, '9525646': 1, '9551147': 1, '9570589': 1, '9597850': 1, '9643400': 1, '9644407': 1, '2519411': 1, '8108510': 1, '1364024': 1, '9696587': 1, '9699624': 1, '9548677': 1, '9738650': 1, '8276432': 1, '9790541': 1, '9800520': 1, '5675916': 1, '8724478': 1, '9872400': 1, '9531372': 1, '1985408': 1, '82175': 1, '9940609': 1, '4068912': 4, '9278712': 1, '5149901': 1, '9594535': 1, '1784424': 1, '10189139': 1, '9250119': 1, '10215430': 1, '4618994': 1, '3698116': 1, '10402340': 1, '10516522': 1, '6979632': 1, '2750053': 1, '10544543': 1, '10550853': 1, '762655': 2, '3048290': 4, '8447678': 1, '10651006': 4, '10654623': 1, '10668178': 1, '6564220': 1, '7649063': 1, '2425848': 1, '927713': 1, '10863262': 1, '2541550': 2, '10916450': 1, '10940437': 4, '10942518': 2, '10974652': 1, '11116174': 1, '427419': 1, '11146984': 1, '2662680': 1, '11172003': 1, '11152132': 1, '11179787': 1, '11262545': 1, '11342272': 1, '11340614': 1, '11407661': 1, '11479457': 1, '11385250': 1, '5002446': 1, '7739367': 1, '11650026': 1, '1843216': 2, '11667662': 1, '8584829': 1, '3447304': 2, '8515277': 1, '10037966': 1, '4615520': 1, '7331716': 1, '11964814': 1, '9805902': 1, '2933277': 1, '12027564': 1, '12028707': 3, '12077356': 1, '12105600': 1, '757672': 1, '12183135': 1, '12252321': 1, '12481365': 1, '12641432': 1, '12698367': 1, '7038627': 1, '12202578': 1, '11824804': 1, '5514970': 1, '10569881': 1, '12799099': 1, '12791313': 1, '12691164': 1, '12904592': 2, '1890653': 1, '13097473': 1, '845407': 2, '6128492': 1, '13250761': 1, '13253937': 1, '13340216': 1, '9757922': 1, '13440901': 1, '13474925': 1, '13492658': 1, '13513088': 1, '13523635': 1, '13537715': 1, '13569734': 2, '13590063': 1, '1156753': 1, '4294898': 1, '13686767': 1, '13689103': 1, '13732037': 1, '13742566': 2, '13751801': 1, '13841663': 1}

Usando la librería Pandas

  1. Preprocesar el fichero de alojamientos para crear un data frame con las variables id, host_id, listing_url, room_type, neighbourhood_group_cleansed, price, cleaning_fee, accommodates, minimum_nights, minimum_cost, review_scores_rating, latitude, longitude, is_location_exact. Eliminar del data frame cualquier fila incompleta. Añadir al data frame nuevas variables con el coste mínimo por noche y por persona (que incluya los gastos de limpieza).

In [51]:
import pandas as pd

# Creamos un DataFrame desde la url del fichero csv
try:
    alojamientos = pd.read_csv('../datos/madrid-airbnb-listings-small.csv', sep = '\t')
except URLError:
    print('La url no existe')
else:
    # Renombramos los nombres de las columnas que queremos
    alojamientos.rename(columns = {'host_id': 'anfitrion', 'listing_url': 'url', 'room_type':'tipo_alojamiento', 'neighbourhood_group_cleansed':'distrito', 'price':'precio', 'cleaning_fee':'gastos_limpieza', 'accommodates':'plazas', 'minimum_nights':'noches_minimas', 'review_scores_rating':'puntuacion'}, inplace = True)
    # Filtramos las columnas que quermos
    alojamientos = alojamientos[['id', 'anfitrion', 'url', 'tipo_alojamiento', 'distrito', 'precio', 'gastos_limpieza', 'plazas', 'noches_minimas', 'puntuacion']]
    # Eliminamos las filas con valores desconocidos
    alojamientos = alojamientos.dropna()
    # Eliminamos el carácter $ de las columnas del precio y gastos_limpieza y las convertimos a float
    alojamientos['precio'] = alojamientos.precio.str.replace(',','').str[1:].astype('float')
    alojamientos['gastos_limpieza'] = alojamientos.gastos_limpieza.str[1:].astype('float')
    # Creamos una nueva columna con el precio por persona multiplicando el precio diario por el número mínimo de noches, sumando los gastos de limpieza y finalmente dividiendo por el número mínimo de noches y el número de plazas.
    alojamientos['precio_persona'] = (alojamientos.precio * alojamientos.noches_minimas + alojamientos.gastos_limpieza) / (alojamientos.noches_minimas + alojamientos.plazas)
    
alojamientos


Out[51]:
id anfitrion url tipo_alojamiento distrito precio gastos_limpieza plazas noches_minimas puntuacion precio_persona
0 6369 13660 https://www.airbnb.com/rooms/6369 Private room Chamartín 70.0 5.0 2 1 98.0 25.000000
2 24805 101471 https://www.airbnb.com/rooms/24805 Entire home/apt Centro 80.0 30.0 3 5 100.0 53.750000
3 24836 101653 https://www.airbnb.com/rooms/24836 Entire home/apt Centro 115.0 0.0 4 3 98.0 49.285714
4 26825 114340 https://www.airbnb.com/rooms/26825 Private room Arganzuela 25.0 15.0 1 2 94.0 21.666667
9 62423 303845 https://www.airbnb.com/rooms/62423 Private room Centro 45.0 22.0 3 1 90.0 16.750000
... ... ... ... ... ... ... ... ... ... ... ...
995 2686592 13751801 https://www.airbnb.com/rooms/2686592 Private room Centro 21.0 10.0 1 20 83.0 20.476190
996 2701211 1650712 https://www.airbnb.com/rooms/2701211 Entire home/apt Salamanca 165.0 70.0 4 3 84.0 80.714286
997 2704499 13841663 https://www.airbnb.com/rooms/2704499 Entire home/apt Centro 85.0 20.0 3 2 100.0 38.000000
998 2706194 1843216 https://www.airbnb.com/rooms/2706194 Entire home/apt Centro 69.0 30.0 4 4 94.0 38.250000
999 2707743 5542111 https://www.airbnb.com/rooms/2707743 Entire home/apt Centro 67.0 39.0 5 1 86.0 17.666667

806 rows × 11 columns

  1. Crear una función que reciba una lista de distritos y devuelva un diccionario con los tipos de alojamiento en esos distritos y el porcentaje de alojamientos de ese tipo.

In [52]:
def tipos_alojamientos_distritos(alojamientos, distritos):
    '''
    Función que devuelve una serie con el porcentaje de tipos de alojamientos en una lista de distritos dada.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    - distritos: Es una lista con los nombres de los distritos. 
    
    Devuelve: Una serie con el porcentaje de tipos de alojamientos en los distritos dados.
    '''
    return alojamientos[alojamientos.distrito.isin(distritos)].tipo_alojamiento.value_counts(normalize = True) * 100

# Ejemplo
print(tipos_alojamientos_distritos(alojamientos, ['Arganzuela', 'Centro']))


Entire home/apt    80.427046
Private room       17.437722
Hotel room          1.423488
Shared room         0.711744
Name: tipo_alojamiento, dtype: float64
  1. Crear una función que reciba una lista de distritos y devuelva un diccionario con el número de alojamientos que cada anfitrión ofrece en esos distritos, ordenado de más a menos alojamientos.

In [53]:
def alojamientos_anfitriones_distritos(alojamientos, distritos):
    '''
    Función que devuelve una serie con el número de alojamientos de cada anfitrion en unos distritos dados, ordenada de mas a menos alojamientos.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    - distritos: Es una lista con los nombres de los distritos. 
    
    Devuelve: Una serie con el número de alojamientos de cada anfitrion en los distritos dados, ordenada de mas a menos alojamientos.
    '''
    return alojamientos[alojamientos.distrito.isin(distritos)].anfitrion.value_counts().sort_values(ascending = False)

# Ejemplo
print(alojamientos_anfitriones_distritos(alojamientos, ['Centro']))
print(alojamientos_anfitriones_distritos(alojamientos, ['Villaverde']))


1408525    13
5542111    12
153391      6
596469      6
901218      6
           ..
7331716     1
2456671     1
927713      1
5132742     1
4277536     1
Name: anfitrion, Length: 355, dtype: int64
3540348    2
666482     1
1703448    1
Name: anfitrion, dtype: int64
  1. Crear una función que devuelva un diccionario con el número medio de alojamientos por anfitrión de cada distrito.

In [54]:
def media_alojamientos_distritos(alojamientos):
    '''
    Función que devuelve una serie con el número medio de alojamientos por anfitrión de cada distrito.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    
    Devuelve: Una serie con el número medio de alojamientos por anfitrión de cada distrito.

    '''
    return alojamientos.groupby('distrito').anfitrion.value_counts().unstack(level = "distrito").mean()

# Ejemplo
print('Número medio de alojamientos por anfitrión en cada distrito')
print(media_alojamientos_distritos(alojamientos))


Número medio de alojamientos por anfitrión en cada distrito
distrito
Arganzuela               1.068966
Barajas                  1.000000
Carabanchel              1.142857
Centro                   1.495775
Chamartín                1.000000
Chamberí                 1.204545
Ciudad Lineal            1.272727
Fuencarral - El Pardo    1.000000
Hortaleza                1.125000
Latina                   1.076923
Moncloa - Aravaca        1.066667
Moratalaz                1.500000
Puente de Vallecas       1.200000
Retiro                   1.166667
Salamanca                1.240000
San Blas - Canillejas    1.571429
Tetuán                   1.214286
Usera                    1.500000
Vicálvaro                1.000000
Villa de Vallecas        1.000000
Villaverde               1.333333
dtype: float64
  1. Crear una función que reciba una lista de distritos y dibuje un diagrama de sectores con los porcentajes de tipos de alojamientos en esos distritos.

In [55]:
import matplotlib.pyplot as plt

def sectores_tipos_alojamientos(alojamientos, distritos):
    '''
    Función que dibuja un diagrama de sectores con los porcentajes de tipos de alojamientos en unos distritos dados.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    - distritos: Es una lista con los nombres de los distritos. 
    '''
    # Definimos la figura y los ejes del gráfico
    fig, ax = plt.subplots()
    # Filtramos los distritos de la lista de distritos dada, después contamos la frecuencias de los tipos de alojamientos y dibujamos el diagrama de sectores
    alojamientos[alojamientos.distrito.isin(distritos)].tipo_alojamiento.value_counts(normalize = True).plot(kind = 'pie',  autopct='%1.0f%%', ax = ax)
    # Ponermos el título
    ax.set_title('Distribución del porcentaje de tipos de alojamientos\n Distritos de ' + ', '.join(distritos), loc = "center", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})
    # Eliminamos la etiqueta del eje y
    ax.set_ylabel('')
    # Guardamos el gráfico.
    plt.show()
    return

#Ejemplo
sectores_tipos_alojamientos(alojamientos, ['Arganzuela', 'Centro'], )


  1. Crear una función que dibuje un diagrama de barras con el número de alojamientos por distritos.

In [56]:
def barras_alojamientos_distritos(alojamientos):
    '''
    Función que dibuja un diagrama de barras con el número de alojamientos por distritos.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    '''
    # Definimos la figura y los ejes del gráfico
    fig, ax = plt.subplots()
    # Contamos la frecuencias de alojamientos por distritos y dibujamos las barras.
    alojamientos.distrito.value_counts().plot(kind = 'bar')
    # Ponemos el título
    ax.set_title('Número de alojamientos por distrito', loc = "center", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})
    # Ponemos una rejilla
    ax.grid(axis = 'y', color = 'lightgray', linestyle = 'dashed')
    # Guardamos el gráfico.
    plt.show()
    return

# Ejemplo
barras_alojamientos_distritos(alojamientos)


  1. Crear una función que dibuje un diagrama de barras con los porcentajes acumulados de tipos de alojamientos por distritos.

In [57]:
def barras_tipos_alojamientos_distritos(alojamientos):
    '''
    Función que dibuja un diagrama de barras con los porcentajes acumulados de tipos de alojamientos por distritos.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    '''
    # Definimos la figura y los ejes del gráfico
    fig, ax = plt.subplots()
    # Agrupamos el DataFrame por distritos y contamos las frecuencias de los tipos de alojamiento. Después pivotamos el índice de los tipos de alojamientos para pasarlos a columnas y dibujamos las barras acumuladas.
    (alojamientos.groupby('distrito').tipo_alojamiento.value_counts(normalize = True)*100).unstack().plot(kind = 'bar', stacked = True, ax = ax)
    # Ponemos el título
    ax.set_title('Tipos de alojamiento por distrito (%)', loc = "center", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})
    # Eliminamos la etiqueta del eje x
    ax.set_xlabel('')
    # Ponemos una rejilla
    ax.grid(axis = 'y', color = 'lightgray', linestyle = 'dashed')
    # Reducimos el eje x un 30% para que quepa la leyenda
    box = ax.get_position()
    ax.set_position([box.x0, box.y0, box.width * 0.7, box.height])
    # Dibujar la leyenda fuera del área del gráfico
    plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))
    # Guardamos el gráfico.
    plt.show()
    return

# Ejemplo
barras_tipos_alojamientos_distritos(alojamientos)


  1. Crear una función reciba una lista de distritos y una lista de tipos de alojamientos, y dibuje un diagrama de sectores con la distribución del número de alojamientos de ese tipo por anfitrión en esos distritos.

In [58]:
def sectores_tipos_alojamientos_anfitrion(alojamientos, distritos, tipos):
    '''
    Función que dibuja un diagrama de sectores con la distribución del número de alojamientos por anfitrión de unos tipos y en unos distritos dados.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    - distritos: Es una lista con los nombres de los distritos. 
    - tipos: Es una lista con los nombres de los tipos de alojamientos.
    '''
    # Definimos la figura y los ejes del gráfico
    fig, ax = plt.subplots()
    # Filtramos los distritos y los tipos de alojamientos 
    alojamientos_filtrados = alojamientos[alojamientos.distrito.isin(distritos) & alojamientos.tipo_alojamiento.isin(tipos)]
    # Contamos la frecuencia de alojamientos por anfitrión y dibujamos el diagrama de sectores
    alojamientos_filtrados.anfitrion.value_counts(normalize = True).plot(kind = 'pie', ax = ax)
    # Ponermos el título
    ax.set_title('Distribución del número de alojamientos por anfitrión\nDistritos de ' + ', '.join(distritos) + '\nTipos de alojamiento' + ','.join(tipos), loc = "center", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})
    # Eliminamos la etiqueta del eje y
    ax.set_ylabel('')
    # Guardamos el gráfico.
    plt.show()
    return

# Ejemplo
sectores_tipos_alojamientos_anfitrion(alojamientos, ['Villaverde', 'Vicálvaro'], ['Entire home/apt', 'Hotel room'])


  1. Crear una función que dibuje un diagrama de barras con los precios medios por persona y día de cada distrito.

In [59]:
def barras_precios_medios_persona(alojamientos):
    '''
    Función que dibuja un diagrama de barras con los precios medios por persona y día de cada distrito.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    '''
    # Definimos la figura y los ejes del gráfico
    fig, ax = plt.subplots()
    # Agrupamos por distrito, calculamos la media de precio por persona y dibujamos las barras.
    alojamientos.groupby('distrito').precio_persona.mean().plot(kind = 'bar', ax = ax)
    # Ponemos el título
    ax.set_title('Precio medio por persona y noche', loc = "center", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})
    # Eliminamos la etiqueta del eje x
    ax.set_xlabel('')
    # Ponemos una rejilla
    ax.grid(axis = 'y', color = 'lightgray', linestyle = 'dashed')
    # Guardamos el gráfico.
    plt.show()
    return

# Ejemplo
barras_precios_medios_persona(alojamientos)


  1. Crear una función que reciba una lista de distritos y dibuje un gráfico de dispersión con el precio por por noche y persona y la puntuación en esos distritos.

In [60]:
def precios_puntuacion_distritos(alojamientos, distritos):
    '''
    Función que dibuja un diagrama de dispersión con el precio por noche y persona y la puntuación en unos distritos dados.

    Parámetros:
    - alojamientos: Es una lista de diccionarios, donde cada diccionario contiene los datos de un alojamiento.
    - distritos: Es una lista con los nombres de los distritos. 
    '''
    # Definimos la figura y los ejes del gráfico
    fig, ax = plt.subplots()
    # Filtramos los distritos
    alojamientos_filtrados = alojamientos[alojamientos.distrito.isin(distritos)]
    # Creamos una nueva columna con el precio por persona multiplicando el precio diario por el número mínimo de noches, sumando los gastos de limpieza y finalmente dividiendo por el número mínimo de noches y el número de plazas.
    alojamientos['precio_persona'] = (alojamientos.precio * alojamientos.noches_minimas + alojamientos.gastos_limpieza) / (alojamientos.noches_minimas + alojamientos.plazas)
    # Dibujamos el diagrama de sipersión
    ax.scatter(alojamientos['precio_persona'], alojamientos['puntuacion'])
    # Ponemos el título
    ax.set_title('Precios vs Puntuación\nDistritos de ' + ', '.join(distritos), loc = "center", fontdict = {'fontsize':14, 'fontweight':'bold', 'color':'tab:blue'})
    # Ponemos las etiquetas de los ejes
    ax.set_xlabel('Precio en €')
    ax.set_ylabel('Puntuación')
    # Guardamos el gráfico.
    plt.show()
    return

# Ejemplo
precios_puntuacion_distritos(alojamientos, ['Arganzuela', 'Centro'])



In [ ]: