josefheidler/transport_adults_2011-palms
PALMS Validation Dataset — GPS transportation-mode detection Two trained research assistants at UCSD CWPHS completed ≈35 scripted transit sessions in San Diego (Feb–May 2011) carrying a Qstarz BT-1000 GPS logger (≈5 s cadence, no IMU) and logging activity modes second-by-second against prescribed routes. Harmonized from the md2k-PALMS repository into per-subject GeoParquet — one row per GPS sample. 2 participants, 67,529 GPS samples, 94.7% labelled, 95.1 h labeled.… See the full description on the dataset page: https://huggingface.co/datasets/josefheidler/transport_adults_2011-palms.
PALMS Validation Dataset — GPS transportation-mode detection
Two trained research assistants at UCSD CWPHS completed ≈35 scripted transit sessions in San Diego (Feb–May 2011) carrying a Qstarz BT-1000 GPS logger (≈5 s cadence, no IMU) and logging activity modes second-by-second against prescribed routes. Harmonized from the md2k-PALMS repository into per-subject GeoParquet — one row per GPS sample. 2 participants, 67,529 GPS samples, 94.7% labelled, 95.1 h labeled.
Source
- Raw data: https://github.com/MD2Korg/md2k-PALMS
- License: BSD-2-Clause (propagated to this harmonized dataset)
Protocol
- Participants: 2 trained research assistants at the University of California, San Diego — Center for Wireless and Population Health Studies (UCSD CWPHS), collector IDs
47(brisk-meerkat) and106(keen-raccoon). - Sensor: Qstarz BT-1000 standalone GPS logger, ≈5 s sampling cadence (empirically verified; median 5.0 s across checked files). No accelerometer or IMU data — GPS only.
- Protocol: Scripted transit routes around San Diego (Feb–May 2011).
- Transportation trips — paired-mode legs along San Diego corridors, 800–1500 m each, covering walking, cycling, car, and bus.
- Building trips — repeated in/out threshold crossings of buildings, malls, and garages to test GPS signal-loss behavior.
Ground-truth provenance
Ground truth was recorded as written trip logs by the two research assistants during each session, then transcribed to per-second diary files (one XLSX per session). No video annotation or inter-rater reliability measure is reported in the upstream source. GPS–log sync is implicit — both the GPS device and the diary log timestamps use the same wall-clock. No participants were excluded.
Schema
All timestamps are tz-aware America/Los_Angeles.
Example rows
subject timestamp geometry altitudem speedkph label transport activity environment location cold_start brisk-meerkat 2011-03-25 10:08:05-07:00 POINT (-117.274 32.821) -10.6 11.0 move bicycle <NA> outdoor <NA> False brisk-meerkat 2011-03-03 10:51:38-08:00 POINT (-117.255 32.793) -39.9 0.4 stop <NA> stand outdoor <NA> <NA> brisk-meerkat 2011-03-04 10:19:08-08:00 POINT (-117.255 32.794) -12.6 1.2 move walk <NA> indoor <NA> False brisk-meerkat 2011-03-03 11:00:23-08:00 POINT (-117.251 32.783) -31.8 26.8 move car <NA> vehicle <NA> True brisk-meerkat 2011-03-11 10:51:05-08:00 POINT (-117.212 32.871) 87.0 2.4 move walk <NA> outdoor mall <NA> brisk-meerkat 2011-03-03 11:05:08-08:00 POINT (-117.254 32.794) -29.0 12.3 move car <NA> vehicle garage True
Label vocabulary
label is the primary move/stop classification. transport and activity are sub-dimensions — at most one is non-null per row. Transport modes (walk, bicycle, car, bus) derive label from the PALMS Event column (Pause → stop, Trip/Transition → move). Body-state and transition modes have a fixed label regardless of Event.
Total labeled: 5,704.4 min / 95.1 h across 2 participants.
Environment and location
environment and location are two independent dimensions. environment answers "indoor, outdoor, or in a vehicle". location names the place type, and it is null everywhere except a mall or a parking garage. A row can carry both, for example an open-air mall reads outdoor + mall.
environment comes from the InBldg and InGrge indicators in the truth files, with one override: a car or bus occupant reads vehicle, even inside a parking garage. That override covers 202 rows.
The mall indicator does not reach environment. The three indicators are not mutually exclusive: 998 truth-seconds carry InBldg=1 together with the mall indicator (a closed mall is a building), and 4,613 carry the mall indicator alone (an open mall is not a building). The mall is therefore a place type and it lives in location.
Coverage
3,547 of 67,529 rows (5.3%) have a null label — these are GPS samples that fell outside the 10 s tolerance of the asof-join and inherited no truth label. All remaining rows have label = move or label = stop.
geometry and altitude_m are present on every row. speed_kph is null on exactly one row (brisk-meerkat, 2011-04-07 11:57:40): that single GPX trackpoint carries <ele> and <time> but no <speed> element.
The logger wrote no fix-quality field, so this dataset carries no satellite count, no HDOP, and no signal-to-noise column.
gdf_labeled = gdf[gdf["label"].notna()]
gdf_move = gdf[gdf["label"] == "move"]Harmonization notes
No participants were excluded. speed_kph is the device-reported GPS speed from the GPX <speed> element (m/s per GPX 1.1 spec, multiplied by 3.6); confirmed as m/s by tools/speed_unit_check.py (device/haversine ratio 0.94–1.03 across 3 checked files).
altitude_m is the raw GPX <ele> value, copied without correction. 31.8% of the rows are negative. The upstream PALMS variable list states that this field can be negative. The track itself is smooth: between consecutive fixes less than 10 s apart, the median change is 0.2–0.3 m and the 95th percentile is 3.5–3.9 m. So the negative values are a systematic offset, not noise. The likely cause is that the logger reports height above the WGS84 ellipsoid, which sits about 35 m above the geoid near San Diego. This explanation is not confirmed against a geoid model. Treat the column as a relative elevation signal, not as a height above sea level.
Schema v1.1.0: the single location column split into environment (indoor, outdoor, vehicle) and location (mall, garage). The old column had to rank the four raw indicators and discard the losers. The split recovers 334 rows: 67 rows that are both a building and a mall, and 267 rows where the mall is known but the indoor/outdoor state is not. vehicle is new — the raw truth files code car and bus travel as outdoor, so the value derives from transport. No GPS row, timestamp, or truth label changed.
Schema v1.0.1: the original label / variant / event columns from v1.0.0 were replaced by label (move/stop), transport (mode of travel), and activity (body state during stops). The old label column mapped PALMS Mode strings directly (e.g. walk, car, transition); the new label column carries the move/stop classification that was formerly in event.
Use
Intended for GPS-based transportation-mode detection — predicting transport from GPS traces (position, speed, altitude). With only two participants, this dataset is primarily suited for algorithm development or validation against a known reference implementation (PALMS). No standard evaluation protocol is defined by the original source; subject-level hold-out is the natural split given the small N.
Loading
Load both subjects into one GeoDataFrame:
import geopandas as gpd
import pandas as pd
from huggingface_hub import HfFileSystem
fs = HfFileSystem()
files = fs.glob("datasets/josefheidler/transport_adults_2011-palms/harmonized/*.parquet")
gdfs = [gpd.read_parquet(f"hf://{f}") for f in sorted(files)]
gdf = gpd.GeoDataFrame(pd.concat(gdfs, ignore_index=True), crs="EPSG:4326")Load a single subject:
import geopandas as gpd
gdf = gpd.read_parquet(
"hf://datasets/josefheidler/transport_adults_2011-palms/harmonized/brisk-meerkat.parquet"
)Citation
md2k-PALMS. Personal Activity and Location Measurement System (PALMS) Validation Dataset. https://github.com/MD2Korg/md2k-PALMS, 2011.
