Panoramica
I dati sulla posizione standard possono dirti cosa c'è nelle vicinanze, ma spesso non riescono a rispondere alla domanda più importante: "Quanto è adatta questa zona a me?" Le esigenze dei tuoi utenti sono sfumate. Una famiglia con bambini piccoli ha priorità diverse rispetto a un giovane professionista con un cane. Per aiutarli a prendere decisioni consapevoli, devi fornire approfondimenti che riflettano queste esigenze specifiche. Un punteggio posizione personalizzato è uno strumento efficace per offrire questo valore e creare un'esperienza utente differenziata significativa.
Questo documento descrive come creare punteggi di località personalizzati e sfaccettati utilizzando il set di dati Places Insights in BigQuery. Trasformando i dati dei PDI in metriche significative, puoi arricchire le tue applicazioni immobiliari, di vendita al dettaglio o di viaggi e fornire ai tuoi utenti le informazioni pertinenti di cui hanno bisogno. Forniamo anche un'opzione per utilizzare l'AI generativa in BigQuery come modo efficace per calcolare i punteggi di località.
Aumentare il valore aziendale con i punteggi personalizzati
I seguenti esempi illustrano come tradurre i dati sulla posizione non elaborati nelle potenti metriche incentrate sull'utente per migliorare l'applicazione.
- Gli sviluppatori immobiliari possono creare un "Punteggio di idoneità per le famiglie" o un "Punteggio ideale per i pendolari" per aiutare acquirenti e affittuari a scegliere il quartiere perfetto per il loro stile di vita, con conseguente aumento del coinvolgimento degli utenti, lead di qualità superiore e conversioni più rapide.
- Gli ingegneri del settore viaggi e ospitalità possono creare un "Punteggio vita notturna" o un "Punteggio paradiso per i turisti" per aiutare i viaggiatori a scegliere un hotel che corrisponda al loro stile di vacanza, aumentando i tassi di prenotazione e la soddisfazione dei clienti
- Gli analisti del settore della vendita al dettaglio possono generare un "punteggio di fitness e benessere" per identificare la posizione ottimale per una nuova palestra o un nuovo negozio di alimenti biologici in base alle attività complementari nelle vicinanze, massimizzando il potenziale di targeting del giusto segmento demografico di utenti.
In questa guida imparerai una metodologia flessibile in tre parti per creare qualsiasi tipo di punteggio di località personalizzato utilizzando i dati di Places direttamente in BigQuery. Illustreremo questo pattern creando due punteggi di esempio distinti: un punteggio di idoneità per le famiglie e un punteggio di paradiso per i proprietari di animali domestici. Questo approccio ti consente di andare oltre i conteggi dei luoghi e sfruttare gli attributi ricchi e dettagliati all'interno del set di dati Places Insights. Puoi utilizzare informazioni come l'orario di apertura, se un luogo è adatto ai bambini o se ammette i cani, per creare metriche sofisticate e significative per i tuoi utenti.
Flusso di lavoro della soluzione

Questo tutorial utilizza una singola e potente query SQL per creare un punteggio personalizzato che puoi adattare a qualsiasi caso d'uso. Esamineremo questo processo creando i due punteggi di esempio per un insieme ipotetico di annunci di appartamenti.
Prerequisiti
Prima di iniziare, segui queste istruzioni per configurare Places Insights.
1. Crea una base: le tue località di interesse
Prima di poter creare i punteggi, devi avere un elenco delle sedi che vuoi analizzare. Il primo passaggio consiste nell'assicurarsi che questi dati esistano come tabella in BigQuery.
La chiave è avere un identificatore univoco per ogni posizione e una colonna GEOGRAPHY
che memorizzi le relative coordinate.
Puoi creare e compilare una tabella di località da valutare con una query come questa:
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
. . . ;
L'esecuzione di un SELECT * sui dati sulla posizione sarebbe simile a questa.

