FastF1 入门基础:掌握 Session、Event、赛果与圈速数据的 Pandas 数据操作
【免费下载链接】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/getting_started/basics.rst,系统讲解如何加载 F1 赛季的赛事与场次(Session)、读取赛事信息(Event)与赛季日程(EventSchedule),并在会话数据加载(Session.load)后操作赛果(SessionResults)与圈速数据(Laps)。读完本文,你将掌握 FastF1 中最核心、使用频率最高的数据获取链路,并理解其底层基于 Pandas 的对象体系,可直接上手撰写自己的 F1 数据分析脚本。
从 Pandas 出发:FastF1 的数据模型
FastF1 的整个数据体系主要构建在 Pandas 的DataFrame与Series对象之上。如果你熟悉 Pandas,拿到 FastF1 的数据后几乎可以零成本上手;即使不熟悉,也可以借助 Pandas 文档先补充基础。
这种设计在源码中体现得非常直观:仓库在 fastf1/internals/pandas_base.py 中定义了BaseDataFrame与BaseSeries作为所有数据对象的公共基类,而核心业务对象全部继承自它们:
| 对象 | 基类 | 代表的数据 |
|---|---|---|
fastf1.core.Session | 普通类(封装会话) | 一个场次(练习赛、排位赛、冲刺赛、正赛) |
fastf1.events.Event | pandas.Series | 一个赛事周末(含多个场次) |
fastf1.events.EventSchedule | pandas.DataFrame | 一整年的赛事日程 |
fastf1.core.SessionResults | pandas.DataFrame | 单场次的赛果与车手信息 |
fastf1.core.Laps | pandas.DataFrame | 单场次中所有车手的所有单圈 |
fastf1.core.Telemetry | pandas.DataFrame | 赛车遥测数据 |
因此,你在 FastF1 中拿到的几乎每一个"表格",都可以直接使用iloc、loc、groupby、merge等标准 Pandas API 进行切片、筛选与聚合。Session是这一切的起点。
加载会话(Session):一切从fastf1.get_session开始
fastf1.core.Session对象是使用 FastF1 做任何事情的重要起点。通常你的第一步就是加载一个场次,推荐使用fastf1.get_session:
>>> import fastf1 >>> session = fastf1.get_session(2021, 7, 'Q') >>> session.name 'Qualifying' >>> session.date Timestamp('2021-06-19 13:00:00')上面这段代码加载的是2021 赛季第 7 站(法国大奖赛)的排位赛(Q)。session.name给出场次全称,session.date给出该场次的本地开始时间(2021-06-19 13:00:00)。
从 events.py 中的函数签名 可以看到,get_session接收三个核心位置参数:
def get_session(year, gp, identifier=None, *, backend=None, exact_match=False) -> Sessionyear:锦标赛年份(整数);gp:赛事名称字符串或分站序号整数。传入字符串时会做模糊匹配,传入整数时按第几站精确解析;identifier:场次标识,支持缩写、完整名称或序号三种形式。
会话标识符(identifier)一览
identifier的可选值定义在 events.py 的_SESSION_TYPE_ABBREVIATIONS常量 中:
| 缩写 | 完整名称 |
|---|---|
R | Race |
Q | Qualifying |
S | Sprint |
SQ | Sprint Qualifying |
SS | Sprint Shootout |
FP1/FP2/FP3 | Practice 1 / 2 / 3 |
此外还可以直接传完整名称(如'Qualifying')或 1~5 的序号(get_session(2021, 5, 3)表示第 5 站的第 3 场练习赛)。具体的解析逻辑在Event.get_session_name中:数字会映射到Session1~Session5列,字符串会先尝试完整名称匹配、再按缩写表查询。同时注意,'Sprint'在 2021、2022 年曾被命名为'Sprint Qualifying',FastF1 会对旧名称做静默兼容修正。
重要提醒:get_session不会加载任何数据
get_session返回的Session对象此时只包含赛事与场次的元信息,不包含计时、遥测等任何场次数据。要真正取得数据,必须随后调用session.load()(详见下文"加载赛果"一节)。这一点在 get_session 的 docstring 中有明确说明。
认识 Event:一场赛事周末的完整信息
上一节的session到底属于哪一站比赛?答案在session.event属性中。Event对象持有关于每个赛事的全部信息,一个 Event 通常由多个 Session 组成(练习赛、排位赛、正赛等),可通过 session 对象直接访问:
>>> session.event RoundNumber 7 Country France Location Le Castellet OfficialEventName FORMULA 1 EMIRATES GRAND PRIX DE FRANCE 2021 EventDate 2021-06-20 00:00:00 EventName French Grand Prix EventFormat conventional Session1 Practice 1 Session1Date 2021-06-18 11:30:00+02:00 Session1DateUtc 2021-06-18 09:30:00 Session2 Practice 2 Session2Date 2021-06-18 15:00:00+02:00 Session2DateUtc 2021-06-18 13:00:00 Session3 Practice 3 Session3Date 2021-06-19 12:00:00+02:00 Session3DateUtc 2021-06-19 10:00:00 Session4 Qualifying Session4Date 2021-06-19 15:00:00+02:00 Session4DateUtc 2021-06-19 13:00:00 Session5 Race Session5Date 2021-06-20 15:00:00+02:00 Session5DateUtc 2021-06-20 13:00:00 F1ApiSupport True Name: 7, dtype: object这段输出包含了非常丰富的信息:
- 赛事标识:
RoundNumber(第 7 站)、Country、Location(赛道所在地)、OfficialEventName(官方全名)、EventName(通用名)、EventFormat(conventional常规赛制;冲刺赛周末则为sprint、sprint_shootout或sprint_qualifying等); - 场次时间:
Session1~Session5依次对应 Practice 1 / 2 / 3、Qualifying、Race;每场都有两列时间——SessionXDate为带时区的本地时间(如2021-06-18 11:30:00+02:00),SessionXDateUtc为不含时区的 UTC 时间;EventDate是正赛当天的日期(时间归零); - 数据支持:
F1ApiSupport标识该场次是否支持通过 F1 官方 API 获取计时数据(2018 年及以后通常为True)。
Event 是 pandas.Series 的子类
Event类继承自pandas.Series(源码见 events.py 中的 Event 定义),因此它的每个字段都可以像操作 Series 一样通过键访问:
>>> session.event['EventName'] 'French Grand Prix' >>> session.event['EventDate'] # 这是正赛当天 Timestamp('2021-06-20 00:00:00')Event还额外提供了一些面向 F1 语义的方法:is_testing()判断是否为测试赛,以及按场次取 Session 的便捷方法(见下一节)。
直接加载 Event,并从 Event 取回 Session
除了通过session.event间接访问,你还可以用fastf1.get_event直接加载一个赛事:
>>> event = fastf1.get_event(2021, 7) >>> event RoundNumber 7 Country France ...(内容与上文 session.event 完全一致)... F1ApiSupport True Name: 7, dtype: object >>> session = event.get_race() >>> session.name 'Race'Event对象反过来提供了获取其下属场次的方法,全部封装在 events.py 中:
| 方法 | 返回的场次 |
|---|---|
event.get_race() | 正赛 |
event.get_qualifying() | 排位赛 |
event.get_sprint()/event.get_sprint_shootout()/event.get_sprint_qualifying() | 冲刺赛相关场次(视年份赛制而定) |
event.get_practice(1/2/3) | 指定的练习赛 |
从 Event.get_session 的实现 可以看出,这些便捷方法最终都会落到get_session(identifier),并以当前 Event 的信息构造出对应的Session对象。
按名称加载:模糊匹配机制与使用注意事项
除分站序号外,你也可以用具有明确辨识度的名称来加载赛事:
>>> event = fastf1.get_event(2021, 'French Grand Prix') >>> event['EventName'] 'French Grand Prix'支持部分匹配,但并非总是精确
你并不需要提供完全准确的赛事名称——FastF1 会返回与所给名称最匹配的赛事,即使拼写不完整,命中正确赛事的概率也很高:
>>> event = fastf1.get_event(2021, 'Spain') >>> event['EventName'] 'Spanish Grand Prix'但请注意,这并不总是有效:有时候另一个名字会与你的输入匹配得更好。例如,我们想要的其实是'Emilia Romagna Grand Prix',但由于输入不够完整/准确,FastF1 返回了'Belgian Grand Prix'——原因很简单:FastF1 并不是一个"智能搜索引擎",它只是做字符串的近似匹配。所以务必检查返回结果:
>>> event = fastf1.get_event(2021, 'Emilian') >>> event['EventName'] 'Belgian Grand Prix' # 匹配到了错误的赛事!只要再精确一点就能得到正确结果:
>>> event = fastf1.get_event(2021, 'Emilia Romagna') >>> event['EventName'] 'Emilia Romagna Grand Prix'按国家或赛道地点加载
赛事还可以用国家名或赛道所在城市/地区加载:
>>> session = fastf1.get_session(2021, 'Silverstone', 'Q') >>> session.event['EventName'] 'British Grand Prix'模糊匹配的底层实现
这一机制的源码位于 EventSchedule._fuzzy_event_search。要点如下:
- 匹配时会综合Location(地点)、Country(国家)、EventName(赛事名)、OfficialEventName(官方全名)四个字段作为参考字符串;
- 匹配前会先剔除常见词汇:
"formula 1"、"grand prix"、"gp"以及年份字符串; - 剔除常见词后,剩余部分长度小于 4 个字符会直接抛出
ValueError(这就是为什么'gp'、'f1'这类输入不可用); - 底层使用模糊匹配器(见 fastf1/internals/fuzzy.py),并设置绝对置信度阈值 0.5、相对置信度阈值 0.1;
- 若匹配结果并非完全精确,日志会输出
Correcting user input '...' to '...'提示你输入被纠正成了什么。
开启精确匹配
如果你希望严格精确匹配,可以给get_event/get_session传入exact_match=True(实现见 events.py)。此时必须提供与EventName完全一致的名称(忽略大小写),否则抛出KeyError:
>>> event = fastf1.get_event(2021, 'British Grand Prix', exact_match=True) # 正常 >>> event = fastf1.get_event(2021, 'British', exact_match=True) # 抛 KeyError官方文档还给出了一条实用建议:输入名称时应尽量避免常见词,例如用'Belgium'而不是'Belgian Grand Prix',以降低误匹配概率。
赛事日程(EventSchedule):一整年的大名单
与其加载单个赛事或场次,你也可以加载整个赛季的完整赛程。EventSchedule是pandas.DataFrame的子类(源码定义):
>>> schedule = fastf1.get_event_schedule(2021) >>> schedule RoundNumber Country ... Session5DateUtc F1ApiSupport 0 0 Bahrain ... NaT False 1 1 Bahrain ... 2021-03-28 15:00:00 True 2 2 Italy ... 2021-04-18 13:00:00 True 3 3 Portugal ... 2021-05-02 14:00:00 True 4 4 Spain ... 2021-05-09 13:00:00 True 5 5 Monaco ... 2021-05-23 13:00:00 True 6 6 Azerbaijan ... 2021-06-06 12:00:00 True 7 7 France ... 2021-06-20 13:00:00 True 8 8 Austria ... 2021-06-27 13:00:00 True 9 9 Austria ... 2021-07-04 13:00:00 True 10 10 Great Britain ... 2021-07-18 14:00:00 True 11 11 Hungary ... 2021-08-01 13:00:00 True 12 12 Belgium ... 2021-08-29 13:00:00 True 13 13 Netherlands ... 2021-09-05 13:00:00 True 14 14 Italy ... 2021-09-12 13:00:00 True 15 15 Russia ... 2021-09-26 12:00:00 True 16 16 Turkey ... 2021-10-10 12:00:00 True 17 17 United States ... 2021-10-24 19:00:00 True 18 18 Mexico ... 2021-11-07 19:00:00 True 19 19 Brazil ... 2021-11-14 17:00:00 True 20 20 Qatar ... 2021-11-21 14:00:00 True 21 21 Saudi Arabia ... 2021-12-05 17:30:00 True 22 22 Abu Dhabi ... 2021-12-12 13:00:00 True [23 rows x 23 columns]日程表共23 列,列名如下(与Event的字段一一对应):
>>> schedule.columns Index(['RoundNumber', 'Country', 'Location', 'OfficialEventName', 'EventDate', 'EventName', 'EventFormat', 'Session1', 'Session1Date', 'Session1DateUtc', 'Session2', 'Session2Date', 'Session2DateUtc', 'Session3', 'Session3Date', 'Session3DateUtc', 'Session4', 'Session4Date', 'Session4DateUtc', 'Session5', 'Session5Date', 'Session5DateUtc', 'F1ApiSupport'], dtype='object')注意上表第 0 行:RoundNumber=0、Session5DateUtc=NaT、F1ApiSupport=False的巴林记录是季前测试赛(EventFormat="testing")。2021 年 23 行数据 = 1 次测试赛 + 22 场大奖赛。
从日程表中挑选特定赛事
EventSchedule提供了两个内置选择方法(源码):
>>> gp_12 = schedule.get_event_by_round(12) >>> gp_12['Country'] 'Belgium' >>> gp_austin = schedule.get_event_by_name('Austin') >>> gp_austin['Country'] 'United States'get_event_by_round(round_number):按分站序号取,序号不存在会抛ValueError;测试赛的 round 为 0,无法用此方法获取;get_event_by_name(name, exact_match=False):名称匹配逻辑与上文模糊匹配完全一致。
日程表的数据来源(backend 参数)
get_event_schedule还接受一个backend参数,控制数据来源,源码逻辑见 events.py:
| backend | 说明 | 支持范围 |
|---|---|---|
'fastf1' | FastF1 官方后端,功能最完整 | 2018 年至今 |
'f1timing' | 基于 F1 live timing API,无计时数据的场次不会列出 | 2018 年至今 |
'ergast' | 基于 Ergast 数据库,无本地时间、无计时数据可用性信息 | 1950 年至今 |
不指定backend时:默认优先使用'fastf1',失败后依次回退到'f1timing'、'ergast';若年份早于 2018,则直接使用'ergast'。该回退机制体现在 get_event_schedule 的调用链 中。此外get_event_schedule(year, include_testing=False)可排除测试赛,配套函数get_events_remaining()则返回赛季剩余赛事。
关于日程表每一列的详细说明,可参见 docs/api_reference/events.rst 中的 event-schedule 章节。
加载赛果:Session.load与session.results
到目前为止我们创建的 Session "还什么都没做",是时候让它变得有趣了:查看一场排位赛的赛果。前提是调用Session.load,它会从各个 API 拉取该场次所有可用的数据:
>>> session = fastf1.get_session(2021, 'French Grand Prix', 'Q') >>> session.load() >>> session.results DriverNumber BroadcastName Abbreviation ... Status Points Laps 33 33 M VERSTAPPEN VER ... NaN NaN 44 44 L HAMILTON HAM ... NaN NaN 77 77 V BOTTAS BOT ... NaN NaN 11 11 S PEREZ PER ... NaN NaN 55 55 C SAINZ SAI ... NaN NaN 10 10 P GASLY GAS ... NaN NaN 16 16 C LECLERC LEC ... NaN NaN 4 4 L NORRIS NOR ... NaN NaN 14 14 F ALONSO ALO ... NaN NaN 3 3 D RICCIARDO RIC ... NaN NaN 31 31 E OCON OCO ... NaN NaN 5 5 S VETTEL VET ... NaN NaN 99 99 A GIOVINAZZI GIO ... NaN NaN 63 63 G RUSSELL RUS ... NaN NaN 47 47 M SCHUMACHER MSC ... NaN NaN 6 6 N LATIFI LAT ... NaN NaN 7 7 K RAIKKONEN RAI ... NaN NaN 9 9 N MAZEPIN MAZ ... NaN NaN 18 18 L STROLL STR ... NaN NaN 22 22 Y TSUNODA TSU ... NaN NaN [20 rows x 22 columns]数据下载与处理通常需要几秒钟。强烈建议启用 FastF1 内置的缓存功能来加速重复加载并避免过多的 API 请求,具体用法参见 docs/api_reference/cache_and_rate_limits.rst。
Session.load的参数与加载内容
load 方法签名 如下:
session.load(*, laps=True, telemetry=True, weather=True, messages=True, livedata=None)laps=True:加载圈速数据、赛道状态、场次状态等;telemetry=True:加载遥测数据(速度、转速、油门等);weather=True:加载天气数据;messages=True:加载赛事播报(Race Control)消息;livedata:可传入本地保存的 live timing 数据作为数据源,替代 API 请求。
默认会加载全部数据。官方文档建议保持全量加载,因为 FastF1 内部会混合多个数据端点来纠错和补充信息;部分数据不可用时它会尽力降级返回。
加载完成后,Session还暴露了一大批只读属性(定义见 core.py):drivers(参赛车手列表)、laps、results、weather_data、car_data、pos_data、session_status、track_status、race_control_messages、session_start_time等。若你在未调用load()前访问这些属性,会抛出DataNotLoadedError(实现见 _get_property_warn_not_loaded),提醒你先加载数据。
SessionResults:赛果数据对象
session.results返回的是fastf1.core.SessionResults,同样是pandas.DataFrame的子类(类定义)。它的22 列如下:
>>> session.results.columns Index(['DriverNumber', 'BroadcastName', 'Abbreviation', 'DriverId', 'TeamName', 'TeamColor', 'TeamId', 'FirstName', 'LastName', 'FullName', 'HeadshotUrl', 'CountryCode', 'Position', 'ClassifiedPosition', 'GridPosition', 'Q1', 'Q2', 'Q3', 'Time', 'Status', 'Points', 'Laps'], dtype='object')其中值得重点说明的列(详细语义见 core.py 中的列文档):
DriverNumber/Abbreviation/BroadcastName/FullName:车手编号、三字母缩写、播报名、全名;TeamName/TeamColor/TeamId:车队名(无冠名赞助商)、车队代表色(十六进制值)、车队 ID;Position:最终名次(会考虑赛后处罚与取消资格),而ClassifiedPosition是官方分级结果,可能是整数或"R"(退赛)/"D"(取消资格)/"E"(除名)/"W"(退出)/"F"(未晋级)/"N"(未分级);Q1/Q2/Q3:排位赛三节的最快圈(仅排位类场次有值),类型为pd.Timedelta;GridPosition:发车位置(仅正赛/冲刺类场次有值);Time:正赛类为总用时,练习类为最快圈;Status:完赛状态,如'Finished'、'+ 1 Lap'、'Crash'、'Gearbox'等。
需要注意:所有列始终存在,即使对当前场次没有意义(如排位赛中GridPosition、Points为NaN)。
实战示例:显示前十名车手及其 Q3 时间
赛果按完赛名次排序,因此取前 10 名非常直接:
>>> session.results.iloc[0:10].loc[:, ['Abbreviation', 'Q3']] Abbreviation Q3 33 VER 0 days 00:01:29.990000 44 HAM 0 days 00:01:30.248000 77 BOT 0 days 00:01:30.376000 11 PER 0 days 00:01:30.445000 55 SAI 0 days 00:01:30.840000 10 GAS 0 days 00:01:30.868000 16 LEC 0 days 00:01:30.987000 4 NOR 0 days 00:01:31.252000 14 ALO 0 days 00:01:31.340000 3 RIC 0 days 00:01:31.382000圈速以Timedelta表示,恰好能体现 Pandas 数据模型的便利——直接做数值比较与排序即可,无需手动解析时间字符串。
圈速数据(Laps):所有车手的每一个单圈
Session.laps属性返回fastf1.core.Laps对象(pandas.DataFrame的子类,类定义见 core.py),包含该场次所有车手跑出的全部单圈:
>>> session = fastf1.get_session(2021, 'French Grand Prix', 'Q') >>> session.load() >>> session.laps Time Driver ... FastF1Generated IsAccurate 0 0 days 00:17:35.479000 GAS ... False False 1 0 days 00:27:42.702000 GAS ... False False 2 0 days 00:30:15.038000 GAS ... False False 3 0 days 00:31:46.936000 GAS ... False True 4 0 days 00:34:20.695000 GAS ... False False .. ... ... ... ... ... 265 0 days 00:54:22.881000 GIO ... False True 266 0 days 01:00:32.369000 GIO ... False False 267 0 days 01:03:24.940000 GIO ... False False 268 0 days 01:04:56.753000 GIO ... False True 269 0 days 01:06:42.885000 GIO ... False False [270 rows x 31 columns]一场排位赛就有超过 250 圈、31 列信息。可用列如下:
>>> session.laps.columns Index(['Time', 'Driver', 'DriverNumber', 'LapTime', 'LapNumber', 'Stint', 'PitOutTime', 'PitInTime', 'Sector1Time', 'Sector2Time', 'Sector3Time', 'Sector1SessionTime', 'Sector2SessionTime', 'Sector3SessionTime', 'SpeedI1', 'SpeedI2', 'SpeedFL', 'SpeedST', 'IsPersonalBest', 'Compound', 'TyreLife', 'FreshTyre', 'Team', 'LapStartTime', 'LapStartDate', 'TrackStatus', 'Position', 'Deleted', 'DeletedReason', 'FastF1Generated', 'IsAccurate'], dtype='object')所有列的详细解释可在Laps类的 API 文档中找到(对应 docs/api_reference/timing_data.rst 等章节)。这里先给出几个高频字段的快速参考:
Time/LapStartTime:该圈被记录的时刻 / 该圈开始时刻(Timedelta);LapTime:圈速用时;Sector1Time/Sector2Time/Sector3Time:三段计时;LapNumber:圈号;Stint:进站前的"stint"序号;Compound/TyreLife/FreshTyre:轮胎配方(SOFT/MEDIUM/HARD/INTERMEDIATE/WET 等)、轮胎使用圈数、是否新胎;IsPersonalBest:是否为该车手全场最快圈(个人最快);Deleted/DeletedReason:该圈是否因违规(如超出赛道限制)被删除;FastF1Generated/IsAccurate:标记 FastF1 补生成的圈(如事故/退赛场景)与数据准确性;SpeedI1/SpeedI2/SpeedFL/SpeedST:三个速度陷阱点与直道尾速。
Laps的专属选择方法
Laps并非简单的 DataFrame——和 FastF1 的其他数据对象一样,它提供了专门面向 F1 数据的增强方法(源码见 core.py)。其中出场率最高的是pick_fastest():
>>> fastest_lap = session.laps.pick_fastest() >>> fastest_lap['LapTime'] Timedelta('0 days 00:01:29.990000') >>> fastest_lap['Driver'] 'VER'pick_fastest的默认行为(实现见 core.py)值得展开说明:
- 默认只考虑
IsPersonalBest == True的圈。如果按LapTime最快的圈并非个人最快(例如因超出赛道限制被删除成绩),该圈不会被选中——这正是排位赛场景下"最快圈"与"杆位圈"需要区分的细节; - 如果没有任何圈被标记为个人最快,或
self中没有圈,则返回None; - 传入
only_by_time=True可以关闭个人最快校验,直接返回LapTime最小的那一圈; - 若出现多个同时间的圈,取第一个被记录到的。
此外常用的还有:
# 107% 规则:返回比全场最快圈慢不超过 threshold 倍的所有圈 quick_laps = session.laps.pick_quicklaps() # 默认 1.07 quick_laps = session.laps.pick_quicklaps(threshold=1.05) # 自定义 105% # 按轮胎配方筛选 soft_laps = session.laps.pick_compounds("SOFT") slick_laps = session.laps.pick_compounds(['SOFT', 'MEDIUM', 'HARD'])pick_quicklaps默认阈值来自Laps.QUICKLAP_THRESHOLD(107%),pick_compounds则接受单个字符串或字符串列表(core.py 实现)。
圈速数据的可视化延伸
官方仓库提供了大量基于这些数据的绘图示例。与本文最贴合的当属 examples/results_strategy/plot_qualifying_results.py——它正是从session.laps.pick_fastest()出发,将各车手的最快圈速绘制成排位赛成绩对比图,是理解本指南全部内容的完美实战收尾。更多示例见 examples 目录,涵盖圈速分布、策略分析、遥测对比等主题。
小结:一次完整的入门工作流
将本文内容串成一段可运行的完整流程:
import fastf1 # 1. 加载场次(名称模糊匹配 + 会话缩写) session = fastf1.get_session(2021, 'French Grand Prix', 'Q') # 2. 查看赛事信息(Event 是 pandas.Series) print(session.event['EventName'], session.event['Country']) # 3. 加载全部场次数据(建议配合 FastF1 缓存) session.load() # 4. 查看赛果与圈速 print(session.results[['Abbreviation', 'Q3']].head(10)) pole = session.laps.pick_fastest() print(pole['Driver'], pole['LapTime']) # 5. 加载整年赛程并定位特定赛事 schedule = fastf1.get_event_schedule(2021) print(schedule.get_event_by_round(12)['Country'])核心要点回顾:
- 对象体系:FastF1 的一切数据都以 Pandas
DataFrame/Series子类呈现(Event、EventSchedule、SessionResults、Laps),可无缝使用 Pandas API; - 加载三兄弟:
get_session(year, gp, identifier)、get_event(year, gp)、get_event_schedule(year),其中gp支持序号与名称(含模糊匹配),identifier支持缩写/名称/序号; - 名称匹配有风险:模糊匹配不是智能搜索,务必核对返回的
EventName,必要时用exact_match=True; - 先 load 再取数:
get_session只返回空壳对象,所有场次数据都要在session.load()之后才能访问,否则会抛DataNotLoadedError; - 记住 F1 特有列:
Q1/Q2/Q3、Compound、IsPersonalBest、Deleted、FastF1Generated等列承载着赛车运动特有的语义,选圈、筛选时务必理解其含义。
掌握了这些基础,你就可以在此基础上继续深入 docs/getting_started/installation.rst 完成环境安装,并进阶学习遥测数据、圈速可视化与策略分析等更高阶主题。
【免费下载链接】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),仅供参考