07-29-2020, 09:28 AM
(This post was last modified: 07-30-2020, 01:59 PM by Beefstu409.)
Mock Draft Engine (S24) (Last updated 7/29 10:30 AM EST)
This is an in depth guide to this year's version of the Mock Draft Engine. While I’ve been able to build out pretty much all the most important functionality, there’s still a lot of improvements I look forward to making in the S25 version that I’ll talk about at the end of the post. I am looking for feedback to improve the algorithms and prediction methods too so please feel free to comment or shoot me a message on Discord (Beefstu409#8089)!
Purpose
Initially the Mock Draft Engine was created for me to use to build out my mock draft strategy. I just joined the league about a week ago so I don’t know any of the teams/rosters/etc. However, as I kept building it out I just added as much as possible and tried to make it as extensible and customized as possible. This will allow for users to change many variables which will provide a unique drafting experience.
It’s obviously too late for Season 24, but I’m hoping for the S25 version of the document to be useful enough and customizable enough that GMs could use it to scout who may be available on their next pick or even identify the right time to make some pick trades. Some of these improvements and future scope will be outlined below.
Walkthrough
Inputs
In order to make edits to the document you must make a copy of it for yourself to use and edit. I highly recommend reading this walkthrough with your copy open to get an idea of how everything works. I’m going to try to be as thorough as possible but feel free to ask any questions and I’ll answer either here or on Discord (Beefstu409#8089).
With no further ado, here’s the sheet:
https://docs.google.com/spreadsheets/d/1qVJ...dit?usp=sharing
We’ll start on the “Inputs” tab which is the only page you really need to make any edits if you’re just going to use the engine for a quick at a glance view with some different inputs. Other tabs can be edited but may lead to unintended results and should be done only by advanced users. Those tabs are outlined below as well. Of course if you screw everything up you can always just grab a new copy and start over.
Referencing the image above of the Inputs tab we’ll go through each component by name and color.
Draft Year (Yellow): This is probably the most obvious one. It simply references the draft that the engine will be mocking. This powers the “Player Raw Data” tab into the “Eligible Players” tab which makes the draft class a bit easier to work with (see the corresponding section below). It also helps with some math for years of experience for all players.
League Info (Red): This component lists the total number of ISFL players under contract. Note that this is and must be different from just the total ISFL players because any players that are currently on DSFL teams but are under contract must still count toward making draft decisions. These values are powered off of the “ISFL Contract Players” tab (which is a pain in the ass to build but more on that later). This component also includes the average TPE for each position on players in ISFL contracts.
Mock Results (Blue): This is where the engine will spit out the mock draft results based on it’s calculations and the inputs on this tab.
Positional Value and Metric Weight (Green): This is the most confusing portion of the inputs and the most important. I’ll try to explain in great detail here how this works starting with positional value. Note that the default values are not optimized, it's simply weighing everything evenly which is unlikely to yield the best results. As a result these should be changed to each users preference.
Positional Value: These numbers represent relative to each other how important one position is in the ISFL. It’s not applied to any individual teams differently, but rather to the entire league. It’s likely that in the NFL quarterbacks and edge rushers would be rated above the average for the rest of the positions. There are likely similar trends in the ISFL but being new to the league I’m not best equipped to choose how that should look. Note that because these numbers are relative to each other, if all values are the same (regardless of what that value is) the results of the mock will be the same. For example, if all positions remain at 100 but K/P is lowered to 50, the K/P positions will be scored (see Team Needs below for how this is precisely done) with a modifier half as much as all other positions. These default to 100 for all but should be edited by the user to fit preference.
These variables are meant to account for the overall meta of the league which may change year to year, but probably not very much. I believe there is a “perfect” solution to these variables which would be the average of all current ISFL GMs opinion on how these should be rated.
Metric Weight: These percentages (which are recommended to add up to 100%) are how weighted three other metrics - Position Need, Position TPE, Position Experience - are when determining draft choice. To understand better here’s the definition of those three metrics with information on how they are precisely calculated on the Team Needs section of this post. I do provide some examples below which start to get into how they are calculated in this section but they can be skipped if you just want the overview.
Position Need: This metric determines how many players are rostered at each position on each team as compared to the league average per team rostered at that position.
For example:
The Baltimore Hawks only have Chika Fujiwara in the QB position under contract
There are 18 QBs in the ISFL
On average there are 1.5 rostered on each team (18 total QBs in the league divided by 12 teams total = 1.5)
Therefore the QB positional need score for the Hawks is -0.5 (1 player rostered at QB minus 1.5 league average)
This is repeated and separately calculated for all positions
I will go over this equation in more detail in the Team Needs section.
Position TPE: This metric determines the average TPE at each position on each team as compared to the league average TPE per team at that position.
For example:
The Philadelphia Liberty have Brock Phoenix (968 TPE) and Sim Snowbow (293 TPE) under contract in the QB position
The average TPE for QBs on the Liberty is 630.5 TPE ((968 + 293)/2)
The average TPE for the league at QB is 780.72 TPE
Therefore the QB positional TPE score for the Liberty is -150.22 (630.5 Team QB TPE average minus 780.72 League QB TPE average)
This is repeated and separately calculated for all positions
I will go over this equation in more detail in the Team Needs section.
Position Experience: This metric determines the average years of experience at each position on each team as compared to the league average years experience at that position.
For example:
The Sarasota Sailfish have Haha Mango-Panda and Fawn Dillmiballs under contract in the LB position
The average years of experience for LBs on the Sailfish is 3 (both players started their career Season 21)
The average years of experience in the ISFL is 4.4
Therefore the LB positional experience score for the Sailfish is -1.4 (3- 4.4)
Note that a negative value for experience is actually good since it means your team is younger. This is handled as a part of the Team Needs tab.
This is repeated and separately calculated for all positions
I will go over this equation in more detail in the Team Needs section.
Quick thoughts: in the above examples you saw the scores equal -0.5, -150.22, and -1.4. This may seem like the -150.22 being such a bigger number would skew results. As is outlined in the Team Needs section, these numbers are normalized and will become a relative ratio between 0 and 1 which allows them to be used on a level playing field against each other. It’s also important to note that a negative number means the team is “worse positioned” than league average in that position for that category while a positive number means the team is “better positioned” in that category for that position (this does not apply to experience where a negative number means a younger team which is a "better positioned" spot to be in).
Teams and Order (Purple): This is simply the list of teams in the league - expansion teams will be added accordingly in the future - and the draft order for this season. The total number of teams just counts the total teams listed and is a reference for some league-wide averages.
Team Needs
The Team Needs is where the logic is mostly held for the sheet and calculates many of the values we covered above for each team. In this section we’re going to go over one team as an example and follow through a full positional modifier which is used to multiply by a players TPE to get their “score” (more on score in the Team Draft Boards section).
The top 3 tables in this tab simply reference the Inputs tab data. This helped me to work with the data in the rest of this tab and can be ignored but should not be edited.
Below is the Austin Copperheads Team Needs chart. This is just one of the charts that is made for each team. These charts calculate the positional modifier which is the final value that’s used as a multiplier on each draftee's TPE which determines their draftee “score”.
We’ll go through column by column for this table left to right.
1. Position: This is obvious. It’s required so that it can be referenced for calculations.
2. Austin Copperheads: This column (which is poorly named) has the value of how many players at each position are rostered on the Austin Copperheads roster.
3. Difference vs NSFL: This column shows the difference in the players rostered on the Copperheads against the league average rostered at that position.
4. Roster Weight: Weight is the most confusing portion of this chart and I’ll do my best to explain how it works here. This is the part where the metric scores are normalized so that all three metrics can be coherently compared. Here’s how weight is calculated:
This uses the minimum, maximum, and range from column 3. The equation works as follows:
(Positional difference vs NSFL - minimum of all positional differences vs NSFL on the team) / Range between the minimum of all positional differences and maximum of all positional differences
Let’s run through that again using real numbers. For this example we’ll use the Defensive Tackle position.
The Copperheads have 2 DTs under ISFL contract which is 0.25 DTs below the league average
The lowest value of all positions for the Copperheads is in the RB position (-0.75)
The highest value of all positions for the Copperheads is in the DE position (+1.5)
The range between those two values is 2.25
Using the equation above we get: ((-0.25) - (-0.75)) / 2.25 = .22
That number (.22) is the weighted value of the Positional Need score for the DT position for the Copperheads.
This calculation is done for all teams at all positions and will be modified by the Metric Weight from the Input tab.
5. Average TPE: Simply the average TPE of all players on roster at each position.
6. Difference vs NSFL: This column shows the difference in the average TPE rostered on the Copperheads against the league average rostered at that position.
7. TPE Weight: View how Roster Weight is calculated above in column 4, this column is calculated in the same way but just uses column 6 for the calculation whereas the Roster Weight calculation uses column 3.
8. Experience: Simply the average years of experience of all players on roster at each position.
9. Difference vs NSFL: This column shows the difference in the average years of experience rostered on the Copperheads against the league average rostered at that position.
10. Experience Weight: View how Roster Weight is calculated above in column 4, this column is calculated in the same way but just uses column 9 for the calculation whereas the Roster Weight calculation uses column 3.
11. Weighted Priority: This value takes the weighted values above (columns 4, 7, 10) and multiplies them by the Input tab’s Metric Weight percentage which is user defined.
12. Positional Modifier: This value takes the value in column 11 and multiplies it by the user defined Positional Value on the Inputs tab. This number will eventually be multiplied by all players at the corresponding positions TPE to get their draftee score.
13. Team: I just needed a column to reference what team this was so I could do some other lookups elsewhere in the document.
Team Draft Boards
Disclaimer: This sheet is kind of a mess and needs a serious revamp in my next version so bear with me. It’s probably the worst organized sheet in the document so feel free to skip this portion. Though I must admit it’s got some cool info in it including how the algorithm scores all the draftees at every position.
For this section I’m only going to use the Baltimore Hawks as the example team and go through most of the functionality here. It’s kind of a behemoth of a tab, so I had to leave some data out though all functionality is explained. We’ll go over it from left to right.
Table 1 (Red): This is simply the position modifier from the Team Needs tab. Moving it to this tab makes the data easier to work with. This is a good area to compare how the teams value each position though which is kind of fun.
Table 2 (Green): This has all the eligible players in this draft as well as their position and TPE. This is used for the teams’ calculations.
Table 3 (Blue): This references the green table and calculates the draftee score for all players in the draft class. Due to limitations (either in google sheets or my brain) I was unable to sort this effectively in this table. Note that this has a restriction (which needs to be patched out in a future version) of a draft class of about 300 players.
Table 4 (yellow): This is each team's draft board (stacked on top of each other and goes down to row like 3600 - again I need to refactor this bit). This table is the same as the blue table, but has it sorted by Score which builds out the full draft board for each team. The score is calculated by multiplying the corresponding position modifier for the corresponding team with the players TPE. This value is how each team values the players.
Player Raw Data, ISFL Contract Players, and Eligible Players
All three of these tabs just hold data and aren’t super useful to change anything on. If you notice a player missing or incorrect data, fixing it on the Player Raw Data tab will resolve it for the entire engine.
Player Raw Data tab: This tab includes all the raw data from TPE tracker for all players in the league. It (unfortunately) needs quite a bit of manual massaging to get it up to date and accurate including FA signings and changing players who are under ISFL contract from their DSFL team to their ISFL team. This tedious nightmare of a headache of work has been done for you by me. You’re welcome.
ISFL Contract Players tab: This simply filters the data from the Players Raw Data tab down to players on ISFL contract only. It’s used for reference here and there (I think).
Eligible Players tab: This tab is going to be a big part of future updates but it currently just sorts out all the eligible players for the draft this year. In the future I’ll be adding some scripts which will allow me to scale the scope of this document as a whole. This tab will be a big part of it.
Team Tabs
All of the team tabs simply reference the Player Raw Data tab and are used throughout the engine in various ways to get information on one specific team. This makes a lot of the calculations easier in some places. These tabs should basically never be manually edited or updated.
Final Thoughts and What’s Next
So there are some things that I’d like to add and some things that may not be perfect within the engine. I’m hoping to gather feedback and apply it as necessary this year but also am looking forward to adding more variables to help accuracy in the future. Things for this year I’d like to get going:
-Beefstu409 (Rookie first post 2x)
3045 words
This is an in depth guide to this year's version of the Mock Draft Engine. While I’ve been able to build out pretty much all the most important functionality, there’s still a lot of improvements I look forward to making in the S25 version that I’ll talk about at the end of the post. I am looking for feedback to improve the algorithms and prediction methods too so please feel free to comment or shoot me a message on Discord (Beefstu409#8089)!
Purpose
Initially the Mock Draft Engine was created for me to use to build out my mock draft strategy. I just joined the league about a week ago so I don’t know any of the teams/rosters/etc. However, as I kept building it out I just added as much as possible and tried to make it as extensible and customized as possible. This will allow for users to change many variables which will provide a unique drafting experience.
It’s obviously too late for Season 24, but I’m hoping for the S25 version of the document to be useful enough and customizable enough that GMs could use it to scout who may be available on their next pick or even identify the right time to make some pick trades. Some of these improvements and future scope will be outlined below.
Walkthrough
Inputs
In order to make edits to the document you must make a copy of it for yourself to use and edit. I highly recommend reading this walkthrough with your copy open to get an idea of how everything works. I’m going to try to be as thorough as possible but feel free to ask any questions and I’ll answer either here or on Discord (Beefstu409#8089).
With no further ado, here’s the sheet:
https://docs.google.com/spreadsheets/d/1qVJ...dit?usp=sharing
We’ll start on the “Inputs” tab which is the only page you really need to make any edits if you’re just going to use the engine for a quick at a glance view with some different inputs. Other tabs can be edited but may lead to unintended results and should be done only by advanced users. Those tabs are outlined below as well. Of course if you screw everything up you can always just grab a new copy and start over.
Referencing the image above of the Inputs tab we’ll go through each component by name and color.
Draft Year (Yellow): This is probably the most obvious one. It simply references the draft that the engine will be mocking. This powers the “Player Raw Data” tab into the “Eligible Players” tab which makes the draft class a bit easier to work with (see the corresponding section below). It also helps with some math for years of experience for all players.
League Info (Red): This component lists the total number of ISFL players under contract. Note that this is and must be different from just the total ISFL players because any players that are currently on DSFL teams but are under contract must still count toward making draft decisions. These values are powered off of the “ISFL Contract Players” tab (which is a pain in the ass to build but more on that later). This component also includes the average TPE for each position on players in ISFL contracts.
Mock Results (Blue): This is where the engine will spit out the mock draft results based on it’s calculations and the inputs on this tab.
Positional Value and Metric Weight (Green): This is the most confusing portion of the inputs and the most important. I’ll try to explain in great detail here how this works starting with positional value. Note that the default values are not optimized, it's simply weighing everything evenly which is unlikely to yield the best results. As a result these should be changed to each users preference.
Positional Value: These numbers represent relative to each other how important one position is in the ISFL. It’s not applied to any individual teams differently, but rather to the entire league. It’s likely that in the NFL quarterbacks and edge rushers would be rated above the average for the rest of the positions. There are likely similar trends in the ISFL but being new to the league I’m not best equipped to choose how that should look. Note that because these numbers are relative to each other, if all values are the same (regardless of what that value is) the results of the mock will be the same. For example, if all positions remain at 100 but K/P is lowered to 50, the K/P positions will be scored (see Team Needs below for how this is precisely done) with a modifier half as much as all other positions. These default to 100 for all but should be edited by the user to fit preference.
These variables are meant to account for the overall meta of the league which may change year to year, but probably not very much. I believe there is a “perfect” solution to these variables which would be the average of all current ISFL GMs opinion on how these should be rated.
Metric Weight: These percentages (which are recommended to add up to 100%) are how weighted three other metrics - Position Need, Position TPE, Position Experience - are when determining draft choice. To understand better here’s the definition of those three metrics with information on how they are precisely calculated on the Team Needs section of this post. I do provide some examples below which start to get into how they are calculated in this section but they can be skipped if you just want the overview.
Position Need: This metric determines how many players are rostered at each position on each team as compared to the league average per team rostered at that position.
For example:
The Baltimore Hawks only have Chika Fujiwara in the QB position under contract
There are 18 QBs in the ISFL
On average there are 1.5 rostered on each team (18 total QBs in the league divided by 12 teams total = 1.5)
Therefore the QB positional need score for the Hawks is -0.5 (1 player rostered at QB minus 1.5 league average)
This is repeated and separately calculated for all positions
I will go over this equation in more detail in the Team Needs section.
Position TPE: This metric determines the average TPE at each position on each team as compared to the league average TPE per team at that position.
For example:
The Philadelphia Liberty have Brock Phoenix (968 TPE) and Sim Snowbow (293 TPE) under contract in the QB position
The average TPE for QBs on the Liberty is 630.5 TPE ((968 + 293)/2)
The average TPE for the league at QB is 780.72 TPE
Therefore the QB positional TPE score for the Liberty is -150.22 (630.5 Team QB TPE average minus 780.72 League QB TPE average)
This is repeated and separately calculated for all positions
I will go over this equation in more detail in the Team Needs section.
Position Experience: This metric determines the average years of experience at each position on each team as compared to the league average years experience at that position.
For example:
The Sarasota Sailfish have Haha Mango-Panda and Fawn Dillmiballs under contract in the LB position
The average years of experience for LBs on the Sailfish is 3 (both players started their career Season 21)
The average years of experience in the ISFL is 4.4
Therefore the LB positional experience score for the Sailfish is -1.4 (3- 4.4)
Note that a negative value for experience is actually good since it means your team is younger. This is handled as a part of the Team Needs tab.
This is repeated and separately calculated for all positions
I will go over this equation in more detail in the Team Needs section.
Quick thoughts: in the above examples you saw the scores equal -0.5, -150.22, and -1.4. This may seem like the -150.22 being such a bigger number would skew results. As is outlined in the Team Needs section, these numbers are normalized and will become a relative ratio between 0 and 1 which allows them to be used on a level playing field against each other. It’s also important to note that a negative number means the team is “worse positioned” than league average in that position for that category while a positive number means the team is “better positioned” in that category for that position (this does not apply to experience where a negative number means a younger team which is a "better positioned" spot to be in).
Teams and Order (Purple): This is simply the list of teams in the league - expansion teams will be added accordingly in the future - and the draft order for this season. The total number of teams just counts the total teams listed and is a reference for some league-wide averages.
Team Needs
The Team Needs is where the logic is mostly held for the sheet and calculates many of the values we covered above for each team. In this section we’re going to go over one team as an example and follow through a full positional modifier which is used to multiply by a players TPE to get their “score” (more on score in the Team Draft Boards section).
The top 3 tables in this tab simply reference the Inputs tab data. This helped me to work with the data in the rest of this tab and can be ignored but should not be edited.
Below is the Austin Copperheads Team Needs chart. This is just one of the charts that is made for each team. These charts calculate the positional modifier which is the final value that’s used as a multiplier on each draftee's TPE which determines their draftee “score”.
We’ll go through column by column for this table left to right.
1. Position: This is obvious. It’s required so that it can be referenced for calculations.
2. Austin Copperheads: This column (which is poorly named) has the value of how many players at each position are rostered on the Austin Copperheads roster.
3. Difference vs NSFL: This column shows the difference in the players rostered on the Copperheads against the league average rostered at that position.
4. Roster Weight: Weight is the most confusing portion of this chart and I’ll do my best to explain how it works here. This is the part where the metric scores are normalized so that all three metrics can be coherently compared. Here’s how weight is calculated:
This uses the minimum, maximum, and range from column 3. The equation works as follows:
(Positional difference vs NSFL - minimum of all positional differences vs NSFL on the team) / Range between the minimum of all positional differences and maximum of all positional differences
Let’s run through that again using real numbers. For this example we’ll use the Defensive Tackle position.
The Copperheads have 2 DTs under ISFL contract which is 0.25 DTs below the league average
The lowest value of all positions for the Copperheads is in the RB position (-0.75)
The highest value of all positions for the Copperheads is in the DE position (+1.5)
The range between those two values is 2.25
Using the equation above we get: ((-0.25) - (-0.75)) / 2.25 = .22
That number (.22) is the weighted value of the Positional Need score for the DT position for the Copperheads.
This calculation is done for all teams at all positions and will be modified by the Metric Weight from the Input tab.
5. Average TPE: Simply the average TPE of all players on roster at each position.
6. Difference vs NSFL: This column shows the difference in the average TPE rostered on the Copperheads against the league average rostered at that position.
7. TPE Weight: View how Roster Weight is calculated above in column 4, this column is calculated in the same way but just uses column 6 for the calculation whereas the Roster Weight calculation uses column 3.
8. Experience: Simply the average years of experience of all players on roster at each position.
9. Difference vs NSFL: This column shows the difference in the average years of experience rostered on the Copperheads against the league average rostered at that position.
10. Experience Weight: View how Roster Weight is calculated above in column 4, this column is calculated in the same way but just uses column 9 for the calculation whereas the Roster Weight calculation uses column 3.
11. Weighted Priority: This value takes the weighted values above (columns 4, 7, 10) and multiplies them by the Input tab’s Metric Weight percentage which is user defined.
12. Positional Modifier: This value takes the value in column 11 and multiplies it by the user defined Positional Value on the Inputs tab. This number will eventually be multiplied by all players at the corresponding positions TPE to get their draftee score.
13. Team: I just needed a column to reference what team this was so I could do some other lookups elsewhere in the document.
Team Draft Boards
Disclaimer: This sheet is kind of a mess and needs a serious revamp in my next version so bear with me. It’s probably the worst organized sheet in the document so feel free to skip this portion. Though I must admit it’s got some cool info in it including how the algorithm scores all the draftees at every position.
For this section I’m only going to use the Baltimore Hawks as the example team and go through most of the functionality here. It’s kind of a behemoth of a tab, so I had to leave some data out though all functionality is explained. We’ll go over it from left to right.
Table 1 (Red): This is simply the position modifier from the Team Needs tab. Moving it to this tab makes the data easier to work with. This is a good area to compare how the teams value each position though which is kind of fun.
Table 2 (Green): This has all the eligible players in this draft as well as their position and TPE. This is used for the teams’ calculations.
Table 3 (Blue): This references the green table and calculates the draftee score for all players in the draft class. Due to limitations (either in google sheets or my brain) I was unable to sort this effectively in this table. Note that this has a restriction (which needs to be patched out in a future version) of a draft class of about 300 players.
Table 4 (yellow): This is each team's draft board (stacked on top of each other and goes down to row like 3600 - again I need to refactor this bit). This table is the same as the blue table, but has it sorted by Score which builds out the full draft board for each team. The score is calculated by multiplying the corresponding position modifier for the corresponding team with the players TPE. This value is how each team values the players.
Player Raw Data, ISFL Contract Players, and Eligible Players
All three of these tabs just hold data and aren’t super useful to change anything on. If you notice a player missing or incorrect data, fixing it on the Player Raw Data tab will resolve it for the entire engine.
Player Raw Data tab: This tab includes all the raw data from TPE tracker for all players in the league. It (unfortunately) needs quite a bit of manual massaging to get it up to date and accurate including FA signings and changing players who are under ISFL contract from their DSFL team to their ISFL team. This tedious nightmare of a headache of work has been done for you by me. You’re welcome.
ISFL Contract Players tab: This simply filters the data from the Players Raw Data tab down to players on ISFL contract only. It’s used for reference here and there (I think).
Eligible Players tab: This tab is going to be a big part of future updates but it currently just sorts out all the eligible players for the draft this year. In the future I’ll be adding some scripts which will allow me to scale the scope of this document as a whole. This tab will be a big part of it.
Team Tabs
All of the team tabs simply reference the Player Raw Data tab and are used throughout the engine in various ways to get information on one specific team. This makes a lot of the calculations easier in some places. These tabs should basically never be manually edited or updated.
Final Thoughts and What’s Next
So there are some things that I’d like to add and some things that may not be perfect within the engine. I’m hoping to gather feedback and apply it as necessary this year but also am looking forward to adding more variables to help accuracy in the future. Things for this year I’d like to get going:
- Easier user experience
- Cleaner UI
- Team draft board in a readable user friendly way
- Full mock draft - not just the first round (right now the way the logic works a team would evaluate subsequent picks as if they hadn't made their first pick. So if they need an LB for example and drafted one already, they would be likely to draft another - this will be fixed in next seasons edition)
- Further filtering/options for users
- Position scarcity in the draft class (i.e. if there’s only 1 WR in the draft class it’d be valued higher)
- GM tilt (just an idea) that would track how GMs have drafted in the past over time and try to account for their bias in the sim
- Last Updated/Last Seen integration. I’m not sure how this might work but something I’m thinking about.
-Beefstu409 (Rookie first post 2x)
3045 words