Trends Core Data Product¶
Trends is a weekly, near-real-time data product that covers mobility and economic activity nationwide at census-tract-level fidelity. It is the companion to Places: while Places provides a modeled snapshot of a typical day in a given season (high spatial detail, point-in-time), Trends tracks how conditions are actually changing week over week (lower spatial detail, continuous time series).
Trends vs Places¶
| Dimension | Trends | Places |
|---|---|---|
| Update cadence | Weekly | Seasonal (quarterly) |
| Temporal reference | Actual trips observed in a given week | Modeled trips on a typical day in a season |
| Spatial fidelity | Census tract | Block group / parcel / POI |
| Geographic scope | Nationwide | Megaregion (10-50M residents) |
| Day represented (dashboard) | Average weekday | Typical Thursday (weekday) or Saturday (weekend) |
| Primary use | Monitoring change over time | Detailed point-in-time analysis |
Trends dashboard data displays an average weekday unless otherwise noted. Full-week averages and weekend averages are available via download.
Output Data¶
Mobility Data¶
Trends mobility data provides a complete hourly, nationwide origin-destination table representing an average day in the prior week.
| Metric | Description |
|---|---|
| Origin-Destination table | Hourly, census-tract-level, nationwide |
| Mode split | Auto, transit, walking, biking |
| Residential VMT | Vehicle miles traveled by residents of each tract |
Mode choice in Trends is determined by a model that incorporates the geographic location of origin and destination, the distance between them, and observed aggregate transit usage.
Economic Data (Consumer Spend) -- Discontinued¶
Consumer spend data reports total dollars spent by residents of each census tract and at merchants in each census tract, broken down by category.
| Spend Category |
|---|
| Retail |
| Grocery Stores |
| Gas Stations, Parking, Taxis, Tolls |
| Restaurants & Bars |
| Airline, Hospitality, & Car Rental |
| Entertainment & Recreation |
Spend data also included a breakdown of on- vs off-line spend for certain categories, and county-to-county spend flows by merchant location and resident location.
Discontinuation notice: Due to changes in upstream sources, spend data no longer meets Replica's reliability standards. Spend was discontinued as of December 28, 2024. Historical spend data remains available through March 1, 2025.
Temporal Coverage¶
| Data Type | Start Date | End Date |
|---|---|---|
| Mobility | January 2019 | Present (updated weekly) |
| Consumer Spend | January 2019 | March 1, 2025 |
Spatial Aggregation¶
Mobility and spend data use different spatial aggregation methods:
| Data Type | Aggregation Unit | Method |
|---|---|---|
| Mobility | Census tract | Centroid of H3 resolution 9 cells |
| Spend | Census tract | Centroid of census tracts |
Custom Geography Behavior¶
When a custom geography is defined, data is included based on whether the centroid of the relevant spatial unit (H3 cell for mobility, census tract for spend) falls within the custom geography boundary. Trips or spend associated with units whose centroids fall outside the boundary are excluded, even if the unit partially overlaps the geography.
ACS Data Version¶
Trends datasets use 2019 ACS/PUMS data for demographic and socioeconomic attributes.
Validation and Calibration¶
- Trends metrics are grounded in both internal and external data sources. The Bureau of Transportation Statistics provides mobility ground truth; the Census Bureau provides economic activity ground truth.
- Metrics are calibrated using historical regression to ground truth data.
- No per-release quality report is generated for Trends (unlike Places), because for the vast majority of weekly metrics there is no week-to-week or day-to-day ground truth to compare against.
- Certain metrics labeled "Quantified" Trends Estimates (such as total trips) include a quantified margin of error for each day.
- Because Trends releases data in near real time, direct calibration to sources like sensor data is not possible. Certainty comes from combining numerous different types of input data.
- Filtering to a small number of trips or evaluating sparsely populated tracts reduces certainty, as noise and outliers have more influence on the result.
BigQuery Schema¶
Trends data lives in the trends dataset under the CDS project. Tables fall into two structural categories depending on how geography is encoded.
Table Types¶
Pre-joined geo tables -- mobility_geo__layer_{N}__v1_0_0
Trip count data already aggregated to a geographic layer. The layer id N is embedded in the table name (e.g., 4 = census tract, 6 = STPLC, 3 = county, 2 = state). Origin and destination are integer geo ids that join directly to the geostore; no spatial operations are needed at query time. These tables are partitioned on partition_key (DATE), which contains only modeled days (Thursdays for weekday, Saturdays for weekend).
Point tables -- {metric}_point__v{version}
WFH, VMT, and spend metrics are stored at the GEOGRAPHY point level. Querying these tables requires a spatial join to assign each point to a polygon in the geostore (see Geo Aggregation below). Key tables:
| Table | Metric |
|---|---|
vmt_point__v1_0_0 |
Vehicle miles traveled |
wfh_point__v1_0_0 |
Work-from-home share |
spend_home_point__v2_0_0 |
Consumer spend by home location |
spend_merchant_point__v2_0_0 |
Consumer spend by merchant location |
Other referenced tables: spend_od__v2_0_0 (pre-joined OD spend with integer geo ids), metadata.month_day_count (monthly averaging denominators), geo.contained_geos (parent-child geo hierarchy), and model-159019.geos.geostore (canonical geo reference with id, src_id, name, geometry, layer_id).
Metric Schemas¶
Trip count (mobility_geo__layer_{N}__v1_0_0)
partition_key (DATE), origin (INT), destination (INT), trip_count (INT), intra_geo_trip_count (trips where origin = destination), start_date_time (DATETIME, for hourly breakdowns). Mode and purpose are stored as nested arrays -- mode ARRAY<STRUCT<trip_count INT, mode STRING>> and purpose ARRAY<STRUCT<trip_count INT, purpose STRING>>. Access individual mode or purpose counts with an UNNEST join:
VMT (vmt_point__v1_0_0)
date (DATE), point (GEOGRAPHY), vmt (INT).
WFH (wfh_point__v1_0_0)
date (DATE), point (GEOGRAPHY), persons_wfh_count (INT). WFH share is derived by joining to geo_demographics.employed_residents after geo aggregation.
Spend (spend_home_point__v2_0_0, spend_merchant_point__v2_0_0)
date (DATE), point (GEOGRAPHY), replica_industry (TEXT), estimated_spend_home or estimated_spend_merchant (FLOAT). The home table also carries spend_channel (TEXT -- "online_spend" or "offline_spend"); the merchant table does not.
Time Period Patterns¶
- Week boundaries truncate to Saturday:
DATE_TRUNC(date, WEEK(SATURDAY)). Date ranges snap the start to the preceding Saturday and the end to the following Friday. - Travel-activity metrics (trip count, VMT, WFH) model only Thursdays (weekday proxy) and Saturdays (weekend proxy). Queries filter to those specific days of week; full-week averages are not available for these metrics.
- Spend metrics use full daily data. Weekday =
DAYOFWEEK > 1 AND DAYOFWEEK < 7; weekend =DAYOFWEEK IN (1, 7). - Monthly averages divide the monthly sum by the count of the relevant day type in that month, looked up from
metadata.month_day_count(columns:thursday,saturday,weekday,weekend,total):
SELECT ROUND(SUM(value) / CAST(ANY_VALUE(month_day_count.thursday) AS NUMERIC)) AS value
FROM sum_query
JOIN metadata.month_day_count
ON month_day_count.month = sum_query.truncated_date
Geo Aggregation¶
Point tables use a standard two-CTE pattern to assign points to the target geographic layer.
Step 1 -- cutout: Coarse spatial filter using ST_INTERSECTS against a bounding polygon to limit the scan:
WITH cutout AS (
SELECT *
FROM {metric}_point__v{X}_0_0
WHERE ST_INTERSECTS(ST_GEOGFROMTEXT('POLYGON((...your bounding WKT...))'), point)
)
Step 2 -- geo_joined: Precise assignment by joining each surviving point to geostore polygons with ST_COVERS:
geo_joined AS (
SELECT SUM(metric) AS metric, geo.id AS geo, cutout.date
FROM cutout
JOIN `model-159019.geos.geostore` AS geo
ON ST_COVERS(geo.geometry, cutout.point)
WHERE geo.layer_id = {target_layer_id}
GROUP BY geo, date
)
The layer_id parameter controls the aggregation level -- the same point data can be rolled up to census tracts, counties, states, or CBSAs by changing this value.
Parent-child hierarchies: When the filter geography differs from the aggregation geography (e.g., show census tracts within a CBSA), the contained_geos table resolves which child geos belong to the parent:
WHERE origin IN (
SELECT child_id
FROM geo.contained_geos
WHERE parent_id IN ({parent_ids})
AND child_layer_id = {target_layer_id}
)
Daily OD and Daily VMT¶
Beyond the weekly cadence, daily origin-destination downloads and daily VMT are available. These provide day-to-day nationwide vehicle trip counts and vehicle miles traveled at the network link level. Use daily OD when you need to understand specific-day travel patterns rather than weekly averages.
Pairing with Places Seasons¶
A common analysis pattern is to pair a Places seasonal snapshot with Trends time-series data. For example, a site development profile might use Places Fall 2024 for a detailed point-in-time trip breakdown, then overlay Trends 2019-present to show how activity at that location has changed over time. Places provides the spatial detail; Trends provides the longitudinal context.
Supported Use Cases¶
| Use Case | Example |
|---|---|
| Monitoring behavioral changes | Track shifts in trip purpose and consumer spend for economic recovery; monitor mode choice changes to predict transit or road network demand |
| Revenue forecasting | Use VMT and gas spend data to forecast gas tax revenue |
| Evaluating cause and effect | Assess the impact of development projects (retail, residential) to prioritize investment; evaluate transportation initiatives (e.g., street closures for outdoor dining) |
Unsupported Use Cases¶
| Use Case | Why Not | Alternative |
|---|---|---|
| Detailed traffic analysis or feasibility studies | Trends is designed for week-over-week monitoring, not absolute measured snapshots | Use Places for point-in-time analysis with high observation counts and spatial detail |
| Parcel or block-group-level analysis | Trends data is only available at census-tract level due to sample size and privacy constraints | Use Places for block-group or parcel-level fidelity |