import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Formula 1 is the world's highest class of racing. The FIA Formula One World Championship has been one of the premier forms of racing around the world since its inaugural season in 1950. The word "formula" in the name refers to the set of rules to which all participants cars must conform. A Formula One season consists of a series of races, known as Grands Prix, which take place worldwide on purpose-built circuits and on public roads. Taken from kaggle.com Our objective in this tutorial is to take a look at two of the most recent dominating teams. Red Bull Racing Honda and Mercedes Benz AMG F1. From 2010 - 2013, Red Bull won four straight championships as a team. Mercedes Benz is currently on a 7 year win streak of championships For our analysis we will look at Red Bull from 2010 - 2013 and Mercedes Benz from 2016 - 2019
How can we compare these teams success if they raced in two different generations?
Within Formula 1, there are specific categories that have stayed the same.
The major categories we will look at are:
My hypothesis is that Mercedes Benz will be the better team in most of these categories, especially Winning Percentage. This is solely because I have watched F1 for the past 2 years so all I know is Mercedes Benz winning the championships.
Our first order of business is to gather our data. Here is the data set on kaggle.com
drivers = pd.read_csv("drivers.csv")
result = pd.read_csv("results.csv")
race = pd.read_csv("races.csv")
constructors = pd.read_csv("constructors.csv")
c_standings = pd.read_csv("constructor_standings.csv")
c_results = pd.read_csv("constructor_results.csv")
What we are going to do here is get the data of Red Bull from 2010 - 2013. This is going to help because we can filter data later using this table. For example later I will be using this time frame to calculate the first and last race which will help me filter data.
# Red Bull F1 years 2010 - 2013
# Mercedes Benz F1 years 2016 - 2019
r = pd.read_csv("races.csv")
constructors
red_bull_rows = []
for i, row in result.iterrows():
if row['constructorId'] == 9:
red_bull_rows.append(row)
red_bull = pd.DataFrame(red_bull_rows)
red_bull
results_red_bull = r[r['year'].isin([2010,2011,2012,2013])]
red_bull.head(30)
# Now we have our race data from 2010 - 2013. We can start by plotting their finishing positions.
# We need to get the first and last raceId from 2010 - 2013
first_race = results_red_bull['raceId'].values[0]
last_race = results_red_bull['raceId'].values[-1]
# Now take this value and make sure the data we gonna use is from these raceIds only
temp = []
for i, row in red_bull.iterrows():
if row['raceId'] >= first_race and row['raceId'] <= last_race:
temp.append(row)
time_frame = pd.DataFrame(temp)
time_frame
resultId | raceId | driverId | constructorId | number | grid | position | positionText | positionOrder | points | laps | time | milliseconds | fastestLap | rank | fastestLapTime | fastestLapSpeed | statusId | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
20323 | 20326 | 337 | 20 | 9 | 5 | 1 | 4 | 4 | 4 | 12.0 | 49 | +38.799 | 5999195 | 32 | 12 | 2:00.218 | 188.627 | 1 |
20327 | 20330 | 337 | 17 | 9 | 6 | 6 | 8 | 8 | 8 | 4.0 | 49 | +46.360 | 6006756 | 45 | 3 | 1:59.487 | 189.781 | 1 |
20352 | 20355 | 338 | 17 | 9 | 6 | 2 | 9 | 9 | 9 | 2.0 | 58 | +1:07.319 | 5683850 | 47 | 1 | 1:28.358 | 216.061 | 1 |
20360 | 20363 | 338 | 20 | 9 | 5 | 1 | \N | R | 17 | 0.0 | 25 | \N | \N | 22 | 13 | 1:31.556 | 208.515 | 36 |
20368 | 20371 | 339 | 20 | 9 | 5 | 3 | 1 | 1 | 1 | 25.0 | 56 | 1:33:48.412 | 5628412 | 53 | 6 | 1:37.813 | 204.009 | 1 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
22062 | 22065 | 897 | 17 | 9 | 2 | 1 | 2 | 2 | 2 | 18.0 | 55 | +30.829 | 5916935 | 49 | 5 | 1:44.364 | 191.583 | 1 |
22083 | 22086 | 898 | 20 | 9 | 1 | 1 | 1 | 1 | 1 | 25.0 | 56 | 1:39:17.148 | 5957148 | 54 | 1 | 1:39.856 | 198.754 | 1 |
22085 | 22088 | 898 | 17 | 9 | 2 | 2 | 3 | 3 | 3 | 15.0 | 56 | +8.396 | 5965544 | 52 | 4 | 1:40.591 | 197.301 | 1 |
22105 | 22108 | 899 | 20 | 9 | 1 | 1 | 1 | 1 | 1 | 25.0 | 71 | 1:32:36.300 | 5556300 | 51 | 3 | 1:15.624 | 205.125 | 1 |
22106 | 22109 | 899 | 17 | 9 | 2 | 4 | 2 | 2 | 2 | 18.0 | 71 | +10.452 | 5566752 | 51 | 1 | 1:15.436 | 205.636 | 1 |
154 rows × 18 columns
This step is to get the race data of MB from 2016 - 2019 just like we did with Red Bull
# Mercedes Benz F1 years 2016 - 2019
r = pd.read_csv("races.csv")
benz_rows = []
for i, row in result.iterrows():
if row['constructorId'] == 131:
benz_rows.append(row)
benz_df = pd.DataFrame(benz_rows)
benz_df
results_benz = r[r['year'].isin([2016,2017,2018,2019])]
results_benz
# Now we have our race data from 2016 - 2019. We can start by plotting their finishing positions.
# We need to get the first and last raceId from 2016 - 2019
first_race = results_benz['raceId'].values[0]
last_race = results_benz['raceId'].values[-1]
# Now take this value and make sure the data we gonna use is from these raceIds only
temp_benz = []
for i, row in benz_df.iterrows():
if row['raceId'] >= first_race and row['raceId'] <= last_race:
temp_benz.append(row)
benz_time_frame = pd.DataFrame(temp_benz)
benz_time_frame
resultId | raceId | driverId | constructorId | number | grid | position | positionText | positionOrder | points | laps | time | milliseconds | fastestLap | rank | fastestLapTime | fastestLapSpeed | statusId | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
22912 | 22917 | 948 | 3 | 131 | 6 | 2 | 1 | 1 | 1 | 25.0 | 57 | 1:48:15.565 | 6495565 | 21 | 3 | 1:30.557 | 210.815 | 1 |
22913 | 22918 | 948 | 1 | 131 | 44 | 1 | 2 | 2 | 2 | 18.0 | 57 | +8.060 | 6503625 | 48 | 4 | 1:30.646 | 210.608 | 1 |
22934 | 22939 | 949 | 3 | 131 | 6 | 2 | 1 | 1 | 1 | 25.0 | 57 | 1:33:34.696 | 5614696 | 41 | 1 | 1:34.482 | 206.210 | 1 |
22936 | 22941 | 949 | 1 | 131 | 44 | 1 | 3 | 3 | 3 | 15.0 | 57 | +30.148 | 5644844 | 43 | 2 | 1:34.677 | 205.785 | 1 |
22956 | 22961 | 950 | 3 | 131 | 6 | 1 | 1 | 1 | 1 | 25.0 | 56 | 1:38:53.891 | 5933891 | 38 | 6 | 1:40.418 | 195.419 | 1 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
24562 | 24567 | 1028 | 1 | 131 | 44 | 5 | 2 | 2 | 2 | 18.0 | 56 | +4.148 | 5639801 | 26 | 7 | 1:38.446 | 201.600 | 1 |
24587 | 24592 | 1029 | 1 | 131 | 44 | 3 | 7 | 7 | 7 | 6.0 | 71 | +11.139 | 5605817 | 46 | 3 | 1:11.082 | 218.232 | 1 |
24600 | 24605 | 1029 | 822 | 131 | 77 | 4 | \N | R | 20 | 0.0 | 51 | \N | \N | 43 | 1 | 1:10.698 | 219.417 | 131 |
24601 | 24606 | 1030 | 1 | 131 | 44 | 1 | 1 | 1 | 1 | 26.0 | 55 | 1:34:05.715 | 5645715 | 53 | 1 | 1:39.283 | 201.387 | 1 |
24604 | 24609 | 1030 | 822 | 131 | 77 | 20 | 4 | 4 | 4 | 12.0 | 55 | +44.379 | 5690094 | 31 | 2 | 1:39.715 | 200.515 | 1 |
166 rows × 18 columns
So now we have the races between 2010 - 2013 for Red Bull Racing and can start our analysis
ax = time_frame['positionOrder'].value_counts().plot(kind = "bar", figsize = (10,5))
ax.set_title("Red Bull F1 Team Finishing Positions Frequency Chart")
ax.set_ylabel("Number of Times")
ax.set_xlabel("Position Finished")
plt.show()
# Creating a map which will count the frequency of each finishing position from 2010 - 2013
redbull_dict = {}
for i,row in time_frame.iterrows():
if row['positionOrder'] not in redbull_dict:
redbull_dict[row['positionOrder']] = 1
else:
redbull_dict[row['positionOrder']] += 1
# Calculating the winning percentage and the podium percentage
wins_ratio = (redbull_dict[1]/166) * 100
total_podiums = redbull_dict[1] + redbull_dict[2] + redbull_dict[3]
podiums_ratio = (total_podiums/166) * 100
print("\n\n")
print("We can see that Red Bull F1 made it to the podium",podiums_ratio,"% of the time and won the race",wins_ratio,"% of the time")
We can see that Red Bull F1 made it to the podium 51.204819277108435 % of the time and won the race 24.69879518072289 % of the time
So now we have our first plot. This plot shows us how frequently Red Bull finished in one position. Clearly we can see that out of the 154 races between 2010 - 2013, the Red Bull Racing team finished on the top of the podium over 40 times. Along with that, they finsihed on the podium (1st, 2nd, or 3rd) over 80 times. This accounts for more than half of their finishes So this preliminary graph shows us that Red Bull pulled in a majority of the points to be gotten over these four years.
The most suprising fact was that out of 154 races, a Red Bull driver was on the podium for more than half of the races
So we can see there is null data ( \N ) but that will not affect us in our analysis, since we are not going to be able to compare car times across generations since each year there are different versions of cars. Since the cars we are comparing do not overlap, we can not compare their lap times because the engineering of each car is not the same
ax = benz_time_frame['positionOrder'].value_counts().plot(kind = "bar", figsize = (10,5))
ax.set_title("Mercedes Benz AMG F1 Team Finishing Positions Frequency Chart")
ax.set_ylabel("Number of Times")
ax.set_xlabel("Position Finished")
plt.show()
print("The following is just based on looking at the table, statistical analysis will be done right after")
print("Looking at this table, we see that Mercedes finished 1st over 50 times, and on the podium over 110 times")
print("Out of 166 races, this means over 66% of the finishes that Mercedes had occured on the podium.")
# Now lets go ahead and statistically calculate the success of the team
benz_dict = {}
for i,row in benz_time_frame.iterrows():
if row['positionOrder'] not in benz_dict:
benz_dict[row['positionOrder']] = 1
else:
benz_dict[row['positionOrder']] += 1
wins_ratio = (benz_dict[1]/166) * 100
total_podiums = benz_dict[1] + benz_dict[2] + benz_dict[3]
podiums_ratio = (total_podiums/166) * 100
print("\n\n")
print("We can see that Mercedes Benz made it to the podium",podiums_ratio,"% of the time and won the race",wins_ratio,"% of the time")
print("So now, comparing the amazing success of these teams we see that Mercedes Benz over these four years had more")
print("success than Red Bull. There was over 15% more podium percentage and 10 percent more winning percentage")
The following is just based on looking at the table, statistical analysis will be done right after Looking at this table, we see that Mercedes finished 1st over 50 times, and on the podium over 110 times Out of 166 races, this means over 66% of the finishes that Mercedes had occured on the podium. We can see that Mercedes Benz made it to the podium 69.87951807228916 % of the time and won the race 34.33734939759036 % of the time So now, comparing the amazing success of these teams we see that Mercedes Benz over these four years had more success than Red Bull. There was over 15% more podium percentage and 10 percent more winning percentage
So now, comparing the amazing success of these teams we see that Mercedes Benz over these four years had more success than Red Bull. There was over 15% more podium percentage and 10 percent more winning percentage
So far, we see that Mercedes has the upper hand when it comes to winning races and finishing in the top 3 in general. What this data also shows us is that Mercedes Benz was that even though their data set was 12 races bigger (something that we can not adjust because it wouldn't be fair to Red Bull), Mercedez Benz still had the higher ratio of wins. In racing, more races = more wear on car engines and body parts = less productive performance. Based on our preliminary exploration, we see the Mercedes Benz didn't lose performance even when they had atleast 2280 miles of wear more on their car. (The minimum race distance in F1 is 190 miles)
To recap on Step 1, one alternative to our data wrangling apprach would be to manually go through and select the records we want
While on the topic of wear and tear on the car, lets see how consistent these cars were. We will define a DNF as Did Not Finish.
Lets begin the process of digging deeper and looking into how consistent each team was.
The first way to measure how consistent they were is to look at how good their engineering department was, basically how many times did they fail to finish a race and score 0 points?
The DNF shows is this data. In our table it is any statusId that is not 1. 1 means the racer finished with no problem. Any number other than that there was a problem such as a crash, engineering failure, pitstop failure, and finished too low.
red_bull_status = []
for i, row in time_frame.iterrows():
# A status Id of 1 means that the racer finsihed the race, regardless of position, so we need to get all other Ids
if row['statusId'] != 1:
red_bull_status.append(row['statusId'])
dnfs = len(red_bull_status)
ratio = (dnfs/154) * 100
print("We see there are 154 races and of those races", dnfs,"resulted in a DNF")
print("That means",ratio,"% of races resulted in a DNF over this period of time")
benz_status = []
for i, row in benz_time_frame.iterrows():
# A status Id of 1 means that the racer finsihed the race, regardless of position, so we need to get all other Ids
if row['statusId'] != 1:
benz_status.append(row['statusId'])
dnfs = len(benz_status)
ratio = (dnfs/166) * 100
print("We see there are 166 races and of those races", dnfs,"resulted in a DNF")
print("That means",ratio,"% of races resulted in a DNF over this period of time")
We see there are 154 races and of those races 19 resulted in a DNF That means 12.337662337662337 % of races resulted in a DNF over this period of time We see there are 166 races and of those races 12 resulted in a DNF That means 7.228915662650602 % of races resulted in a DNF over this period of time
Before I started this step I predicted that there would not be too much of a difference in the DNF data because its possible a Red Bull or Mercedes fell out of the points but still finished the race and it wasn't reflected in our data.
After looking at the statistical data in this step, I see that I was wrong. The difference between these two teams was over 5% or 7 races which means that over a higher amount of races, Mercedes Benz was more consistent than Red Bull was even though Red Bull had a slightly smaller data sample. (166 races for MB vs 154 races for RB)
The next most important thing to look at is qualifying data. How good was the car at starting position? This gives us a sense of the ability of the car without traffic and without wear and tear. So peak performance
This will be step 3: Qualifying Exploration
Using this data, lets make a frequency plot to see how often they qualified in each position I see there is some Null Data. Lets assume that that means the car didn't qualify and give it a position 23 to make the data more readible
redbull_quali_performance['position'] = redbull_quali_performance['position'].replace("\\N",23)
benz_quali_performance['position'] = benz_quali_performance['position'].replace("\\N",23)
ax = time_frame['grid'].value_counts().plot(kind = "bar", figsize = (10,5))
ax.set_title("Frequency vs. Starting Position on Grid (Red Bull)")
ax.set_xlabel("Starting Position on Grid")
ax.set_ylabel("Frequency on Grid")
plt.show()
ax = benz_time_frame['grid'].value_counts().plot(kind = "bar", figsize = (10,5))
ax.set_title("Frequency vs. Starting Position on Grid (Mercedes Benz)")
ax.set_xlabel("Starting Position on Grid")
ax.set_ylabel("Frequency on Grid")
plt.show()
From our Step 3 work we don't get any data that will help lead us to a conlcusion about the qualifying performances of these cars. Here we do see that MB started from pole more often and 2nd and 3rd more often than Red Bull did. But still there is no conclusive advantage to either team. We can resonably conlcude that both teams were just as equal in their qualifying periods
We need to take a closer look into this data. How did these teams fair when starting from pole? Which team was able to convert their pole positions into Wins and which team "blew it" more often?
Lets take a look at how successful each team was at converting the best starting position on the grid into a win. And if they didn't win, how far down the order did they drop?
# Now lets see if we can see how good Red Bull was at converting pole positions to wins.
redbull_finishing_performance = time_frame
redbull_finishing_performance.head()
# In our data, the finishing_performance['grid'] symbolizes where the driver started from
# We can add a column that finds the difference between the starting position and the ending position.
# Positive means the driver gained positions
# Negative means the driver lost positions
pole_distance_redbull = []
redbull_race = []
races = []
w = 1
for i, row in redbull_finishing_performance.iterrows():
if row['grid'] == 1:
redbull_race.append(row)
pole_distance_redbull.append(row['grid']-row['positionOrder'])
races.append(w)
w+=1
pole_distance_redbull
redbull_pole_starts = pd.DataFrame(redbull_race)
redbull_pole_starts['plus/minus'] = pole_distance_redbull
redbull_pole_starts['races'] = races
redbull_pole_starts.head()
plt.figure(figsize=(10,5))
plt.scatter(x = redbull_pole_starts['races'], y = redbull_pole_starts['plus/minus'], c = ['#0600EF'])
plt.title('Positions Lost from Pole Start (Red Bull)')
plt.xlabel('Races Started from Pole (Chronologically)')
plt.ylabel('Positions Lost')
plt.show()
# Now we need to plot this data to see how Red Bull faired from pole
benz_finishing_performance = benz_time_frame
benz_finishing_performance.head()
pole_distance_benz = []
benz_race = []
benz_races = []
w = 1
for i, row in benz_finishing_performance.iterrows():
if row['grid'] == 1:
benz_race.append(row)
pole_distance_benz.append(row['grid']-row['positionOrder'])
benz_races.append(w)
w+=1
pole_distance_benz
benz_pole_starts = pd.DataFrame(benz_race)
benz_pole_starts['plus/minus'] = pole_distance_benz
benz_pole_starts['races'] = benz_races
benz_pole_starts.head()
plt.figure(figsize=(10,5))
plt.scatter(x = benz_pole_starts['races'], y = benz_pole_starts['plus/minus'], c = ['#00D2BE'])
plt.title('Positions Lost from Pole Start (Mercedes Benz)')
plt.xlabel('Races Started from Pole (Chronologically)')
plt.ylabel('Positions Lost')
plt.show()
So looking at the plots, we can see that while both performed very well from pole generally, Red Bull lost more than 5 positions 6 times from pole. Mercedes, on the other hand, only lost more than 5 positions from pole 4 times.
Even towards the top of the table (within 0 to -5 places lost) we see a much tighter clustering of points. The way we can test this is by getting the average of positions lost.
My hypothesis looking at the scatterplots is that Mercedes Benz is much better at getting and keeping the lead
Lets go further into the data and find the chances that
Red Bull start and finish 1st Mercedes start and finish 1st Complete a Hypothesis Test
Hypothesis: A driver for Mercedes Benz F1 was starting on pole was more likely to finish and win the race
Null Hypothesis: A driver for MB is not more likely to win a race when starting on pole than RB
# This is simply taking the amount of 0s in every array and dividing by length of that array
no_change_redbull = 0
total_lost_redbull = 0
outliers_excluded_redbull = 0
c = 0
for i in pole_distance_redbull:
if i == 0:
no_change_redbull += 1
if i >= -5:
outliers_excluded_redbull += 1
c += 1
total_lost_redbull += i
avg_lost_redbull = total_lost_redbull/len(pole_distance_redbull)
excluded_redbull = outliers_excluded_redbull/c
no_change_redbull = (no_change_redbull/len(pole_distance_redbull)) * 100
no_change_benz = 0
total_lost_benz = 0
outliers_excluded_benz = 0
c_benz = 0
for i in pole_distance_benz:
if i == 0:
no_change_benz += 1
if i >= -5:
outliers_excluded_benz += 1
c_benz += 1
total_lost_benz += i
avg_lost_benz = total_lost_benz/len(pole_distance_benz)
excluded_benz = outliers_excluded_benz/c_benz
no_change_benz = (no_change_benz/len(pole_distance_benz)) * 100
print("Red Bull Average Places Lost:", avg_lost_redbull)
print("Mercedes Benz Average Places Lost:",avg_lost_benz)
print("\n")
print("Red Bull Average Places lost between 0 to -5:",excluded_redbull)
print("Mercedes Benz Average Places lost between 0 to -5:",excluded_benz)
print("\n")
print("Red Bull Start and Finish Pole Percentage:", no_change_redbull)
print("Mercedes Benz Start and Finish Pole Percentage:",no_change_benz)
Red Bull Average Places Lost: -2.2884615384615383 Mercedes Benz Average Places Lost: -1.5517241379310345 Red Bull Average Places lost between 0 to -5: 1.0 Mercedes Benz Average Places lost between 0 to -5: 1.0 Red Bull Start and Finish Pole Percentage: 50.0 Mercedes Benz Start and Finish Pole Percentage: 60.3448275862069
What we see from this data is that Mercedes is much more efficient at starting and finishing from pole position. An advantage of over more than 10% compared to Red Bull. Also that a MB driver is more likely to win from pole than RB.
Some more points to take away from this calculation was that Mercedes Benz did infact have less places lost overall, by about 0.7 places.
Now while doing that I decided that looking at the spread within (0 to -5) should be done by looking at all values outside of -5 as outliers. So looking at the output provided there I can conclude that there is no difference in the average places lost within 0 to -5. Both lost 1.0 places on average.
The whole idea of this analysis was to see which car performed better at staying ahead. Qualifying allowed both teams to fully show their teams engineering potential when there is no traffic on track and perfect conditions for the car to succeed. The race day data challenges the teams to work on their stategical powers and stay ahead. So our data shows us that Mercedes Benz stategists were much better overall at keeping their leads in the race and the drivers were more efficient at navigating through traffic and extending their lead in open air (open air allows for better aerodynamic performance for cars = faster lap times)
Now that we have explored all this data, what conclusions can we draw?
To summarize the major categories we looked at were:
Why did I take this approach?
The reason I took this approach was too take a high to low look at the data. So I wanted to start by looking at the winning percentage of the team which is the first thing that comes to mind. After that I wanted to move onto consistency of the teams, then looking at the deeper reasons for success which come before the day of the race. So seeing how these teams qualified onto the grid and then lastly seeing which team did the best with the opportunity.
Results of this Analysis
This data set did not have data associated to the results of constructors standings in 2010 and forward. So after some simple googling I found this data:
2013:
1st Place - Red Bull 596
2nd Place - Mercedes Benz 360
Difference: 236
2019:
1st Place - Mercedes Benz 739
2nd Place - Ferrari 504
Difference: 235
I can see that both Mercedes Benz and Red Bull won the championships by the same margin (off by 1 pt).
Mercedes edged out Red Bull in all of these categories. From 2016 - 2019, Mercedes displayed a dominance that was unparalleled in this age. With a podium percentage of over 69% and a winning percentage of over 34%, Mercedes showed that its amazing engineering and large budget paid off with 4 straight constructor titles
Formula 1 teams are consistently trying to improve and inovate on pervious success and failure. The whole point of this analysis and tutorial was to show the recipe of success for these teams. Both teams succeeded not because they won many races (which they did) but because of their consistentcy. The whole point of racing is to be an unpredictable sport. The driver errors, crashes, and new rule regulations are supposed to make F1 unpredictable. For example in the 2020 F1 season there was a 3 way tie for the 3rd place in constructors title championship, Ferrari F1 plummeted down the standings from 2nd in 2019 to 6th in 2020. To summarize, F1 and racing was created to be a world of unpredictabliliy and excitement. Mercedes Benz and Red Bull in their winning streaks were able to reverse that and create their dynasties. They created a sense of normal in the racing community that led to Sebatian Vettel's 9 GP wins in a row and memes about how every race podium would be the same because Mercedes Benz were so dominant.
The world of F1 is one that is dominated by Money. Teams that have a higher budget are always at the top of the table. For example in 2019, Mercedes had a budget of 484 million dollars and won the Construtors title One thing I could look into, if in a bigger group rather than myself, would be to see how efficiently teams spend money. Just like our Moneyball project. There was also no table that contained the budgets for F1 teams