Preparar dados de informações empíricas
Para usar embeddings de dinâmica populacional, os dados de informações empíricas precisam ser agregados a um limite geográfico compatível. Como os tipos de limites administrativos variam globalmente, é possível alinhar os dados usando sistemas de grade matemática universais (como células S2) ou regiões administrativas locais (como condados ou distritos, dependendo do conjunto de dados específico do país).
Opção 1: incorporar embeddings a um modelo atual
- Prepare as informações empíricas com base no modelo atual: use os embeddings como covariáveis geoespaciais para aprimorar um modelo atual.
- Treine um modelo de correção de erros: melhore um modelo atual integrando os embeddings a um modelo que usa a saída original, o valor esperado ou as informações empíricas e os embeddings para aprender um novo modelo de correção de erros.
Opção 2: ajuste para casos de uso específicos
- Escolha um modelo de previsão: qualquer modelo, como GBDT, MLP ou linear, pode ser usado para previsões.
- Use embeddings para previsão: use embeddings de dinâmica populacional como recursos de entrada, junto com outros dados contextuais, para melhorar a precisão da previsão.
Agregação de limites personalizados
Se os dados de informações empíricas usarem polígonos personalizados, como códigos postais, isócronas de tempo de viagem ou áreas comerciais, você poderá realizar uma agregação de limites. Esse processo combina vários vetores de células S2 em uma única representação para o polígono de destino. A escolha da metodologia de ponderação certa garante que o embedding agregado reflita com precisão as metas de modelagem downstream.
1. Média ponderada pela população (padrão recomendado para PDI)
Use a agregação ponderada pela população para casos de uso centrados no ser humano, como performance de lojas de varejo ou modelagem de comportamento do consumidor.
O uso de uma agregação espacial ponderada por área para dados demográficos pode distorcer os recursos de machine learning. Isso ocorre quando áreas não povoadas, como parques, zonas industriais ou corpos d'água, distorcem o perfil dos moradores reais.
Para resolver isso, você pode realizar uma média ponderada pela população no BigQuery. Essa abordagem usa conjuntos de dados demográficos de alta resolução, como o WorldPop no catálogo de dados do Earth Engine, para calcular a densidade precisa de cada segmento de célula S2 que se cruza.
Para conferir um exemplo completo de implementação de um fluxo de trabalho ponderado pela população, execute o notebook interativo.
2. Média ponderada por área
Para casos de uso ambientais ou físicos, use a agregação ponderada por área. Isso é útil para análise de uso da terra, estudos de ambiente construído ou planejamento de infraestrutura em que é necessário avaliar regiões, independentemente da distribuição da população.
Nesses cenários, a área física da terra é mais relevante do que a densidade populacional humana. Isso garante que cada quilômetro quadrado dentro do limite do polígono contribua igualmente para o vetor agregado.
Nesse método, o vetor de embedding de cada célula S2 constituinte é ponderado pela área geográfica que ela cobre dentro do polígono de destino.
Operações geoespaciais e conversão de células S2
O Population Dynamics Insights usa tokens de célula S2 de nível 12 (armazenados na coluna geo_id como strings hexadecimais de 7 caracteres) como unidade espacial principal. É possível usar as
funções geográficas integradas
no BigQuery para converter coordenadas de pontos ou limites espaciais personalizados em
tokens de células S2 correspondentes. Para converter tokens de células S2 em geometrias de polígonos para visualização, use bibliotecas do lado do cliente. Para mais informações, consulte Receber
a geometria de células S2 de um token hexadecimal de nível 12.
Converter coordenadas de pontos em tokens hexadecimais de nível 12
Para corresponder coordenadas de pontos de latitude/longitude à coluna geo_id no Population Dynamics Insights, use a função S2_CELLIDFROMPOINT do BigQuery combinada com ST_GEOGPOINT.
O BigQuery armazena IDs de células S2 como valores INT64 assinados, o que faz com que os IDs de células em determinadas regiões sejam avaliados como números inteiros negativos. Nos exemplos abaixo, definimos uma função auxiliar chamada TO_S2_HEX que converte o número inteiro em um token hexadecimal padrão e remove os zeros à direita de acordo com a especificação de geometria S2.
A consulta a seguir converte coordenadas de pontos para a Times Square, em Nova York (latitude 40.75796, longitude -73.98554) no token hexadecimal de nível 12 correspondente:
CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS ( RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0') ); SELECT 'Times Square, NYC' AS location_name, TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(-73.98554, 40.75796), level => 12)) AS geo_id;
Para converter uma tabela de pontos atual com colunas latitude e longitude em tokens S2 combináveis:
CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS ( RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0') ); SELECT store_id, TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(longitude, latitude), level => 12)) AS geo_id FROM `your-project.internal_data.store_locations`;
Gerar tokens de células S2 de nível 12 para um polígono
Se os dados usarem limites de área personalizados (como áreas comerciais, zonas de entrega ou códigos postais no formato WKT ou GeoJSON), converta a representação de texto em uma GEOGRAPHY usando ST_GEOGFROM e use S2_COVERINGCELLIDS para extrair todas as células S2 de nível 12 que se cruzam.
A consulta a seguir extrai todos os tokens hexadecimais de nível 12 que cobrem um polígono personalizado no centro de Manhattan:
CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS ( RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0') ); WITH CustomBoundary AS ( SELECT ST_GEOGFROM('POLYGON((-73.99 40.75, -73.97 40.75, -73.97 40.76, -73.99 40.76, -73.99 40.75))') AS geom ) SELECT TO_S2_HEX(s2_id) AS geo_id FROM CustomBoundary, UNNEST(S2_COVERINGCELLIDS(geom, min_level => 12, max_level => 12)) AS s2_id;
Receber a geometria de células S2 de um token hexadecimal de nível 12
As funções GIS do BigQuery são conversores unidirecionais (geometria → ID de célula S2) e não incluem uma função para converter um token de célula S2 em uma GEOGRAPHY de polígono.
Para receber a geometria de polígono de um token de célula S2 para visualização ou análise espacial, use uma biblioteca do lado do cliente em Python, como
s2sphere
para decodificar um token de célula S2 de 7 caracteres nas coordenadas de limite e
shapely
para construir um polígono para ferramentas de mapeamento como o Folium:
import s2sphere from shapely.geometry import Polygon def s2_token_to_polygon(s2_token: str) -> Polygon: """Converts a 7-character S2 cell token into a Shapely Polygon.""" cell_id = s2sphere.CellId.from_token(s2_token) cell = s2sphere.Cell(cell_id) # Extract the 4 corner vertices of the S2 cell vertices = [] for i in range(4): vertex = cell.get_vertex(i) lat_lng = s2sphere.LatLng.from_point(vertex) vertices.append((lat_lng.lng().degrees, lat_lng.lat().degrees)) # Close the polygon loop vertices.append(vertices[0]) return Polygon(vertices) # Example: Get boundary for S2 token '549056f' cell_polygon = s2_token_to_polygon('549056f') print(cell_polygon.wkt)
Exemplos de consultas
Substitua your-project.your_dataset.embeddings_table pelo projeto, conjunto de dados e nome da tabela de destino.
SQL: buscar embeddings
Essa consulta recupera o vetor de embedding e os metadados administrativos das células S2 no conjunto de dados provisionado.
SELECT geo_id, administrative_area_level_1_name AS state, administrative_area_level_2_name AS county, features -- The 330-dim vector FROM `your-project.your_dataset.embeddings_table` LIMIT 10;
SQL: encontrar locais semelhantes
Essa consulta identifica locais comportamentalmente semelhantes sem exigir dados externos.
Ela usa a função ML.DISTANCE para calcular a similaridade de cosseno, retornando as principais correspondências para uma célula S2 de destino. Essa abordagem oferece suporte a cenários de planejamento de expansão, como determinar onde abrir uma nova loja com base no perfil de um local atual bem-sucedido.
Para visualizar células S2 em um mapa, é necessário converter ou unir o ID da célula S2 à geometria de polígono correspondente, porque esse conjunto de dados usa tokens de células S2 em vez de pontos de latitude e longitude.
WITH TargetLocation AS ( SELECT features AS target_vector FROM `your-project.your_dataset.embeddings_table` -- Replace with your target S2 hex token (e.g., '80ead45') WHERE geo_id = 'YOUR_TARGET_S2_TOKEN' ) SELECT t.geo_id, t.administrative_area_level_1_name AS state, t.administrative_area_level_2_name AS county, -- Calculate Similarity (1.0 is identical, 0.0 is dissimilar) (1 - ML.DISTANCE(t.features, p.target_vector, 'COSINE')) AS similarity_score FROM `your-project.your_dataset.embeddings_table` t, TargetLocation p WHERE t.geo_id != 'YOUR_TARGET_S2_TOKEN' -- Exclude the target itself ORDER BY similarity_score DESC LIMIT 20;
SQL: unir dados do cliente
Este exemplo demonstra como enriquecer seus próprios dados internos (por exemplo, uma tabela de performance da loja) com embeddings comportamentais. Verifique se os dados internos incluem tokens de células S2 correspondentes (strings hexadecimais).
SELECT store.store_id, store.s2_token, store.total_revenue, embeddings.features AS pdfm_vector FROM `your-project.internal_data.store_performance` AS store JOIN `your-project.your_dataset.embeddings_table` AS embeddings ON -- Join based on the S2 hex token string store.s2_token = embeddings.geo_id
Python: carregar dados para machine learning
Os embeddings são armazenados como matrizes do BigQuery. Para usá-los em bibliotecas de ML, é necessário converter a coluna em uma matriz NumPy.
from google.cloud import bigquery import numpy as np import pandas as pd client = bigquery.Client() query = """ SELECT geo_id, features -- Returns as a list of floats FROM `your-project.your_dataset.embeddings_table` LIMIT 1000 """ # 1. Load data into DataFrame df = client.query(query).to_dataframe() # 2. Convert the 'features' column (Series of Lists) into a Matrix (2D Array) X_matrix = np.stack(df['features'].values) print(f"Data Loaded. Matrix Shape: {X_matrix.shape}") # Output: Data Loaded. Matrix Shape: (1000, 330)
Executar no Google Colab
Ver código-fonte no GitHub