2. Sviluppa la logica principale: la query di assegnazione del punteggio
Una volta stabilite le località, il passaggio successivo consiste nel trovare, filtrare e conteggiare i luoghi nelle vicinanze pertinenti al tuo punteggio personalizzato. Il tutto viene eseguito in una
singola istruzione SELECT.
Trovare cosa c'è nelle vicinanze con una ricerca geospaziale
Per prima cosa, devi trovare tutti i luoghi del set di dati Places Insights che si trovano
a una determinata distanza da ciascuna delle tue sedi. La funzione BigQuery
ST_DWITHIN è perfetta per questo. Eseguiremo un JOIN tra la nostra
tabella apartment_listings e la tabella places_insights per trovare tutti i luoghi
entro un raggio di 800 metri. Un LEFT JOIN garantisce che tutte le tue posizioni originali
siano incluse nei risultati, anche se non vengono trovati luoghi corrispondenti
nelle vicinanze.
Filtrare per pertinenza con gli attributi avanzati
È qui che traduci il concetto astratto di un punteggio in filtri di dati concreti. Per i nostri due punteggi di esempio, i criteri sono diversi:
- Per il "Punteggio di idoneità per le famiglie", ci interessano parchi, musei e ristoranti esplicitamente adatti ai bambini.
- Per il "Punteggio paradiso per i proprietari di animali domestici", prendiamo in considerazione parchi, cliniche veterinarie, negozi per animali e qualsiasi ristorante o bar che accetta cani.
Puoi filtrare questi attributi specifici direttamente nella clausola WHERE della query.
Aggregare gli approfondimenti per ogni località
Infine, devi contare quanti luoghi pertinenti hai trovato per ogni
appartamento. La clausola GROUP BY aggrega i risultati e la funzione COUNTIF
conta i luoghi che corrispondono ai criteri specifici per ciascuno dei nostri punteggi.
La query seguente combina questi tre passaggi, calcolando i conteggi non elaborati per entrambi i punteggi in un unico passaggio:
-- 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;
Il risultato di questa query sarà simile a questo.

Approfondiremo questi risultati nella sezione successiva.
3. Creare il punteggio
Ora che hai il conteggio dei luoghi e la ponderazione per ogni tipo di luogo per ogni località, puoi generare il punteggio personalizzato della località. In questa sezione esamineremo due opzioni: utilizzare il tuo calcolo personalizzato in BigQuery o utilizzare le funzioni di intelligenza artificiale (AI) generativa in BigQuery.
Opzione 1: utilizza il tuo calcolo personalizzato in BigQuery
I conteggi non elaborati del passaggio precedente sono utili, ma l'obiettivo è ottenere un unico punteggio facile da usare. Il passaggio finale consiste nel combinare questi conteggi utilizzando i pesi e quindi normalizzare il risultato su una scala da 0 a 10.
Applicare ponderazioni personalizzate: la scelta delle ponderazioni è sia un'arte che una scienza. Devono riflettere le priorità della tua attività o ciò che ritieni sia più importante per i tuoi utenti. Per un punteggio di "Idoneità per le famiglie", potresti decidere che un parco è due volte più importante di un museo. Inizia con le tue migliori ipotesi e itera in base al feedback degli utenti.
Normalizzazione del punteggio La query riportata di seguito utilizza due espressioni di tabella comune (CTE): la prima calcola i conteggi non elaborati come in precedenza, mentre la seconda calcola i punteggi ponderati. L'istruzione SELECT finale esegue quindi una normalizzazione min-max
sui punteggi ponderati. Viene restituita la colonna location della tabella
apartment_listings di esempio per consentire la visualizzazione dei dati su una mappa.
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;
I risultati della query saranno simili a quelli riportati di seguito. Le ultime due colonne sono i punteggi normalizzati.

