Descripción general
Los datos de ubicación estándar pueden indicarte qué hay cerca, pero, a menudo, no responden la pregunta más importante: "¿Qué tan buena es esta zona para mí?". Las necesidades de tus usuarios son complejas. Una familia con niños pequeños tiene prioridades diferentes en comparación con un joven profesional con un perro. Para ayudarlos a tomar decisiones con confianza, debes proporcionar estadísticas que reflejen estas necesidades específicas. Una puntuación de ubicación personalizada es una herramienta eficaz para ofrecer este valor y crear una experiencia del usuario diferenciada y significativa.
En este documento, se describe cómo crear puntuaciones de ubicación personalizadas y multifacéticas con el conjunto de datos de Estadísticas de Lugares en BigQuery. Si transformas los datos de PDI en métricas significativas, puedes enriquecer tus aplicaciones de bienes raíces, venta minorista o viajes, y proporcionar a los usuarios la información pertinente que necesitan. También proporcionamos una opción para usar la IA generativa en BigQuery como una forma eficaz de calcular tus puntuaciones de ubicación.
Genera valor empresarial con las puntuaciones personalizadas
En los siguientes ejemplos, se ilustra cómo puedes traducir los datos de ubicación sin procesar en métricas potentes y centradas en el usuario para mejorar tu aplicación.
- Los desarrolladores inmobiliarios pueden crear una "Puntuación de aptitud para la familia" o una "Puntuación de sueño para los viajeros" para ayudar a los compradores y arrendatarios a elegir el vecindario perfecto que se adapte a su estilo de vida, lo que genera una mayor participación de los usuarios, clientes potenciales de mayor calidad y conversiones más rápidas.
- Los ingenieros de viajes y hotelería pueden crear una "Puntuación de vida nocturna" o una "Puntuación de paraíso para los turistas" para ayudar a los viajeros a elegir un hotel que coincida con su estilo de vacaciones, lo que aumenta las tasas de reserva y la satisfacción del cliente.
- Los analistas de comercio minorista pueden generar una "Puntuación de aptitud física y bienestar" para identificar la ubicación óptima de un gimnasio o una tienda de alimentos saludables nuevos en función de los negocios complementarios cercanos, lo que maximiza el potencial para segmentar los anuncios para el grupo demográfico de usuarios adecuado.
En esta guía, aprenderás una metodología flexible de tres partes para crear cualquier tipo de puntuación de ubicación personalizada con datos de Places directamente en BigQuery. Ilustraremos este patrón creando dos ejemplos de puntuación distintos: una puntuación de aptitud para la familia y una puntuación de paraíso para dueños de mascotas. Este enfoque te permite ir más allá de los recuentos de lugares y aprovechar los atributos detallados y enriquecidos del conjunto de datos de Places Insights. Puedes usar información como el horario de atención, si un lugar es adecuado para niños o si admite perros para crear métricas sofisticadas y significativas para tus usuarios.
Flujo de trabajo de la solución

En este instructivo, se usa una sola y potente consulta en SQL para crear una puntuación personalizada que puedes adaptar a cualquier caso de uso. Para ello, crearemos dos ejemplos de puntuación para un conjunto hipotético de fichas de departamentos.
Requisitos previos
Antes de comenzar, sigue estas instrucciones para configurar Places Insights.
1. Establece una base: tus ubicaciones de interés
Antes de crear las puntuaciones, necesitas una lista de las ubicaciones que deseas analizar. El primer paso es asegurarte de que estos datos existan como una tabla en BigQuery.
La clave es tener un identificador único para cada ubicación y una columna GEOGRAPHY que almacene sus coordenadas.
Puedes crear y propagar una tabla de ubicaciones para calificar con una consulta como esta:
CREATE OR REPLACE TABLE `your_project.your_dataset.apartment_listings`
(
id INT64,
name STRING,
location GEOGRAPHY
);
INSERT INTO `your_project.your_dataset.apartment_listings` VALUES
(1, 'The Downtowner', ST_GEOGPOINT(-74.0077, 40.7093)),
(2, 'Suburban Oasis', ST_GEOGPOINT(-73.9825, 40.7507)),
(3, 'Riverside Lofts', ST_GEOGPOINT(-73.9470, 40.8079))
-- More rows can be added here
. . . ;
Realizar un SELECT * en tus datos de ubicación se vería de manera similar a esto.

