Data & method

What the files are, how each line on the map was made, and what was corrected along the way

Source files

FileWhat it holds
lyft-rides-exportLyft's own export: accept, pickup and drop-off times and the driver's position at accept for all 226 rides.
lyft-gps-endpoints-v4Pickup and drop-off points reconstructed from the phone's GPS trail at the true pickup and drop-off times; six rides on Oct 19 have no trail and carry only the accept point.
lyft-table-compact-v4One row per Lyft ride with miles, duration and pay. Its time column is the accept time (see Corrections).
uber-trip-dataUber's trip table: product, fare, promotion, tip, customer fare and addresses for 70 trips, plus one Prop 22 adjustment row that is not a trip.
per-ride-gps-exportBoth platforms merged, 297 rows, with endpoints and their provenance.
per-ride-routes (GeoJSON)275 GPS traces from the earlier export, matched to rides by platform, date and start time.
Earnings sheet, Prop 22 statementsDaily totals per platform, tips, charging costs; the Lyft (Oct 5–19) and Uber (Sep 28–Oct 12) guarantee statements.

How each ride's line was produced

MethodRidesRule
GPS trace229A trace from the same platform and day starting within 30 minutes of the accept time and within 2.5 miles of the pickup, and ending within half a mile of the drop-off.
Road-routed61No usable trace. Shortest driving route on OpenStreetMap (OSRM) between the reconstructed pickup and drop-off. All 49 originally untraced rides came back between 0.78× and 1.26× of the billed distance, median 1.01×; 13 more were routed after their trace proved to belong to a different ride.
Trace with gaps filled6Trace cut out mid-ride (Laurel Canyon, the 110, a Hacienda Heights start). The missing stretch is road-routed from where the trace ends to the drop-off.
Driver-recalled7The driver supplied the pickup, drop-off and, where it mattered, the roads taken; routed through those points.
Lines are styled by method on the map: solid for GPS, long dashes for road-routed, dotted where the pickup is unknown. Nothing drawn is presented as more certain than it is.

Corrections

Time columns are accept times. The handoff brief described the Lyft compact table's time as the pickup time. Comparing it row by row against Lyft's own export shows it equals the accept time on 226 of 226 rides (and the pickup time on one). All time-of-day figures are therefore on an accept-time basis and say so; the median accept-to-pickup gap of 7 minutes moves the hour bands only slightly, and the Patterns page shows both.

Thirteen traces were attached to the wrong ride by the time-window matcher, mostly on Oct 7 and Oct 11 where rides were stacked minutes apart. Each was caught the same way: the trace ended 10 to 26 miles from the ride's actual drop-off. Those traces were discarded and the rides road-routed. One loop ride with identical pickup and drop-off addresses kept its original trace, since there is nothing to route between the same point twice.

The Oct 19 GPS blackout. The phone's location trail stops around 5 PM on Oct 19 on the drive up from Hawthorne. The last Uber trip with a real trace that day ends near Hawthorne Blvd and Rosecrans, nowhere near its Koreatown drop-off; the next two Uber trips are plotted from geocoded street names, and the five Lyft rides after 5:41 PM have only accept points. Lyft's export is complete for those rides (times, fares, accept positions); only the phone trail is missing. All six affected rides, plus the truncated Uber trip, were drawn from the driver's recollection.

Earnings reconciliation. The per-ride record under-reports Lyft by about $219 against the earnings sheet. Lyft's Prop 22 statement resolved it: eligible base pay of $2,541.15 plus tips of $335.22 matches the per-ride total within $15, so the remainder is bonus money Lyft pays outside the ride record. Uber reconciles to the penny on every day.

Recalled routes

RideAs recalled
2026-10-19 16:54 UberI-110 north, exit Pico, Koreatown, ended 8th & Vermont
2026-10-19 17:41 Lyftpickup Wilshire & Carondelet, dropped at Grocery Outlet, 6th & Bixel
2026-10-19 18:01 Lyftpickup 600 block of St Paul Ave, Downtown; dropped at Main St & Avenue 20, Lincoln Heights
2026-10-19 18:22 Lyftpickup 1900 block of Zonal Ave, LAC+USC campus, dropped at Union Station East rideshare zone
2026-10-19 18:36 Lyftpickup St Louis St & New Jersey St, Boyle Heights (accepted while near Union Station), dropped at Wabash Ave & Evergreen Ave
2026-10-19 19:26 Lyftpickup 700 block of E Las Tunas Dr, San Gabriel (same passenger as the Union Station Uber, second stop); dropped at Hawaiian Supermarket, Valley Blvd & Del Mar Ave
2026-10-08 07:38 Lyftpickup 2800 block of S Bedford St, Beverlywood, dropped at LAX Terminal 3

Five of the seven route within 0.3 miles of the billed distance. The two that don't (Las Tunas → Valley & Del Mar, 2.53 routed vs 2.13 billed; Bedford → LAX T3, 7.78 vs 8.37) are ordinary route-choice differences.

Anomalies left in the data

Six rides have identical pickup and drop-off addresses with 0.8 to 5.9 billed miles (round trips or endpoint reuse). Two Oct 19 Uber rows carry geocoded endpoints whose straight-line distance exceeds the billed miles. Uber's trip-data timestamps run two to nine minutes before its compact-table times (request versus a later event). Three sub-1.4-mile Lyft rides paid $9 to $13, likely wait time or priority pricing; three rides over 12 miles paid under $0.90 a mile. Thirty-one GPS traces from the earlier export remain unmatched to any ride and are not drawn.

Context

This site is one track of a multi-model comparison on the same files: the same two stages (pattern summary, geospatial script) were run by two Claude Code tracks and by local models on the driver's own server, with a question round (the Findings page) and a scorecard to follow. The geospatial script behind the Patterns page is geo_analysis.py; its full output is preserved in the comparison record.