FastF1 v3.6.x 版本更新全解析:成绩数据增强、赛历剩余事件计算修正与绘图 API 清理
【免费下载链接】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
v3.6.0 与 v3.6.1 是 FastF1 在 2025 赛季中期的两个连续维护版本,围绕 F1 数据分析的实战痛点展开:为SessionResults新增每名车手的完赛圈数(Laps列)、修正get_events_remaining对"剩余赛事"的时间判定逻辑、在官方成绩缺失时改用实时计时数据推算初步成绩,同时按弃用时间线移除了fastf1.plotting中的一批旧常量与旧函数。阅读本文后,你将掌握这些新特性的 API 用法、底层实现原理,以及从旧绘图 API 迁移到新接口的具体步骤。
版本发布概况
v3.6.x 系列包含两个补丁级别的小版本:
| 版本 | 发布日期 | 定位 |
|---|---|---|
| v3.6.1 | 2025-09-05 | Bug 修复版本,仅含 1 项绘图常量修复 |
| v3.6.0 | 2025-07-08 | 功能版本,含新特性、Bug 修复、弃用清理与维护工作 |
两个版本均处于 2025 赛季进行期间,因此多处修复直接针对当年赛事(英国大奖赛、巴林大奖赛、澳大利亚大奖赛、迈阿密冲刺赛、蒙扎 FP1)暴露出的源数据问题。
新特性一:SessionResults新增Laps列
v3.6.0 起,正赛(Race)或冲刺赛(Sprint)结束后,每名车手完成的圈数可以通过Session.results直接获取,无需再自行对Session.laps做分组统计。
使用方式
import fastf1 session = fastf1.get_session(2025, "Monza", "R") session.load() # 查看所有车手的完赛圈数 print(session.results[["Abbreviation", "Laps"]])该列以float64类型存在于SessionResults数据框中,且只在会话类型为Race或Sprint时才填充数值,其余会话类型下保持空值。
源码实现
从 fastf1/core.py 中的SessionResults._COLUMNS定义可以看到,"Laps": "float64"已作为默认列写入类常量表。SessionResults本身是pandas.DataFrame的子类(定义于 fastf1/core.py),因此该列同样支持 pandas 的全部索引、筛选与聚合操作。值得注意的一点是:SessionResults的所有默认列总是存在,即使对当前会话不相关也不例外(源码 docstring 中对此有明确说明),因此判断某场测试赛是否包含Laps数据时,应同时检查会话类型而非仅检查列是否存在。
新特性二:get_events_remaining的时间判定逻辑修正
此前get_events_remaining在判断"哪些赛事还剩下"时存在边界缺陷:它基于赛事日期而非精确的本地起跑时间,导致在比赛周末当天调用时结果可能不准确。v3.6.0(PR #750,贡献者 @VLADOZXD)修复了这一问题,现在该函数会结合当前时刻的具体时间与每场赛事最后一个会话的开始时间来精确判定。
使用方式
import fastf1 # 返回当前赛季剩余的全部赛事(含测试) remaining = fastf1.get_events_remaining() # 排除测试赛,只看比赛周末 races = fastf1.get_events_remaining(include_testing=False) # 也可以指定一个任意时间点,获取该时间之后的所有赛事 from datetime import datetime after_aug = fastf1.get_events_remaining(datetime(2025, 8, 1))底层判定逻辑
从 fastf1/events.py 的源码实现看:
- 未显式传入
dt时,默认取当前 UTC 时间并去除时区信息(datetime.now(timezone.utc).replace(tzinfo=None)); - 对非测试赛事,取
Session5DateUtc(即最后一个会话,通常是正赛)的 UTC 时间作为比较基准; - 对测试赛事(
event.is_testing()为真),则取Session3DateUtc作为基准; - 只有会话时间严格晚于
dt的赛事才会被保留,时间早于或等于dt的赛事会被从EventSchedule中剔除。
由于赛事排期通过get_event_schedule加载(默认优先使用 FastF1 自有后端,2018 年以前的赛季自动回退到 Ergast),get_events_remaining同样支持include_testing与backend两个关键字参数,语义与get_event_schedule完全一致。
新特性三:官方成绩缺失时从计时数据推算初步成绩
在极少数情况下,Jolpica-F1 等官方成绩数据源可能尚未返回或缺失某场比赛的正式结果(例如赛事刚结束、数据仍在整理中)。v3.6.0(PR #737,贡献者 @Casper-Guo)为此增加了兜底路径:当没有任何官方成绩数据可用时,FastF1 会根据实时计时数据(timing data)计算初步的(preliminary)正赛与冲刺赛成绩,使Session.results在赛后第一时间即可读取,而无需等待官方数据就绪。
需要说明的是,这是数据缺失时的降级方案:只要官方数据源可用,仍以官方成绩为准(包括赛后罚时、取消资格等处理)。从设计定位看,它主要服务于赛后即时分析场景,例如比赛刚结束就立即拉取成绩做快速可视化。
Bug 修复详解
第一圈结束时的位置计算(2025 英国大奖赛)
修复了在 2025 年英国大奖赛中,所有车手在第一圈结束时的位置被错误计算的问题(#765)。该问题源自计时数据在第一圈的特殊处理逻辑,修复后位置序列与官方计圈数据保持一致。
轮胎信息源数据纠错(2025 澳大利亚大奖赛与迈阿密冲刺赛)
为 2025 年澳大利亚大奖赛正赛与 2025 年迈阿密大奖赛冲刺赛增加了额外的检测与纠错逻辑(#746),用于修正源数据中错误的轮胎(tyre/compound)信息。这意味着当源数据中的 compound 字段与实际进站/换胎记录矛盾时,解析层会进行校正。
缺失圈速的推算(2025 巴林大奖赛)
API 解析器现在会在源数据明确以空圈速对象(empty lap time object)标记缺失圈速的情况下,尝试用已有的分段计时(sector times)推算缺失的整圈圈速(#740)。该修复针对 2025 年巴林大奖赛中 RUS 赛车因转发器(transponder)故障导致的圈速数据空洞,保证圈速序列的完整性,避免下游分析(如最快圈、圈速分布图)因缺失值出错。
绘图车队名称匹配增强:支持短名称
绘图功能中的车队名称匹配此前只考虑标准化后的全名,导致短名称"RB F1 Team"这类车队无法被正确匹配。v3.6.0(#726,贡献者 @Casper-Guo)让匹配逻辑额外考虑车队短名称(short name)。
从 fastf1/plotting/_interface.py 的_get_team_fuzzy实现可以看到完整的匹配阶梯:先做字符串规范化并剔除 "racing"、"team"、"f1"、"scuderia" 等常见非区分词,然后依次尝试精确归一化名匹配、与全名/短名的完整匹配(identifier == team.name.casefold()或identifier == team.short_name.casefold())、归一化名的子串匹配,最后才降级到模糊字符串匹配(fuzzy_matcher,绝对置信度 0.35、相对置信度 0.30,不命中时会打印纠错警告)。
车队短名称的数据来源是绘图常量表 fastf1/plotting/constants.json,其中 2024 与 2025 赛季的车队条目里,红牛二队更名后的车队短名即为"RB"。对于常量表中未收录的新车队,fastf1/plotting/_backend.py 的_generate_team会从官方车队名中自动推导短名(依次去除 "Team"、"F1"、"Scuderia"、"Racing" 等词,并保留 "Racing Bulls" 这类特例不变)。
破坏性变更:按弃用时间线移除的绘图 API
按照 v3.4.0 中宣布的弃用时间表,v3.6.0 正式移除了fastf1.plotting中的一批旧接口。如果你仍在用这些 API,升级到 v3.6.0 及以上版本前必须完成迁移。
移除的模块级属性
以下 6 个常量属性已从fastf1.plotting移除,请改用新的绘图接口(如DriverTeamMapping、get_team_color等)或直接从常量数据中读取:
COMPOUND_COLORSDRIVER_COLORSDRIVER_TRANSLATETEAM_COLORSTEAM_TRANSLATECOLOR_PALETTE
移除的函数
以下 3 个函数已从fastf1.plotting移除:
driver_color()team_color()lapnumber_axis()
setup_mpl参数变化
- 参数
misc_mpl_mods被移除,且没有提供替代方案——它原本承载的"额外 matplotlib 模块导入"能力不再被支持; - 参数
color_scheme的默认值改为None。这意味着不再隐式套用任何配色方案,颜色将完全由绘图功能内部的配色常量与车队/车手映射决定。
迁移建议
升级到 v3.6.x 后,建议按以下步骤排查:
- 全局搜索代码中的
COMPOUND_COLORS、DRIVER_COLORS、TEAM_COLORS、COLOR_PALETTE等标识符,替换为新的面向对象绘图接口; - 将
driver_color()、team_color()调用替换为按车手/车队查询颜色的新 API; - 移除
setup_mpl(misc_mpl_mods=...)调用,或将其中的 matplotlib 模块导入移到代码顶层显式import; - 若依赖旧配色方案,需在
setup_mpl中显式传入color_scheme,不要依赖默认行为。
维护与杂项更新
- pandas 兼容性维护(#727,贡献者 @Casper-Guo):提前适配 pandas 即将到来的行为变化,并修复了因隐式类型强制转换(implicit type coercion)触发的弃用警告。这保证了 FastF1 在较新 pandas 版本下的稳定运行,也降低了未来大版本升级的断裂风险。
- 示例更新:示例"Who can still win the drivers WDC"(谁还能赢得车手总冠军)已更新为使用 2025 赛季数据(#763);画廊新增"Season Summary Visualization"(赛季总结可视化)示例(#661)。
- 文档改进:多处以文档层面进行修缮(贡献者 @Casper-Guo)。
这些示例位于 examples/standings,其中新增的赛季总结可视化示例与既有示例一起,展示了如何将 v3.6.x 的成绩与圈速 API 组合成面向整季的分析可视化。
升级到 v3.6.x 的检查清单
综合以上变更,从旧版本升级到 v3.6.0 / v3.6.1 时,重点验证以下场景:
- 结果表读取:确认
session.results["Laps"]在正赛与冲刺赛后能返回正确圈数; - 赛历剩余赛事:在比赛周末当天调用
get_events_remaining(),确认已开始的赛事不再出现在结果中(时间粒度精确到秒); - 官方数据缺失场景:模拟官方成绩未就绪时读取
session.results,确认初步成绩能正常生成; - 绘图 API:全面替换已移除的 6 个常量与 3 个函数,并处理
setup_mpl的两个参数变更; - 车队匹配:使用
"RB"、"RB F1 Team"等短名称调用绘图功能,确认能正确解析到对应车队配色。
参考资源
- 本变更日志的完整归档见 docs/changelog,其中 docs/changelog/index.rst 汇总了全部版本条目;
- 核心数据结构
SessionResults的完整列说明与源码位于 fastf1/core.py; - 赛历与剩余赛事 API 实现位于 fastf1/events.py;
- 绘图常量与车队匹配实现位于 fastf1/plotting/constants.json 与 fastf1/plotting/_interface.py;
- 相关单元测试可参考 fastf1/tests 下的
test_events.py、test_core.py、test_plotting.py等文件。
【免费下载链接】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),仅供参考