Informazioni sul punteggio normalizzato
È importante capire perché questo passaggio finale di normalizzazione è così prezioso.
I punteggi ponderati non elaborati possono variare da 0 a un numero potenzialmente molto elevato
a seconda della densità urbana delle tue località. Un punteggio di 500 non ha significato per un utente senza contesto.
La normalizzazione trasforma questi numeri astratti in una classificazione relativa. Scalando i risultati da 0 a 10, il punteggio comunica chiaramente il confronto tra le varie sedi nel tuo set di dati specifico:
- Un punteggio di 10 viene assegnato alla posizione con il punteggio grezzo più alto, che viene contrassegnata come l'opzione migliore nel set corrente.
- Un punteggio pari a 0 viene assegnato alla località con il punteggio grezzo più basso, che funge da base di confronto. Ciò non significa che la posizione non abbia servizi, ma che è la meno adatta rispetto alle altre opzioni in fase di valutazione.
- Tutti gli altri punteggi si trovano proporzionalmente nel mezzo, offrendo agli utenti un modo chiaro e intuitivo per confrontare le opzioni a colpo d'occhio.
Opzione 2: utilizza la funzione AI.GENERATE (Gemini)
In alternativa all'utilizzo di una formula matematica fissa, puoi utilizzare la
funzione AI.GENERATE di BigQuery
per calcolare i punteggi di località personalizzati direttamente nel flusso di lavoro SQL.
Sebbene l'opzione 1 sia eccellente per l'assegnazione di punteggi puramente quantitativi basati sul conteggio dei servizi, non può tenere facilmente conto dei dati qualitativi. La funzione AI.GENERATE
ti consente di combinare i numeri della query Places Insights con
dati non strutturati, come la descrizione testuale dell'annuncio dell'appartamento (ad es. "Questa
posizione è adatta alle famiglie e la zona è tranquilla di notte") o preferenze specifiche
del profilo utente (ad es. "Questo utente sta prenotando per una famiglia e preferisce una
zona tranquilla in una posizione centrale"). In questo modo puoi generare un punteggio più sfumato
che rileva le sottigliezze che un conteggio rigoroso potrebbe non rilevare, ad esempio una località
con un'alta densità di servizi, ma descritta anche come "troppo rumorosa per i bambini".
Costruire il prompt
Per utilizzare questa funzione, i risultati dell'aggregazione (dal passaggio 2) vengono formattati in un prompt in linguaggio naturale. Questa operazione può essere eseguita dinamicamente in SQL concatenando le colonne di dati con le istruzioni per il modello.
Nella query riportata di seguito, insight_counts vengono combinati con la descrizione testuale
dell'appartamento per creare un prompt per ogni riga. Per guidare l'assegnazione del punteggio viene definito anche un profilo utente di destinazione.
Genera il punteggio con SQL
La seguente query esegue l'intera operazione in BigQuery. Il GDPR:
- Aggrega i conteggi dei luoghi (come descritto nel passaggio 2).
- Crea un prompt per ogni posizione.
- Chiama la funzione
AI.GENERATEper analizzare il prompt utilizzando il modello Gemini. - Analizza il risultato in un formato strutturato pronto per l'uso nella tua applicazione.
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;
Comprendere la configurazione
- Consapevolezza dei costi:questa funzione passa l'input a un modello Gemini e comporta addebiti in Vertex AI ogni volta che viene chiamata. Se viene analizzato un numero elevato di località (ad es. migliaia di annunci di appartamenti), è consigliabile filtrare prima il set di dati in base ai candidati più pertinenti. Per ulteriori dettagli su come ridurre al minimo i costi, consulta le best practice.
endpoint:gemini-flash-latestè specificato per questo esempio per dare la priorità a velocità ed efficienza dei costi. Tuttavia, puoi scegliere il modello più adatto alle tue esigenze. Consulta la documentazione sui modelli Gemini per sperimentare diverse versioni (ad es. Gemini Pro per attività di ragionamento più complesse) e trova la soluzione migliore per il tuo caso d'uso.output_schema: anziché analizzare il testo non elaborato, viene applicato uno schema (FLOAT64per il punteggio eSTRINGper la motivazione). In questo modo, l'output è immediatamente utilizzabile nelle applicazioni o negli strumenti di visualizzazione senza post-elaborazione.
Output di esempio
La query restituisce una tabella BigQuery standard con il punteggio personalizzato e il ragionamento del modello.
| id | nome | family_friendliness_score | ragionamento |
|---|---|---|---|
| 1 | The Downtowner | 5,5 | Conteggi eccellenti di servizi (parchi, ristoranti), che soddisfano le metriche quantitative. Tuttavia, i dati qualitativi indicano un rumore eccessivo nel fine settimana e una forte attenzione alla vita notturna, in diretto contrasto con l'esigenza di tranquillità dell'utente target. |
| 2 | Oasi suburbana | 9.8 | Dati quantitativi eccezionali combinati con una descrizione ("strada tranquilla e alberata") che si allinea perfettamente al profilo della famiglia target. I modificatori positivi elevati generano un punteggio quasi perfetto. |
Questa procedura ti consente di fornire un punteggio altamente personalizzato che risulti intelligibile e su misura per ogni singolo utente, il tutto all'interno di una singola query SQL.
4. Visualizzare i punteggi su una mappa
BigQuery Studio include una visualizzazione
della mappa integrata
per qualsiasi risultato di query che contenga una colonna GEOGRAPHY. Poiché la nostra query restituisce
la colonna location, puoi visualizzare immediatamente i tuoi punteggi.
Se fai clic sulla scheda Visualization, viene visualizzata la mappa e il menu a discesa Data Column
controlla il punteggio della posizione da visualizzare. In questo esempio, il
normalized_pet_score è visualizzato nell'esempio dell'opzione 1. Tieni presente che in questo esempio sono state aggiunte altre località alla tabella apartment_listings.

La visualizzazione dei dati rivela a colpo d'occhio le posizioni più appropriate per il punteggio creato, con cerchi verdi più scuri che rappresentano le posizioni con un normalized_pet_score più elevato, in questo caso. Per ulteriori opzioni di visualizzazione dei dati di Places Insights, consulta Visualizzare i risultati della query.
Conclusione
Ora disponi di una metodologia potente e ripetibile per creare punteggi di localizzazione
sfumati. Partendo dalle tue località, hai creato una singola query SQL in
BigQuery che trova i luoghi nelle vicinanze con ST_DWITHIN, li filtra in base ad attributi
avanzati come good_for_children e allows_dogs e aggrega i
risultati con COUNTIF. Applicando pesi personalizzati e normalizzando il risultato,
hai ottenuto un unico punteggio intuitivo che fornisce informazioni approfondite e utili. Puoi applicare direttamente questo pattern per trasformare i dati sulla posizione non elaborati in
un vantaggio competitivo significativo.
Azioni successive
Ora tocca a te creare. Questo tutorial fornisce un modello. Puoi utilizzare i dati avanzati disponibili nello schema Places Insights per creare i punteggi più necessari per il tuo caso d'uso. Prendi in considerazione questi altri punteggi che potresti creare:
- "Punteggio vita notturna": combina i filtri per
primary_type(bar,night_club),price_levele orari di apertura a tarda notte per trovare le zone più vivaci dopo il tramonto. - "Punteggio di fitness e benessere": conta
gyms,parksehealth_food_storesnelle vicinanze e filtra i ristoranti in base a quelli conserves_vegetarian_foodper assegnare un punteggio alle località per gli utenti attenti alla salute. - "Punteggio da pendolare ideale": trova luoghi con un'alta densità di
transit_stationeparkingnelle vicinanze per aiutare gli utenti che apprezzano l'accesso ai trasporti.
Collaboratori
Henrik Valve | DevX Engineer