2. Desarrolla la lógica principal: la consulta de puntuación
Una vez que establezcas tus ubicaciones, el siguiente paso es encontrar, filtrar y contar los lugares cercanos que son relevantes para tu puntuación personalizada. Todo esto se realiza dentro de una sola instrucción SELECT.
Cómo encontrar lugares cercanos con una búsqueda geoespacial
Primero, debes encontrar todos los lugares del conjunto de datos de Places Insights que se encuentren a una distancia determinada de cada una de tus ubicaciones. La función ST_DWITHIN de BigQuery es perfecta para esto. Realizaremos una operación JOIN entre nuestra tabla apartment_listings y la tabla places_insights para encontrar todos los lugares dentro de un radio de 800 metros. Un LEFT JOIN garantiza que todas tus ubicaciones originales se incluyan en los resultados, incluso si no se encuentran lugares cercanos que coincidan.
Filtro por relevancia con atributos avanzados
Aquí es donde traduces el concepto abstracto de una puntuación en filtros de datos concretos. En el caso de nuestras dos puntuaciones de ejemplo, los criterios son diferentes:
- En el caso de la "Puntuación de aptitud para la familia", nos interesan los parques, los museos y los restaurantes que son explícitamente buenos para los niños.
- Para la "Puntuación de paraíso para dueños de mascotas", tenemos en cuenta los parques, las clínicas veterinarias, las tiendas de mascotas y cualquier restaurante o cafetería que permita el ingreso de perros.
Puedes filtrar por estos atributos específicos directamente en la cláusula WHERE de tu búsqueda.
Agrega las estadísticas de cada ubicación
Por último, debes contar cuántos lugares relevantes encontraste para cada departamento. La cláusula GROUP BY agrega los resultados, y la función COUNTIF cuenta los lugares que coinciden con los criterios específicos de cada una de nuestras puntuaciones.
La siguiente consulta combina estos tres pasos y calcula los recuentos sin procesar para ambas puntuaciones en una sola pasada:
-- This Common Table Expression (CTE) will hold the raw counts for each score component.
WITH insight_counts AS (
SELECT WITH AGGREGATION_THRESHOLD -- Correctly includes the mandatory aggregation threshold
apartments.id,
apartments.name,
COUNTIF(places.primary_type = 'park') AS park_count,
COUNTIF(places.primary_type = 'museum') AS museum_count,
COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count,
COUNTIF(places.primary_type IN ('veterinary_care', 'pet_store')) AS pet_service_count,
COUNTIF(places.allows_dogs = TRUE) AS dog_friendly_place_count
FROM
`your_project.your_dataset.apartment_listings` AS apartments
LEFT JOIN
`your-project.places_insights___us.places` AS places -- Corrected table name for the US dataset
ON ST_DWITHIN(apartments.location, places.point, 800) -- Find places within 800 meters
GROUP BY
apartments.id, apartments.name
)
SELECT * FROM insight_counts;
El resultado de esta consulta será similar al siguiente.

