[[:airbnb|Efecto Airbnb]] > Recetas ====== Recetas y manuales ====== Esta página recoge diferentes recetas y scripts para facilitar el análisis en diferentes lenguages y herramientas. ===== Documentación tipo ===== Para documentar una pregunta que aún no esté en wiki hay que crear una nueva página y se puede copiar la estructura de documentación de la siguiente plantilla: [[:documentacion-tipo]] ===== Preguntas y manuales ===== Este es un listado de preguntas con sus manuales correspondientes para analizar y producir visualizaciones sobre datos de Airbnb que se han ido desarrollando en los diferentes talleres de Efecto Airbnb: * [[:como-se-concentra-la-oferta-por-barrios-de-airbnb|¿Cómo se concentra la oferta por barrios de Airbnb?]] Dificultad //ALTA//. Manual Completo. Resultados: sí. * [[:airbnb:pregunta:reparto-airbnb-propietarios|¿Cómo está repartida la propiedad de los pisos de Airbnb?]]. Dificultad //FÁCIL//. Manual: Completo. Resultados: sí. * [[:airbnb:pregunta:anuncios-legales-ilegales|¿Cuántos anuncios en Airbnb son "legales"? ¿Cuántos ilegales, no legales o alegales? ¿Cuál es la distribución de ambos tipos por barrios?]] Dificultad //ALTA//.Manual Completo. Resultados: sí. * [[:airbnb:pregunta:nube-palabras-anuncios|¿Cómo se anuncian los pisos? Un análisis de las palabras usadas]]. Dificultad MEDIA. Manual: Completo. Resultados: sí. * [[:cuales-son-las-variaciones-de-precios-por-plaza|Variaciones espaciales de precios por plaza]] Dificultad MEDIA-ALTA. Manual: Completo. Resultados: sí. * [[airbnb:pregunta:que-anuncios-estan-activos|¿Qué anuncios están activos?]]. Manual: en proceso. * [[airbnb:pregunta:infraestructura-hotelera-y-airbnb|¿Qué relación hay entre infraestructura hotelera tradicional y AirBnB?]] * [[airbnb:pregunta:analisis-vut-ordenanza-donostia|¿Cual es el estado de tramitación de las viviendas de uso turístico en San Sebastián - Donostia con la nueva ordenanza?]] Por completar: * [[airbnb:pregunta:tasa-de-ocupacion-airbnb|¿Cual es la tasa de ocupación de los anuncios de Airbnb en una ciudad?]] * [[airbnb:pregunta:eliminados|¿Cuántos y qué pisos se eliminan (dejan de estar publicados) de un mes a otro?]] * [[https://github.com/montera34/airbnbeuskadi/wiki/%C2%BFQu%C3%A9-cantidad-de-anuncios-Airbnb-son-pisos-completos%3F-%C2%BFCu%C3%A1ntos-son-habitaciones%3F|¿Qué cantidad de anuncios Airbnb son pisos completos? ¿Cuántos son habitaciones?]]. Dificultad FÁCIL. Manual No realizado. Resultados: sí. * [[https://github.com/montera34/airbnbeuskadi/wiki/%C2%BFQu%C3%A9-porcentaje-del-total-de-plazas-de-alojamiento-tur%C3%ADstico-no-est%C3%A1n-%22reguladas%22%3F-%C2%BFQu%C3%A9-cantidad-de-alojamientos-tur%C3%ADsticos-son-pisos-Airbnb%3F|¿Qué porcentaje del total de plazas de alojamiento turístico no están "reguladas"? ¿Qué cantidad de alojamientos turísticos son pisos Airbnb?]]. Dificultad ALTA. Manual No realizado. Resultados: en parte. * [[https://github.com/montera34/airbnbeuskadi/wiki/%C2%BFCu%C3%A1nta-actividad-hay-en-Airbnb-en-Donosti%3F-%C2%BFCu%C3%A1ntas-reservas-hay-en-Airbnb-durante-un-a%C3%B1o%3F-%C2%BFCu%C3%A1l-ha-sido-la-evoluci%C3%B3n-durante-los-10-%C3%BAltimos-a%C3%B1os%3F|¿Cuánta actividad hay en Airbnb en Donosti? ¿Cuántas reservas hay en Airbnb durante un año? ¿Cuál ha sido la evolución durante los 10 últimos años?]]. Dificultad MEDIA/ALTA. Manual No realizado. Resultados: no. * [[https://github.com/montera34/airbnbeuskadi/wiki/Comparativa-entre-capitales-vascas.-Comparativa-con-otras-ciudades-(Madrid,-Barcelona-y-Mallorca)|Comparativa entre capitales vascas. Comparativa con otras ciudades (Madrid, Barcelona y Mallorca)]]. Dificultad MEDIA. Manual No realizado. Resultados: en parte. * [[airbnb:pregunta:evolucion-poblacion-y-aumento-anuncios-airbnb|¿Existe una relación entre el aumento de apartamentos Airbnb y la evolución de la población en Madrid?]] ===== D3 ===== Cómo realizar un cartograma para representar dos variables: tamaño de las áreas en función del número de viviendas y color en función de ratio de número de anuncios de Airbnb por número de viviendas: * Código https://github.com/montera34/airbnb.efecto/blob/master/pamplona/cartograms/index.html * Visualización: https://lab.montera34.com/airbnb/pamplona/cartograms/index.html ===== R ===== Desde __Montera34__ hemos preparado 2 scripts de R para procesar los datos: * [[https://github.com/montera34/airbnbeuskadi/blob/master/prepare-segmented-files.R|prepare-segmented-files.R]] para **procesar los datos y generar archivos más manejables**. Genera archivos .csv y .tsv. Lo que hace este script es "partir" los datos de Airbnb en Euskadi en cómodos .tsv y csv por ciudades. También selecciona ciertas columnas para tener archivos más ligeros, de ahí el sufijo "_simple". * [[https://github.com/montera34/airbnb.madrid.analisis/blob/master/analisis/comparar-bases-datos.Rmd|Este script generado con Rmarkdown]] está pensado para **comparar dos bases de datos de Airbnb** y poder evaluar los métodos de scraping. [[airbnb:recetas:comparar-bases-datos|Más información sobre el script]]. * [[https://github.com/montera34/airbnbeuskadi/blob/master/analisis/montera34/airbnb-informe-ciudad.Rmd|airbnb-informe-ciudad.Rmd]] para **generar informes de las ciudades con múltiples gráficos**. El archivo tiene una variable que permite cambiar el nombre del municipio sobre la que se genera el informe. Genera artchivos .html con knitr. Los informes no están muy depurados (hay muchas gráficas no del todo útiles) y son mejorables, pero son una buena base de la que partir. Y sobre todo ¡se producen automatizadamente! * Donostia https://lab.montera34.com/airbnb/process/montera34/airbnb-informe-donostia.html * Bilbao https://lab.montera34.com/airbnb/process/montera34/airbnb-informe-bilbao.html * Vitoria https://lab.montera34.com/airbnb/process/montera34/airbnb-informe-vitoria.html * Zarautz https://lab.montera34.com/airbnb/process/montera34/airbnb-informe-zarautz.html Desde Terraferida [[https://github.com/montera34/airbnbeuskadi/tree/master/analisis/terraferida|han generado una serie de scripts de R]] para analizar datos de Airbnb y Homeaway. ===== Python ===== ==== Scraping: obtiene info a partir de listado de id de hosts en Airbnb ==== Un script para scrapear una lista de usuarios de Airbnb basado en sus id: import csv import urllib2 from bs4 import BeautifulSoup outputpath = "airbnbusers.csv" hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', # cambia idioma 'Accept-Language': 'es-ES,es;q=0.8' 'Connection': 'keep-alive'} with open(outputpath, "w") as outfile: writer = csv.writer(outfile) for counter in [102947901,3566146,54310958,143666717]: # cambia la lista de usuarios url = "https://www.airbnb.com/users/show/"+str(counter) print url # Get URL response = urllib2.Request(url, headers=hdr) pagedata = urllib2.urlopen(response) html = pagedata.read() # Get links soup = BeautifulSoup(html, "html.parser") # boxes = soup.select(".news-body") title = soup.select("h1")[0].get_text().encode('utf-8').strip() since = soup.select(".text-normal")[0].get_text().encode('utf-8').strip() review = soup.select("#reviews h2")[0].get_text().encode('utf-8').strip() review = review.translate(None, 'Reviews\n(').translate(None, ')') desc= soup.select("p")[0].get_text().encode('utf-8').strip() print counter print title print since print review print desc writer.writerow([counter,title,since,review,desc]) ==== Scraping: obtiene info a partir de listado de id de listings en Airbnb ==== import csv import urllib2 from bs4 import BeautifulSoup outputpath = "airbnblistings.csv" hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', #cambia idioma 'Accept-Language': 'es-ES,es;q=0.8' 'Connection': 'keep-alive'} count=0 with open(outputpath, "w") as outfile: writer = csv.writer(outfile) for counter in [23321245,20407971,12163858]: # incluye aquí la lista de id de listings completa count +=1 print count url = "https://www.airbnb.com/rooms/"+str(counter) print url try: print "try1" # Get URL response = urllib2.Request(url, headers=hdr) pagedata = urllib2.urlopen(response) html = pagedata.read() # Get links soup = BeautifulSoup(html, "html.parser") except: print "except1" try: print "try2" nreviews = soup.select("#reviews ._1vbkutid")[0].get_text().encode('utf-8').strip() nreviews = nreviews.translate(None, ' Reviews').encode('utf-8').strip() lastreview = soup.select("#reviews ._hylizj6")[0].get_text().encode('utf-8').strip() except: print "except2" print url print nreviews print lastreview writer.writerow([counter,nreviews,lastreview]) ===== SQL ===== ==== Cómo hacer una búsqueda con sustitución en una tabla ==== Esta receta es útil para solucionar errores de codificación de caracteres o unificar valores semejantes o equivalentes para hacer counts o estadísticas después (San Sebastian y Donostia por ejemplo). UPDATE table_name SET col_name = replace(col_name,'old_value','new_value') ==== Cómo incluir una columna de una tabla en otra ==== Esta operación se resuelve con una unión (join) de SQL entre dos tablas. Para ello hay que usar un valor que relacione los registros de ambas tablas. En el siguiente ejemplo vamos a unir las tablas table_1 y table_2, seleccionando las columnas col_1 y col_4 de la table_1 y la columna col_3 de la table_2. Las columnas de relación serán code de la table_1 e id de la table_2: SELECT table_1.col_1,table_1.col_4,table_2.col_3 FROM table_1, table_2 WHERE table_1.code = table_2.id También se puede hacer con el siguiente código con el que, a modo de ejemplo, se añade la población de cada barrio a una tabla de barrios que no la tiene: UPDATE table_1 SET poblacion = table_2.habitantes FROM table_2 WHERE table_1.barrio = table_2.barrio ===== CARTO ===== CARTO es un servicio web open source para crear mapas y visualizaciones. Utiliza SQL para hacer llamadas a los sets de datos. Para saber cómo interactuar con los datasets usando el editor SQL de CARTO se puede consultar el siguiente manual: [[https://carto.com/academy/courses/sql-postgis/]]