与巴西大奖赛 Sprint 赛程补丁)
FastF1 v2.1.11 深入解析修复 Laps 中缺失的进站圈Inlap与巴西大奖赛 Sprint 赛程补丁【免费下载链接】Fast-F1FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-F1导读本文围绕 FastF1 开源仓库 docs/changelog/v2.1.11.rst 记录的两个变更展开其一修复了Laps数据中最后一圈进站圈last inlap缺失的问题其二为2021 年巴西大奖赛 Sprint 冲刺赛周末补充了赛程补丁。文章将结合 fastf1/_api.py、fastf1/core.py 与 fastf1/events.py 的源码实现说明这两处变更背后的数据流水线与赛程解析逻辑帮助你理解 FastF1 如何还原真实的比赛圈数据、如何兼容不同年份的赛制命名差异并掌握用session.laps检查进站圈、用get_event_schedule查看赛程格式的实战方法。v2.1.11 变更概览v2.1.11 是 FastF1 2.1.x 系列的一次小型维护版本变更内容集中在数据正确性方面FixLaps中最后一圈进站圈last inlap缺失Add为巴西大奖赛 Sprint 冲刺赛周末添加赛程补丁schedule patch两条变更分别作用于 FastF1 的两条核心数据链路——圈速数据处理timing/laps pipeline与赛季赛程解析event schedule pipeline。下面逐一展开。一、修复Laps中最后一圈进站圈缺失1.1 什么是 inlap / outlap在 F1 比赛中车手进站换胎时会产生两类特殊圈inlap进站圈车手从赛道上驶入维修区的那一圈其圈时通常极慢甚至没有官方计时outlap出站圈车手换胎后从维修区驶出、重新上赛道的那一圈。FastF1 的圈数据中通过两列时间戳来标记这两种圈见 fastf1/_api.py 的_extended_timing_data文档说明PitInTime进站时间若某行此值不是 NaT则该圈是 inlapPitOutTime出站时间若某行此值不是 NaT则该圈是 outlap。因此判断某圈是否为进站圈的标准非常简单import fastf1 session fastf1.get_session(2021, Mexico City, Q) session.load(telemetryFalse) laps session.laps # 找出所有进站圈 inlaps laps[laps[PitInTime].notna()] print(inlaps[[Driver, LapNumber, LapTime, PitInTime]])1.2 问题根源最后一圈被当作空记录丢弃在 v2.1.11 之前Laps数据有时会丢失车手在赛段结束时最后一次进站的那一圈。问题出在 fastf1/_api.py 的圈数据收尾逻辑中# last lap needs to be removed if it does not have a Time and # it could not be calculated (likely an inlap) if pd.isnull(drv_data[Time][-1]): if not pd.isnull(drv_data[PitInTime][-1]): drv_data[Time][-1] drv_data[PitInTime][-1] else: for key in drv_data: drv_data[key] drv_data[key][:-1]这段代码的语义是若最后一圈没有Time官方计时缺失先尝试用PitInTime兜底作为该圈时间若连PitInTime也没有才判定这只是一条空记录例如比赛结束后残留的计圈增量将其从所有列中删掉drv_data[key] drv_data[key][:-1]。v2.1.11 的修复正是确保当最后一圈确实是进站圈存在PitInTime时该圈被保留并以进站时间作为其圈时估计而不是误判为空记录删除。1.3 为什么最后一圈在时序数据里容易出问题从 fastf1/core.py 的Laps文档注释可以看到FastF1 对圈数据的末尾做了很多补全工作Lap data: drivers crashing and retiringDuring a session:An additional last lap is added for a driver if the last timed lap of a driver is not an inlap and the session is aborted next. TheTimefor when this lap was set will be set to the time at which the session was aborted.也就是说当车手在红旗或比赛结束时以非进站圈收尾FastF1 会额外补一圈并把圈时设为赛段中止时刻。这一逻辑位于 fastf1/core.py 附近的会话状态循环中其中明确处理了两种最后一圈是进站圈的情形if not pd.isna(drv_laps[PitInTime].iloc[-1]): # last lap was an inlap continue if ((len(drv_laps) 2) and (not pd.isna(drv_laps[PitInTime].iloc[-2])) and pd.isna(drv_laps[PitOutTime].iloc[-1])): # last lap was an inlap and a new lap was started in the pit # lane but the car did not leave the pits again (happens if # box comes after timing line in pits) continue第一段若最后一圈已经是 inlapPitInTime非空则不再追加补圈第二段若倒数第二圈是 inlap 且最后又启动了一圈但车始终没驶出维修区进站口位于计时线之后时的特殊情形也不再追加。可见进站圈在 FastF1 的末尾圈处理中扮演着哨兵角色——它的存在与否直接影响 FastF1 是否判定需要补全额外一圈。v2.1.11 修复的last inlap missing正是为了保证这条哨兵逻辑能拿到正确的输入。1.4 测试用例印证仓库测试 fastf1/tests/test_input_data_handling.py 提供了直接回归验证pytest.mark.f1telapi def test_inlap_added(): session fastf1.get_session(2021, Mexico City, Q) session.load(telemetryFalse) last session.laps.pick_drivers(PER).iloc[-1] assert not pd.isnull(last[PitInTime]) assert not pd.isnull(last[Time])该用例选取 2021 年墨西哥城站排位赛断言车手 PER佩雷兹的最后一圈同时满足PitInTime不为空证明该圈确实是进站圈Time不为空证明进站圈被正确保留并补上了圈时。这正是 v2.1.11 修复行为的可复现验证。你可以直接运行pytest fastf1/tests/test_input_data_handling.py -k inlap注意该用例带有pytest.mark.f1telapi标记需要联网访问 FastF1 的实时计时数据源才能通过。1.5 实战建议进站圈数据的使用姿势做策略分析进站次数、换胎时机时优先用PitInTime/PitOutTime两列判断进站圈与出站圈不要依赖LapTime是否异常偏慢排位赛最后一圈是飞驰圈fast lap还是进站圈会直接影响最后成绩的解读建议始终检查最后一行的PitInTime如果需要对最后一圈做计算如 delta、车手圈速序列的末尾注意 FastF1 可能对红旗中止、退赛、进站等场景追加或保留补全圈其Time可能是进站时间或赛段中止时刻而非真实的计时成绩。二、新增巴西大奖赛 Sprint 赛程补丁2.1 背景2021 年巴西大奖赛的 Sprint 周末2021 年是 F1 首次试行 Sprint 冲刺赛制的一年当年共三场英国、意大利、巴西。巴西站作为其中的 Sprint 周末其赛程结构与常规周末不同而 F1 官方数据源的赛程描述存在不一致例如 2021 年官方一度把冲刺赛命名为 Sprint Qualifying而非后来的 SprintFastF1 需要额外的赛程补丁来正确识别。2.2 赛程解析的源码支撑FastF1 的赛程获取入口是 fastf1/events.py 的get_event_schedule它按优先级依次尝试三个后端_backends_named_order { fastf1: _get_schedule_ff1, f1timing: _get_schedule_from_f1_timing, ergast: _get_schedule_from_ergast }对于 2018 年及以后的赛季默认先使用 FastF1 自身后端失败后再回退到 f1timing / ergast2018 年以前则始终使用 ergast。赛程解析时需要处理大量命名特例例如 fastf1/events.py 中按年份区分周末格式elif year in (2021, 2022): if sessions[3][Name] Sprint Qualifying: # fix for 2021 where Sprint was called Sprint Qualifying sessions[3][Name] Sprint if sessions[3][Name] Sprint: data[EventFormat].append(sprint) else: data[EventFormat].append(conventional)2021 年巴西站的 Sprint 周末补丁正是在这一类逻辑上打补丁将官方数据中第 4 场下标 3的 Sprint Qualifying 修正为 Sprint并把该周末的EventFormat标记为sprint从而保证后续Session对象的赛会格式、session 名称与数据加载行为正确。session 名称缩写映射表见 fastf1/events.py_SESSION_TYPE_ABBREVIATIONS { R: Race, Q: Qualifying, S: Sprint, SQ: Sprint Qualifying, SS: Sprint Shootout, FP1: Practice 1, FP2: Practice 2, FP3: Practice 3 }此外fastf1/_api.py 还保留着一个与之相关的历史 workaround 注释Workaround for Brazil Qualifying on sunday (#652)——即 2021 巴西站的排位赛在周日举行因雨延后的特殊安排也曾在数据层做过兼容处理说明巴西站周末历来是赛程解析的重点关注对象。2.3 验证与使用查看周末格式你可以用以下代码确认任意赛季各周末的赛制格式import fastf1 schedule fastf1.get_event_schedule(2021, include_testingFalse) brazil schedule[schedule[EventName] Brazil] print(brazil[[RoundNumber, EventName, EventFormat, Session1, Session2, Session3, Session4, Session5]])预期输出中巴西站的EventFormat为sprintSession4为Sprint、Session5为Race。加载该周末的冲刺赛数据时也请使用统一的 session 标识符sprint fastf1.get_session(2021, Brazil, S) # S Sprint sprint.load()FastF1 在 fastf1/core.py 中还会根据年份区分赛会命名2021 年Sprint Qualifying被当作 race-like 赛会实际上就是 Sprint 本身2024 年起Sprint Qualifying才是真正的排位冲刺赛决定 Sprint 发车顺位而Sprint Shootout这一旧名被弃用。理解这些命名规则是正确加载历史 Sprint 周末数据的前提。三、版本上下文v2.1.x 系列中的位置将 v2.1.11 放在版本时间线上看它紧随 docs/changelog/v2.1.10.rst该版本为 Ergast API 请求引入了自定义 User-Agent用于识别 FastF1 客户端之后发布。v2.1.11 的侧重点从与数据源的兼容沟通转向数据本身正确性v2.1.10请求身份标识 → 保障 Ergast 数据源可用性v2.1.11进站圈数据完整性 Sprint 周末赛程准确性 → 保障核心数据质量。从 fastf1/events.py 可以看到FastF1 的赛程后端还会从维护的 f1schedule 数据源拉取最新赛程_SCHEDULE_BASE_URL并携带User-Agent: FastF1/版本号请求头。这类赛程补丁schedule patch本质上是对官方数据源不完善、命名不一致的兜底修正属于 FastF1 持续维护的数据兼容层工作。四、总结v2.1.11 的两个变更可以这样概括变更影响范围核心位置验证方式修复 last inlap 缺失Laps圈速数据完整性fastf1/_api.pytest_input_data_handling.py 中test_inlap_added巴西 Sprint 周末赛程补丁EventSchedule赛程/命名解析fastf1/events.pyget_event_schedule(2021)查看EventFormat对使用者而言升级到 v2.1.11或任何包含该修复的更新版本后分析 2021 年及以前赛季的圈数据时车手最后一圈如果是进站圈将不会再从Laps中消失PitInTime与Time两列都会被正确填充加载 2021 巴西站 Sprint 周末时赛程与 session 命名将按 Sprint 而非 Sprint Qualifying 解析避免数据加载或筛选错位。建议读者在阅读本文后结合 docs/api_reference/loading_data.rst数据加载 API与 docs/api_reference/laps圈数据 API继续深入了解Laps与EventSchedule的完整字段定义。【免费下载链接】Fast-F1FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-F1创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考