En la siguiente sección, profundizaremos en estos resultados.
3. Crea la puntuación
Ahora que tienes el recuento de lugares y la ponderación para cada tipo de lugar en cada ubicación, puedes generar la puntuación de ubicación personalizada. En esta sección, analizaremos dos opciones: usar tu propio cálculo personalizado en BigQuery o usar funciones de inteligencia artificial (IA) generativa en BigQuery.
Opción 1: Usa tu propio cálculo personalizado en BigQuery
Los recuentos sin procesar del paso anterior son útiles, pero el objetivo es obtener una sola puntuación fácil de usar. El paso final es combinar estos recuentos con pesos y, luego, normalizar el resultado en una escala de 0 a 10.
Cómo aplicar pesos personalizados: Elegir tus pesos es un arte y una ciencia. Deben reflejar las prioridades de tu empresa o lo que crees que es más importante para tus usuarios. Para una puntuación de "Apto para la familia", podrías decidir que un parque es el doble de importante que un museo. Comienza con tus mejores suposiciones y realiza iteraciones en función de los comentarios de los usuarios.
Normalización de la puntuación La siguiente consulta usa dos expresiones de tabla comunes (CTE): la primera calcula los recuentos sin procesar como antes, y la segunda calcula las puntuaciones ponderadas. Luego, la instrucción SELECT final realiza una normalización min-max en las puntuaciones ponderadas. Se genera la columna location de la tabla de ejemplo apartment_listings para habilitar la visualización de datos en un mapa.
WITH
-- CTE 1: Count nearby amenities of interest for each apartment listing.
insight_counts AS (
SELECT WITH AGGREGATION_THRESHOLD
apartments.id,
apartments.name,
COUNTIF(places.primary_type = 'park') AS park_count,
COUNTIF(places.primary_type = 'museum') AS museum_count,
COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count,
COUNTIF(places.primary_type IN ('veterinary_care', 'pet_store')) AS pet_service_count,
COUNTIF(places.allows_dogs = TRUE) AS dog_friendly_place_count
FROM
`your_project.your_dataset.apartment_listings` AS apartments
LEFT JOIN
`your-project.places_insights___us.places` AS places
ON ST_DWITHIN(apartments.location, places.point, 800)
GROUP BY
apartments.id,
apartments.name
),
-- CTE 2: Apply custom weighting to the amenity counts to generate raw scores.
raw_scores AS (
SELECT
id,
name,
(park_count * 3.0) + (museum_count * 1.5) + (family_restaurant_count * 2.5) AS family_friendliness_score,
(park_count * 2.0) + (pet_service_count * 3.5) + (dog_friendly_place_count * 2.5) AS pet_paradise_score
FROM
insight_counts
)
-- Final Step: Normalize scores to a 0-10 scale and rejoin to retrieve the location geometry.
SELECT
raw_scores.id,
raw_scores.name,
apartments.location,
raw_scores.family_friendliness_score,
raw_scores.pet_paradise_score,
-- Normalize Family Score using a MIN/MAX window function.
ROUND(
COALESCE(
SAFE_DIVIDE(
(raw_scores.family_friendliness_score - MIN(raw_scores.family_friendliness_score) OVER ()),
(MAX(raw_scores.family_friendliness_score) OVER () - MIN(raw_scores.family_friendliness_score) OVER ())
) * 10,
0
),
2
) AS normalized_family_score,
-- Normalize Pet Score using a MIN/MAX window function.
ROUND(
COALESCE(
SAFE_DIVIDE(
(raw_scores.pet_paradise_score - MIN(raw_scores.pet_paradise_score) OVER ()),
(MAX(raw_scores.pet_paradise_score) OVER () - MIN(raw_scores.pet_paradise_score) OVER ())
) * 10,
0
),
2
) AS normalized_pet_score
FROM
raw_scores
JOIN
`your_project.your_dataset.apartment_listings` AS apartments
ON raw_scores.id = apartments.id;
Los resultados de la búsqueda serán similares a los que se muestran a continuación. Las últimas dos columnas son las puntuaciones normalizadas.

