Add >0 pa/ip/xch to stats, add filter for starters/relievers and remove pa minimum for all hitting counting stats

This commit is contained in:
Peter 2024-01-24 11:41:02 -05:00
parent 6073d947b7
commit 8225fb7615

View File

@ -4,7 +4,6 @@
<div class="col-sm-12"> <div class="col-sm-12">
<h1 id="season-heading">Season {{ seasonNumber }} Leaders</h1> <h1 id="season-heading">Season {{ seasonNumber }} Leaders</h1>
<h2 id="week-num">Week {{ weekNumber }}</h2> <h2 id="week-num">Week {{ weekNumber }}</h2>
<!-- TODO this will be dynamic based on batting vs pitching -->
<h2 id="stat-heading">{{ statType }} Leaderboards - Min {{ statMinimum }}</h2> <h2 id="stat-heading">{{ statType }} Leaderboards - Min {{ statMinimum }}</h2>
<!-- <label for="seasonNumber">Select Season</label> --> <!-- <label for="seasonNumber">Select Season</label> -->
<select name="seasonNumber" id="seasonNumber" v-model="seasonNumber"> <select name="seasonNumber" id="seasonNumber" v-model="seasonNumber">
@ -16,6 +15,11 @@
<option key="Pitching" value="Pitching">Pitching</option> <option key="Pitching" value="Pitching">Pitching</option>
<option key="Fielding" value="Fielding">Fielding</option> <option key="Fielding" value="Fielding">Fielding</option>
</select> </select>
<select v-if="statType === 'Pitching'" name="pitchingType" id="pitchingType" v-model="pitchingType">
<option key="All" value="All">All</option>
<option key="Starters" value="Starters">Starters Only</option>
<option key="Relievers" value="Relievers">Relievers Only</option>
</select>
</div> </div>
</div> </div>
<div class="row" id="stat-listing"> <div class="row" id="stat-listing">
@ -114,6 +118,7 @@ export default {
currentSeasonNumber: CURRENT_SEASON, currentSeasonNumber: CURRENT_SEASON,
seasonNumber: CURRENT_SEASON, seasonNumber: CURRENT_SEASON,
statType: 'Batting' as 'Batting' | 'Pitching' | 'Fielding', statType: 'Batting' as 'Batting' | 'Pitching' | 'Fielding',
pitchingType: 'All' as 'All' | 'Starters' | 'Relievers',
weekNumber: undefined! as number weekNumber: undefined! as number
} }
}, },
@ -137,6 +142,8 @@ export default {
return this.weekNumberForCalcs * GAMES_PER_WEEK * MIN_PLATE_APPEARANCES_PER_GAME return this.weekNumberForCalcs * GAMES_PER_WEEK * MIN_PLATE_APPEARANCES_PER_GAME
}, },
inningsPitchedMinimum(): number { inningsPitchedMinimum(): number {
if (this.pitchingType === 'Relievers') return this.weekNumberForCalcs
const MIN_IP_PER_GAME = 1 const MIN_IP_PER_GAME = 1
return this.weekNumberForCalcs * GAMES_PER_WEEK * MIN_IP_PER_GAME return this.weekNumberForCalcs * GAMES_PER_WEEK * MIN_IP_PER_GAME
}, },
@ -266,11 +273,13 @@ export default {
return this.getTop10FieldingStatByCategory(stat as keyof FlatFieldingStat) return this.getTop10FieldingStatByCategory(stat as keyof FlatFieldingStat)
}, },
getTop10BattingStatByCategory(stat: keyof BattingStat): BattingStat[] { getTop10BattingStatByCategory(stat: keyof BattingStat): BattingStat[] {
if (['sb', 'cs'].includes(stat)) { const paExemptStat: (keyof BattingStat)[] = ['hr', 'rbi', 'double', 'triple', 'hit', 'gidp', 'bb', 'so', 'hbp', 'ibb', 'sb', 'cs', 'run', 'bphr', 'bpfo', 'bp1b', 'bplo', 'ab', 'pa']
return this.allPlayersBattingStats.concat([]).sort((a, b) => (b[stat] as number) - (a[stat] as number)).slice(0, 10)
}
// concat an empty array so that the existing array is not sorted as a side effect // concat an empty array so that the existing array is not sorted as a side effect
return this.qualifyingBattingStats.concat([]).sort((a, b) => (b[stat] as number) - (a[stat] as number)).slice(0, 10) const statBase: BattingStat[] = paExemptStat.includes(stat) ? this.allPlayersBattingStats.concat([]) : this.qualifyingBattingStats.concat([])
// concat an empty array so that the existing array is not sorted as a side effect
return statBase.sort((a, b) => (b[stat] as number) - (a[stat] as number)).slice(0, 10)
}, },
getTop10PitchingStatByCategory(stat: keyof PitchingStat): PitchingStat[] { getTop10PitchingStatByCategory(stat: keyof PitchingStat): PitchingStat[] {
// qualifying IP exempt stats // qualifying IP exempt stats
@ -278,11 +287,19 @@ export default {
// concat an empty array so that the existing array is not sorted as a side effect // concat an empty array so that the existing array is not sorted as a side effect
const statBase: PitchingStat[] = ipExemptStats.includes(stat) ? this.allPlayersPitchingStats.concat([]) : this.qualifyingPitchingStats.concat([]) const statBase: PitchingStat[] = ipExemptStats.includes(stat) ? this.allPlayersPitchingStats.concat([]) : this.qualifyingPitchingStats.concat([])
// filter based on pitchingType selection
const filteredStatBase: PitchingStat[] = statBase.filter(s =>
this.pitchingType === 'All'
? true
: this.pitchingType === 'Starters'
? s.gs > 0
: s.gs === 0
)
const reverseSortStats = ['era', 'whip', 'bbPer9'] const reverseSortStats = ['era', 'whip', 'bbPer9']
const sortMultiplier = reverseSortStats.includes(stat) ? -1 : 1 const sortMultiplier = reverseSortStats.includes(stat) ? -1 : 1
return statBase.sort((a, b) => sortMultiplier * ((b[stat] as number) - (a[stat] as number))).slice(0, 10) return filteredStatBase.sort((a, b) => sortMultiplier * ((b[stat] as number) - (a[stat] as number))).slice(0, 10)
}, },
getTop10FieldingStatByCategory(stat: keyof FlatFieldingStat): FlatFieldingStat[] { getTop10FieldingStatByCategory(stat: keyof FlatFieldingStat): FlatFieldingStat[] {
// High: 2B/SS - 2 XCh/wk // High: 2B/SS - 2 XCh/wk
@ -340,15 +357,18 @@ export default {
.map(stat => { .map(stat => {
return { ...stat, team: this.teamsById.get(stat.player.team as unknown as number) ?? stat.team } return { ...stat, team: this.teamsById.get(stat.player.team as unknown as number) ?? stat.team }
}) })
.filter(stat => stat.pa > 0)
} }
if (this.statType == 'Pitching') { if (this.statType == 'Pitching') {
this.allPlayersPitchingStats = (await fetchPitchingStatsBySeason(this.seasonNumber, true)) this.allPlayersPitchingStats = (await fetchPitchingStatsBySeason(this.seasonNumber, true))
.map(stat => { .map(stat => {
return { ...stat, team: this.teamsById.get(stat.player.team as unknown as number) ?? stat.team } return { ...stat, team: this.teamsById.get(stat.player.team as unknown as number) ?? stat.team }
}) })
.filter(stat => stat.ip > 0)
} }
if (this.statType == 'Fielding') { if (this.statType == 'Fielding') {
const allPlayerPositionFieldingStats: FieldingStat[] = await fetchFieldingStatsBySeason(this.seasonNumber, true) const allPlayerPositionFieldingStats: FieldingStat[] = (await fetchFieldingStatsBySeason(this.seasonNumber, true))
.filter(stat => stat.xCheckCount > 0 || stat.stolenBaseCheckCount > 0 || stat.passedBallCount > 0)
const aggregatedFieldingStatsByPlayer: { [playerName: string]: FlatFieldingStat } = {} const aggregatedFieldingStatsByPlayer: { [playerName: string]: FlatFieldingStat } = {}
allPlayerPositionFieldingStats.forEach(stat => { allPlayerPositionFieldingStats.forEach(stat => {