Basic session loading
Copy
Ask AI
import tif1
# Load a session
session = tif1.get_session(2025, "Abu Dhabi Grand Prix", "Race")
# Access lap data
laps = session.laps
print(f"Total laps: {len(laps)}")
```python
## Working with Drivers
```python
# Get all drivers in the session
drivers_df = session.drivers_df
print(drivers_df[["Driver", "Team", "DriverNumber"]])
# Get specific driver
ver = session.get_driver("VER")
ver_laps = ver.laps
# Get driver's fastest lap
fastest = ver.get_fastest_lap()
print(f"Fastest lap: {fastest['LapTime'].iloc[0]}")
```python
## Telemetry Analysis
```python
# Get telemetry for a specific lap
lap = ver.get_lap(19)
telemetry = lap.telemetry
# Analyze speed and throttle
print(telemetry[["Time", "Speed", "Throttle", "Brake"]].head())
# Find maximum speed
max_speed = telemetry["Speed"].max()
print(f"Max speed: {max_speed} km/h")
```python
## Fastest Laps
```python
# Get fastest lap per driver
fastest_by_driver = session.get_fastest_laps(by_driver=True)
print(fastest_by_driver[["Driver", "LapTime", "Compound"]])
# Get overall fastest lap
overall_fastest = session.get_fastest_laps(by_driver=False)
# Get telemetry for fastest laps (parallel fetching)
fastest_tels = session.get_fastest_laps_tels(by_driver=True)
# Get telemetry for specific drivers
top3_tels = session.get_fastest_laps_tels(
by_driver=True,
drivers=["VER", "HAM", "LEC"]
)
```python
## Async loading for speed
```python
import asyncio
import tif1
async def load_session_data():
session = tif1.get_session(2025, "Monaco Grand Prix", "Race")
# 4-5x faster than synchronous loading
laps = await session.laps_async()
return laps
laps = asyncio.run(load_session_data())
```python
## Using Polars lib
```python
# Use polars for 2x faster processing
session = tif1.get_session(
2025,
"Las Vegas Grand Prix",
"Race",
lib="polars"
)
laps = session.laps # Returns polars DataFrame
```python
## Configuration
```python
# Get current configuration
config = tif1.get_config()
print(f"Max retries: {config.get('max_retries')}")
# Update configuration
config.set("validate_data", True)
config.set("lib", "polars")
config.save()
```python
## Cache Management
```python
# Get cache instance
cache = tif1.get_cache()
print(f"Cache location: {cache.cache_dir}")
# Clear cache
cache.clear()
# Disable caching for a session
session = tif1.get_session(
2025,
"British Grand Prix",
"Qualifying",
enable_cache=False
)
```text ## Error Handling
```python
import tif1
try:
session = tif1.get_session(2025, "Invalid GP", "Race")
laps = session.laps
except tif1.DataNotFoundError as e:
print(f"Data not found: {e}")
except tif1.NetworkError as e:
print(f"Network error: {e}")
except tif1.InvalidDataError as e:
print(f"Invalid data: {e}")
```python
## Event and session discovery
```python
# Get all events for a year
events = tif1.get_events(2025)
print(f"Events in 2025: {events}")
# Get sessions for an event
sessions = tif1.get_sessions(2025, "Chinese Grand Prix")
print(f"Sessions: {sessions}")
```python
## Tire strategy analysis
```python
# Analyze tire compounds used
laps = session.laps
# Group by driver and compound
tire_usage = laps.groupby(["Driver", "Compound"]).size()
print(tire_usage)
# Get stint information
stints = laps.groupby(["Driver", "Stint"]).agg({
"LapNumber": ["min", "max", "count"],
"Compound": "first"
})
print(stints)
```python
## Weather Data
```python
# Access weather data
weather = session.weather
print(weather[["Time", "AirTemp", "TrackTemp", "Rainfall"]].head())
# Weather is automatically included in laps DataFrame
print(laps[["LapNumber", "Driver", "AirTemp", "TrackTemp"]].head())
```python
## Logging
```python
import logging
import tif1
# Enable debug logging
tif1.setup_logging(logging.DEBUG)
# Now all operations will show detailed logs
session = tif1.get_session(2025, "Bahrain Grand Prix", "Race")
```python
## Circuit breaker status
```python
# Check circuit breaker status
cb = tif1.get_circuit_breaker()
print(f"Circuit breaker state: {cb.state}")
# Reset if needed
if cb.state == "open":
tif1.reset_circuit_breaker()
```python
## Lap Time Comparison
```python
# Compare lap times between drivers
ver_laps = laps[laps["Driver"] == "VER"]
ham_laps = laps[laps["Driver"] == "HAM"]
# Calculate average lap time
ver_avg = ver_laps["LapTime"].mean()
ham_avg = ham_laps["LapTime"].mean()
print(f"VER avg: {ver_avg:.3f}s")
print(f"HAM avg: {ham_avg:.3f}s")
print(f"Delta: {abs(ver_avg - ham_avg):.3f}s")
```python
## Sector Analysis
```python
# Analyze sector times
sectors = laps[["Driver", "Sector1Time", "Sector2Time", "Sector3Time"]]
# Find best sector times per driver
best_sectors = sectors.groupby("Driver").min()
print(best_sectors)
# Calculate theoretical best lap
theoretical_best = best_sectors.sum(axis=1)
print(f"Theoretical best laps:\n{theoretical_best}")
```python ## Speed trap analysis
```python
# Analyze speed traps
speed_data = laps[["Driver", "SpeedI1", "SpeedI2", "SpeedFL", "SpeedST"]]
# Find maximum speeds
max_speeds = speed_data.groupby("Driver").max()
print(f"Maximum speeds:\n{max_speeds}")
# Top speed overall
top_speed = laps["SpeedST"].max()
fastest_driver = laps[laps["SpeedST"] == top_speed]["Driver"].iloc[0]
print(f"Top speed: {top_speed} km/h by {fastest_driver}")
```python
## Pit Stop Analysis
```python
# Find pit stops
pit_stops = laps[laps["PitInTime"].notna()]
# Count pit stops per driver
pit_counts = pit_stops.groupby("Driver").size()
print(f"Pit stops per driver:\n{pit_counts}")
# Analyze pit stop timing
pit_laps = pit_stops.groupby("Driver")["LapNumber"].apply(list)
print(f"Pit stop laps:\n{pit_laps}")
```python
## Race pace analysis
```python
# Clean data for race pace
clean_laps = laps[
(~laps["Deleted"]) &
(laps["PitInTime"].isna()) &
(laps["LapNumber"] > 1)
]
# Calculate race pace by compound
pace_by_compound = clean_laps.groupby(["Driver", "Compound"])["LapTime"].mean()
print(f"Race pace by compound:\n{pace_by_compound}")
```python
## Tire Degradation
```python
# Analyze tire degradation
from scipy import stats
# Filter to one compound
soft_laps = laps[laps["Compound"] == "SOFT"]
# Linear regression on tyrelife vs laptime
for driver in soft_laps["Driver"].unique():
driver_laps = soft_laps[soft_laps["Driver"] == driver]
if len(driver_laps) > 5:
slope, intercept, r_value, _, _ = stats.linregress(
driver_laps["TyreLife"],
driver_laps["LapTime"]
)
print(f"{driver}: {slope:.3f}s/lap degradation (R²={r_value**2:.3f})")
```python
## Position Changes
```python
# Track position changes throughout race
position_data = laps[["LapNumber", "Driver", "Position"]].pivot(
index="LapNumber",
columns="Driver",
values="Position"
)
# Find drivers who gained most positions
start_positions = position_data.iloc[0]
end_positions = position_data.iloc[-1]
position_changes = start_positions - end_positions
print(f"Position changes:\n{position_changes.sort_values(ascending=False)}")
```python
## Track status analysis
```python
# Analyze track status (flags, safety car, etc.)
track_status = laps[["LapNumber", "TrackStatus"]].drop_duplicates()
# Count laps under different conditions
status_counts = laps["TrackStatus"].value_counts()
print(f"Track status distribution:\n{status_counts}")
# Find safety car periods
sc_laps = laps[laps["TrackStatus"].str.contains("4", na=False)]
if len(sc_laps) > 0:
print(f"Safety car on laps: {sc_laps['LapNumber'].unique()}")
```python
## Qualifying Analysis
```python
# Load qualifying session
quali = tif1.get_session(2025, "Monaco", "Qualifying")
quali_laps = quali.laps
# Get best lap per driver
best_laps = quali_laps.loc[quali_laps.groupby("Driver")["LapTime"].idxmin()]
best_laps = best_laps.sort_values("LapTime")
print("Qualifying results:")
for i, (_, lap) in enumerate(best_laps.iterrows(), 1):
print(f"{i}. {lap['Driver']}: {lap['LapTime']:.3f}s ({lap['Compound']})")
```bash
## Data Export
```python
# Export to CSV
laps.to_csv("race_laps.csv", index=False)
# Export to Parquet (smaller, faster)
laps.to_parquet("race_laps.parquet")
# Export to Excel
with pd.ExcelWriter("race_analysis.xlsx") as writer:
laps.to_excel(writer, sheet_name="Laps", index=False)
session.weather.to_excel(writer, sheet_name="Weather", index=False)
session.drivers_df.to_excel(writer, sheet_name="Drivers", index=False)
# Export to JSON
laps.to_json("race_laps.json", orient="records", indent=2)
```python ## Batch Processing
```python
# Process multiple sessions
events = ["Monaco", "Silverstone", "Spa", "Monza"]
results = []
for event in events:
try:
session = tif1.get_session(2025, event, "Race")
laps = session.laps
# Calculate metrics
fastest = laps["LapTime"].min()
avg = laps["LapTime"].mean()
results.append({
"event": event,
"fastest_lap": fastest,
"avg_lap": avg,
"total_laps": len(laps)
})
except tif1.DataNotFoundError:
print(f"No data for {event}")
# Create summary DataFrame
import pandas as pd
summary = pd.DataFrame(results)
print(summary)
```python
## Custom analysis function
```python
def analyze_driver_performance(session, driver_code):
"""Comprehensive driver performance analysis."""
driver = session.get_driver(driver_code)
laps = driver.laps
# Clean data
clean = laps[~laps["Deleted"] & laps["PitInTime"].isna()]
# Calculate metrics
metrics = {
"driver": driver_code,
"total_laps": len(laps),
"valid_laps": len(clean),
"fastest_lap": clean["LapTime"].min(),
"avg_lap": clean["LapTime"].mean(),
"consistency": clean["LapTime"].std(),
"compounds_used": laps["Compound"].unique().tolist(),
"pit_stops": laps["PitInTime"].notna().sum()
}
return metrics
# Use the function
ver_metrics = analyze_driver_performance(session, "VER")
print(ver_metrics)
```python
<Card title="More Examples" icon="book" href="/tutorials/race-pace-analysis">
Check out the tutorials section for detailed analysis examples.
</Card>
---
## Related Pages
<CardGroup cols={2}>
<Card title="Getting Started" href="/getting-started">
Comprehensive guide
</Card>
<Card title="Tutorials" href="/tutorials/race-analysis">
Detailed examples
</Card>
<Card title="API Reference" href="/api-reference/overview">
API documentation
</Card>
<Card title="Best Practices" href="/guides/best-practices">
Optimization tips
</Card>
</CardGroup>