Información sobre la puntuación normalizada
Es importante comprender por qué este paso final de normalización es tan valioso.
Las puntuaciones ponderadas sin procesar pueden variar de 0 a un número potencialmente muy grande, según la densidad urbana de tus ubicaciones. Una puntuación de 500 no tiene sentido para un usuario sin contexto.
La normalización transforma estos números abstractos en una clasificación relativa. Al ajustar los resultados en una escala del 0 al 10, la puntuación comunica claramente cómo se compara cada ubicación con las demás en tu conjunto de datos específico:
- Se asigna una puntuación de 10 a la ubicación con la puntuación sin procesar más alta, lo que la marca como la mejor opción en el conjunto actual.
- Se asigna una puntuación de 0 a la ubicación con la puntuación sin procesar más baja, lo que la convierte en el modelo de referencia para la comparación. Esto no significa que la ubicación no tenga servicios, sino que es la menos adecuada en comparación con las otras opciones que se evalúan.
- Todas las demás puntuaciones se encuentran proporcionalmente entre estos dos extremos, lo que les brinda a los usuarios una forma clara e intuitiva de comparar sus opciones de un vistazo.
Opción 2: Usa la función AI.GENERATE (Gemini)
Como alternativa a usar una fórmula matemática fija, puedes usar la función AI.GENERATE de BigQuery para calcular puntuaciones de ubicación personalizadas directamente en tu flujo de trabajo de SQL.
Si bien la opción 1 es excelente para la puntuación puramente cuantitativa basada en el recuento de servicios, no puede tener en cuenta fácilmente los datos cualitativos. La función AI.GENERATE te permite combinar los números de tu búsqueda de Places Insights con datos no estructurados, como la descripción de texto del anuncio de un departamento (p.ej., "Esta ubicación es adecuada para familias y la zona es tranquila por la noche") o preferencias específicas del perfil del usuario (p.ej., "Este usuario está reservando para una familia y prefiere una zona tranquila en una ubicación central"). Esto te permite generar una puntuación más matizada que detecta sutilezas que un recuento estricto podría pasar por alto, como una ubicación con una alta densidad de servicios, pero que también se describe como "demasiado ruidosa para los niños".
Cómo construir la instrucción
Para usar esta función, los resultados de la agregación (del paso 2) se formatean en una instrucción en lenguaje natural. Esto se puede hacer de forma dinámica en SQL concatenando columnas de datos con instrucciones para el modelo.
En la siguiente consulta, se combinan insight_counts con la descripción del texto del departamento para crear una instrucción para cada fila. También se define un perfil de usuario objetivo para guiar la puntuación.
Genera la puntuación con SQL
La siguiente consulta realiza toda la operación en BigQuery. El reglamento se caracteriza por los siguientes aspectos:
- Agrega los recuentos de lugares (como se describe en el paso 2).
- Construye una instrucción para cada ubicación.
- Llama a la función
AI.GENERATEpara analizar la instrucción con el modelo de Gemini. - Analiza el resultado en un formato estructurado listo para usar en tu aplicación.
WITH
-- CTE 1: Aggregate Place counts (Same as Step 2)
insight_counts AS (
SELECT WITH AGGREGATION_THRESHOLD
apartments.id,
apartments.name,
apartments.description, -- Assuming your table has a description column
COUNTIF(places.primary_type = 'park') AS park_count,
COUNTIF(places.primary_type = 'museum') AS museum_count,
COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count
FROM
`your-project.your_dataset.apartment_listings` AS apartments
LEFT JOIN
`your-project.places_insights___us.places` AS places
ON ST_DWITHIN(apartments.location, places.point, 800)
GROUP BY
apartments.id, apartments.name, apartments.description
),
-- CTE 2: Construct the Prompt
prepared_prompts AS (
SELECT
id,
name,
FORMAT("""
You are an expert real estate analyst. Generate a 'Family-Friendliness Score' (0-10) for this location.
Target User: Young family with a toddler, looking for a balance of activity and quiet.
Location Data:
- Name: %s
- Description: %s
- Parks nearby: %d
- Museums nearby: %d
- Family-friendly restaurants nearby: %d
Scoring Rules:
- High importance: Proximity to parks and high restaurant count.
- Negative modifiers: Descriptions indicating excessive noise or nightlife focus.
- Positive modifiers: Descriptions indicating quiet streets or backyards.
""", name, description, park_count, museum_count, family_restaurant_count) AS prompt_text
FROM insight_counts
)
-- Final Step: Call AI.GENERATE
SELECT
id,
name,
-- Access the structured fields returned by the model
generated.family_friendliness_score,
generated.reasoning
FROM
prepared_prompts,
AI.GENERATE(
prompt_text,
endpoint => 'gemini-flash-latest',
output_schema => 'family_friendliness_score FLOAT64, reasoning STRING'
) AS generated;
Comprende la configuración
- Conocimiento del costo: Esta función pasa tu entrada a un modelo de Gemini y genera cargos en Vertex AI cada vez que se llama. Si se analiza una gran cantidad de ubicaciones (p.ej., miles de fichas de apartamentos), se recomienda filtrar primero el conjunto de datos para incluir los candidatos más relevantes. Para obtener más detalles sobre cómo minimizar los costos, consulta las Prácticas recomendadas.
endpoint:gemini-flash-latestse especifica para este ejemplo con el objetivo de priorizar la velocidad y la eficiencia en cuanto a costos. Sin embargo, puedes elegir el modelo que mejor se adapte a tus necesidades. Consulta la documentación de los modelos de Gemini para experimentar con diferentes versiones (p.ej., Gemini Pro para tareas de razonamiento más complejas) y encuentra la mejor opción para tu caso de uso.output_schema: En lugar de analizar texto sin procesar, se aplica un esquema (FLOAT64para la puntuación ySTRINGpara el razonamiento). Esto garantiza que el resultado se pueda usar de inmediato en tus herramientas de visualización o aplicaciones sin necesidad de un procesamiento posterior.
Resultado de ejemplo
La consulta devuelve una tabla estándar de BigQuery con la puntuación personalizada y el razonamiento del modelo.
| id | nombre | family_friendliness_score | razonamiento |
|---|---|---|---|
| 1 | El Downtowner | 5.5 | Excelente cantidad de servicios (parques, restaurantes), que cumplen con las métricas cuantitativas. Sin embargo, los datos cualitativos indican que hay un exceso de ruido los fines de semana y un fuerte enfoque en la vida nocturna, lo que entra en conflicto directamente con la necesidad de tranquilidad del usuario objetivo. |
| 2 | Oasis suburbano | 9.8 | Los datos cuantitativos destacados se combinan con una descripción ("calle tranquila y arbolada") que se alinea perfectamente con el perfil de la familia objetivo. Los modificadores positivos altos generan una puntuación casi perfecta. |
Este procedimiento te permite ofrecer una puntuación altamente personalizada que se siente inteligible y adaptada a cada usuario individual, todo dentro de una sola consulta SQL.
4. Visualiza tus puntuaciones en un mapa
BigQuery Studio incluye una visualización de mapa integrada para cualquier resultado de consulta que contenga una columna GEOGRAPHY. Dado que nuestra consulta genera la columna location, puedes visualizar tus puntuaciones de inmediato.
Si haces clic en la pestaña Visualization, aparecerá el mapa, y el menú desplegable Data Column controla la puntuación de ubicación que se visualizará. En este ejemplo, el normalized_pet_score se visualiza desde el ejemplo de la opción 1. Ten en cuenta que, para este ejemplo, se agregaron más ubicaciones a la tabla apartment_listings.

