Przygotowywanie danych podstawowych
Aby korzystać z osadzania danych o dynamice populacji, musisz zagregować dane podstawowe do obsługiwanego obszaru geograficznego. Rodzaje granic administracyjnych różnią się na całym świecie, dlatego możesz dopasować dane za pomocą uniwersalnych matematycznych systemów siatki (np. komórek S2) lub lokalnych regionów administracyjnych (takich jak hrabstwa lub okręgi, w zależności od konkretnego zbioru danych dotyczącego kraju).
Opcja 1. Włączenie wektorów dystrybucyjnych do istniejącego modelu
- Przygotuj dane podstawowe oparte na istniejącym modelu: użyj wektorów jako zmiennych współzależnych geoprzestrzennych, aby ulepszyć istniejący model.
- Trenowanie modelu korekty błędów: ulepsz istniejący model, integrując w nim wektory osadzeń. Model ten przyjmuje dane wyjściowe oryginalnego modelu, oczekiwaną wartość lub prawdę podstawową oraz wektory osadzeń, aby nauczyć się nowego modelu korekty błędów.
Opcja 2. Dostosowywanie do konkretnych przypadków użycia
- Wybierz model prognozowania: do prognozowania można użyć dowolnego modelu, np. GBDT, MLP lub liniowego.
- Używaj osadzeń do prognozowania: używaj osadzeń dynamiki populacji jako cech wejściowych wraz z innymi danymi kontekstowymi, aby zwiększyć dokładność prognozowania.
Agregacja niestandardowych granic
Jeśli dane referencyjne wykorzystują niestandardowe wielokąty, takie jak kody pocztowe, izochrony czasu dojazdu lub obszary handlowe, możesz przeprowadzić agregację granic. Ten proces łączy wiele wektorów komórek S2 w jedną reprezentację docelowego wielokąta. Wybór odpowiedniej metodologii ważenia zapewnia, że zagregowane osadzanie dokładnie odzwierciedla cele modelowania niższego rzędu.
1. Średnia ważona według liczby ludności (zalecana wartość domyślna w przypadku wskaźnika PDI)
W przypadku zastosowań skoncentrowanych na człowieku, takich jak wydajność sklepów detalicznych czy modelowanie zachowań konsumentów, używaj agregacji ważonej według populacji.
Używanie agregacji przestrzennej ważonej obszarem w przypadku danych demograficznych może zniekształcić funkcje uczenia maszynowego. Dzieje się tak, gdy niezamieszkane obszary, takie jak parki, strefy przemysłowe lub zbiorniki wodne, zniekształcają profil rzeczywistych mieszkańców.
Aby rozwiązać ten problem, możesz obliczyć średnią ważoną populacji w BigQuery. Ta metoda wykorzystuje zbiory danych demograficznych o wysokiej rozdzielczości, takie jak WorldPop w katalogu danych Earth Engine, do obliczania dokładnej gęstości zaludnienia każdego segmentu komórki S2.
Aby zobaczyć pełny przykład wdrożenia przepływu pracy z ważeniem populacji, uruchom interaktywny notatnik.
2. Średnia ważona według powierzchni
W przypadku zastosowań związanych z ochroną środowiska lub fizyką używaj agregacji ważonej według obszaru. Jest to przydatne w analizie użytkowania gruntów, badaniach środowiska zabudowanego lub planowaniu infrastruktury, gdy musisz ocenić regiony niezależnie od rozmieszczenia ludności.
W takich przypadkach powierzchnia lądu jest ważniejsza niż gęstość zaludnienia. Dzięki temu każdy kilometr kwadratowy w granicach wielokąta ma taki sam udział w zagregowanym wektorze.
W tej metodzie wektor dystrybucyjny każdej komórki S2 jest ważony przez powierzchnię geograficzną, którą obejmuje w docelowym wielokącie.
Operacje geoprzestrzenne i przekształcanie komórek S2
Statystyki dotyczące dynamiki populacji używają tokenów komórek S2 poziomu 12 (przechowywanych w geo_id jako 7-znakowe ciągi szesnastkowe) jako podstawowej jednostki przestrzennej. W BigQuery możesz używać wbudowanych funkcji geograficznych, aby przekształcać współrzędne punktów lub niestandardowe granice przestrzenne w odpowiadające im tokeny komórek S2. Aby przekształcić tokeny komórek S2 w geometrię wielokątów na potrzeby wizualizacji, możesz użyć bibliotek po stronie klienta. Więcej informacji znajdziesz w artykule Pobieranie geometrii komórki S2 z tokena szesnastkowego S2 poziomu 12.
Konwertowanie współrzędnych punktu na tokeny szesnastkowe S2 na poziomie 12
Aby dopasować współrzędne punktu szerokości i długości geograficznej do kolumny geo_id w statystykach dotyczących dynamiki populacji, użyj funkcji BigQuery S2_CELLIDFROMPOINT w połączeniu z ST_GEOGPOINT.
BigQuery przechowuje identyfikatory komórek S2 jako wartości INT64 ze znakiem, co powoduje, że identyfikatory komórek w niektórych regionach są traktowane jako liczby ujemne. W przykładach poniżej definiujemy funkcję pomocniczą o nazwie TO_S2_HEX, która przekształca liczbę całkowitą w standardowy token szesnastkowy i usuwa zera na końcu zgodnie ze specyfikacją S2 Geometry.
To zapytanie przekształca współrzędne punktu na Times Square w Nowym Jorku (szerokość geograficzna 40.75796, długość geograficzna -73.98554) w odpowiedni token szesnastkowy S2 na poziomie 12:
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;
Aby przekonwertować istniejącą tabelę punktów z kolumnami latitude i longitude na tokeny S2, które można złączyć:
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`;
Generowanie tokenów komórek S2 poziomu 12 obejmujących wielokąt
Jeśli Twoje dane używają niestandardowych granic obszarów (np. obszarów handlowych, stref dostaw lub kodów pocztowych w formacie WKT lub GeoJSON), przekonwertuj tekstową reprezentację na GEOGRAPHY za pomocą ST_GEOGFROM i użyj S2_COVERINGCELLIDS, aby wyodrębnić wszystkie przecinające się komórki S2 na poziomie 12.
Poniższe zapytanie wyodrębnia wszystkie tokeny szesnastkowe S2 na poziomie 12 obejmujące niestandardowy wielokąt w Midtown 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;
Pobieranie geometrii komórki S2 z tokena szesnastkowego S2 na poziomie 12
Funkcje BigQuery GIS to konwertery jednokierunkowe (Geometry → S2 Cell ID), które nie obejmują funkcji konwertującej token komórki S2 na wielokątGEOGRAPHY.
Aby uzyskać geometrię wielokąta tokena komórki S2 na potrzeby wizualizacji lub analizy przestrzennej, użyj biblioteki po stronie klienta w Pythonie, np. s2sphere, aby zdekodować 7-znakowy token komórki S2 na współrzędne graniczne, oraz shapely, aby utworzyć wielokąt dla narzędzi do mapowania, takich jak 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)
Przykłady zapytań
Zastąp your-project.your_dataset.embeddings_table nazwą rzeczywistego projektu, zbioru danych i tabeli docelowej.
SQL: pobieranie wektorów dystrybucyjnych
To zapytanie pobiera wektor osadzania i metadane administracyjne komórek S2 w udostępnionym zbiorze danych.
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: znajdowanie podobnych lokalizacji
To zapytanie identyfikuje podobne pod względem zachowań lokalizacje bez konieczności korzystania z danych zewnętrznych.
Do obliczania podobieństwa cosinusowego używa funkcji ML.DISTANCE, która zwraca najlepsze dopasowania dla docelowej komórki S2. To podejście pomaga w planowaniu rozwoju, np. w określaniu, gdzie otworzyć nowy sklep na podstawie profilu istniejącej lokalizacji, która odnosi sukces.
Aby wizualizować komórki S2 na mapie, musisz przekonwertować identyfikator komórki S2 na odpowiadającą mu geometrię wielokąta lub połączyć je ze sobą, ponieważ ten zbiór danych używa tokenów komórek S2 zamiast punktów szerokości i długości geograficznej.
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: łączenie danych klientów
Ten przykład pokazuje, jak wzbogacać własne dane wewnętrzne (np. tabelę skuteczności sklepu) o wektory dystrybucyjne dotyczące zachowań. Upewnij się, że dane wewnętrzne zawierają pasujące tokeny komórek S2 (ciągi szesnastkowe).
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: wczytywanie danych na potrzeby uczenia maszynowego
Osadzanie jest przechowywane jako tablice BigQuery. Aby używać ich w bibliotekach ML, musisz przekonwertować kolumnę na macierz 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)
Uruchom w Google Colab
Wyświetl źródło w GitHubie