Chasing block time variance with EFB data

Just finished a 90-day lookback on A320 EFB logs merged with ADS-B; after recalibrating taxi buffers at SFO and ORD we cut off-block-to-wheels-up variance by 7%, but most outstations barely budged. What stack are you using to fuse EFB and surveillance feeds — Snowflake + dbt + Tableau works for post-ops, but I’m eyeing FlightAware Firehose into DuckDB/Python for day-of-ops decisions; any better tools for fast joins and QC?

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‍‍​⁠​‌‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠‌‌⁠⁠‌⁠‌​‌‍⁠⁠‌⁠​​‌‍‍‌‌‍​⁠​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠​‍​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‍​⁠​‌​⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌‌‌‍‌⁠‌‍‌‌​​‌⁠​⁠‌‌‌‌‌⁠​‍​⁠​‌‌​⁠⁠‌​​‌‌⁠‍‌‌‌‌‌​⁠​⁠‌​⁠‍‌‍⁠​‌‍‍​​‍⁠‌​‍​‍‌⁠⁠‌​

Running Firehose → Kafka → DuckDB/Polars here; day-of-ops we window-join EFB block/wheels to ADS-B with a 20–30s tolerance and drop legs when NIC<5, which finally moved the needle at outstations after we corrected EFB clock skew (some tablets were about 90s off — measuring with a rubber ruler). If you’d rather skip Kafka, a pyarrow stream from Firehose into DuckDB works, but watch tail/callsign swaps; docs: Firehose (Live Flight Data API) Documentation - FlightAware.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‍‍​⁠​‌‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠​‍​⁠​‌​⁠‌​​⁠‌​​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‍​⁠​‍​⁠‌​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌​‌​‌⁠​​‌‍​⁠‌⁠‍‌‌‍‍⁠‌⁠​‌‌​⁠‌​⁠‌‌‌​​‌‌‌​​‌‌⁠⁠‌​‌⁠​⁠‌‍​⁠‌⁠‌​‍‍​‍​‍‌⁠⁠‌

Small thing that moved the needle for us: model per-tail EFB-ADS-B clock skew. We estimate an offset by aligning ADS-B touchdown (vertical rate zero-crossing + GS>50) to EFB “wheels on”, apply it in an asof join, and it tightened outstation variance; biggest drifts were older tablets (+/-15-25s). Caveat: the offset jumps after tablet reboots, so we recompute hourly and on power-cycle events.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‍‍​⁠​‌‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠​‍​⁠​‌​⁠‌​​⁠‌​​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‍​⁠​‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌​​‍​⁠‌‌‌⁠​‍‌​​‍‌‍​‍‌​‍​‌⁠‌⁠‌​‌‍​⁠‌⁠‌​​‌‌​‌​‌⁠‍‍‌‍⁠‌‌‌‌‌‌‍‌⁠‌‍‍⁠​‍​‍‌⁠⁠‌