La visualización de los datos revela de un vistazo las ubicaciones más adecuadas para la puntuación creada, con círculos verdes más oscuros que representan ubicaciones con un normalized_pet_score más alto, en este caso. Para obtener más opciones de visualización de los datos de Estadísticas de Lugares, consulta Visualiza los resultados de la búsqueda.
Conclusión
Ahora tienes una metodología potente y repetible para crear puntuaciones de ubicación detalladas. Comenzando con tus ubicaciones, creaste una sola consulta en SQL en BigQuery que encuentra lugares cercanos con ST_DWITHIN, los filtra por atributos avanzados como good_for_children y allows_dogs, y agrega los resultados con COUNTIF. Al aplicar pesos personalizados y normalizar el resultado, obtuviste una sola puntuación fácil de usar que proporciona estadísticas detalladas y prácticas. Puedes aplicar este patrón directamente para transformar los datos de ubicación sin procesar en una ventaja competitiva significativa.
Próximas acciones
Ahora es tu turno de crear. En este instructivo, se proporciona una plantilla. Puedes usar los datos enriquecidos disponibles en el esquema de Estadísticas de Lugares para crear las puntuaciones que sean más necesarias para tu caso de uso. Considera estos otros indicadores que podrías crear:
- "Puntuación de vida nocturna": Combina filtros para
primary_type(bar,night_club),price_levely horarios de apertura nocturnos para encontrar las áreas más vibrantes después del anochecer. - "Puntuación de fitness y bienestar": Cuenta los
gyms,parksyhealth_food_storescercanos, y filtra los restaurantes para aquellos que tenganserves_vegetarian_foody puntuar las ubicaciones para los usuarios que se preocupan por su salud. - "Puntuación de sueño del viajero": Encuentra ubicaciones con una alta densidad de lugares de
transit_stationyparkingcercanos para ayudar a los usuarios que valoran el acceso al transporte.
Colaboradores
Henrik Valve | Ingeniero de DevX