#!/usr/local/bin/perl unless ($ARGV[0]) { print "USAGE: pvm_calculation \n"; } $numTeams = 10; $salaryPerTeam = 260; $hittersPerTeam = 14; $pitchersPerTeam = 9; $hitterSalaryPercent = $ARGV[0]; $pitcherSalaryPercent = 100 - $hitterSalaryPercent; $totalHitters = $hittersPerTeam * $numTeams; $totalPitchers = $pitchersPerTeam * $numTeams; $totalSalary = $salaryPerTeam * $numTeams; $hitterSalary = $totalSalary * ($hitterSalaryPercent / 100); $pitcherSalary = $totalSalary * ($pitcherSalaryPercent / 100); open (PVM, ">pvm_values") || die "Couldn't open pvm_values for writing\n"; ################################################################################### # Grab all Hitting Projections ################################################################################### open (HITTING, "Batting_NL_P.csv") || die "Couldn't find Batting_NL_P.csv\n"; while () { next if (/Lastname,Firstname/); next if (/Baseball HQ/); next if (/^\s*$/); chomp; (@temp) = split/,/; $name = "$temp[0],$temp[1]"; $proj{$name}{pos} = $temp[4]; $proj{$name}{ab} = $temp[8]; $proj{$name}{run} = $temp[9]; $proj{$name}{hr} = $temp[13]; $proj{$name}{rbi} = $temp[14]; $proj{$name}{sb} = $temp[17]; $proj{$name}{obp} = $temp[20]; $proj{$name}{val_r} = $temp[23]; } close (HITTING); @statlist = qw/hr rbi run sb obp/; foreach $stat (@statlist) { $thisTotal = 0; $posHitters = 0; &mark_drafted($stat); $replacement{$stat} = $proj{$sorted[$totalHitters-1]}{$stat}; for ($i = 0; $i < int(@sorted); $i++) { $proj{$sorted[$i]}{vorp}{$stat} = $proj{$sorted[$i]}{$stat} - $replacement{$stat}; if ($stat eq "obp") { $proj{$sorted[$i]}{vorp}{$stat} = $proj{$sorted[$i]}{vorp}{$stat} * $proj{$sorted[$i]}{ab}; } if ($i < $totalHitters) { $total{$stat} += $proj{$sorted[$i]}{vorp}{$stat}; } } foreach $name (@sorted) { $proj{$name}{marg}{$stat} = $proj{$name}{vorp}{$stat} / $total{$stat}; $proj{$name}{val_c}{$stat} = sprintf "%.0f", $proj{$name}{marg}{$stat} * ($hitterSalary / 5); if ($proj{$name}{val_c}{$stat} == 0) { $proj{$name}{val_c}{$stat} = 0; } # print "for $stat, $name has a worth of $proj{$name}{val_c}{$stat} based on $proj{$name}{$stat} $stat s\n"; $proj{$name}{val_p} += $proj{$name}{val_c}{$stat}; if ($proj{$name}{val_c}{$stat} > 0) { $thisTotal += $proj{$name}{val_c}{$stat}; $posHitters++; } } print PVM "### $stat: Total spent on $posHitters hitters was $thisTotal\n"; } @unsorted = @sorted; @sorted = sort { $proj{$b}{val_p} <=> $proj{$a}{val_p} } @unsorted; for ($i = 0; $i < int(@sorted); $i++) { print PVM "$sorted[$i],$proj{$sorted[$i]}{val_p}"; foreach $stat (@statlist) { print PVM ",$proj{$sorted[$i]}{val_c}{$stat}"; } print PVM "\n"; } ################################################################################ # SUBROUTINE: mark_drafted # # For the stat category passed in, sort all players and then select the # top players at each position to fill all rosters ################################################################################ sub mark_drafted { $stat = shift; $catcherNotDone = 20; $firstbaseNotDone = 10; $secondbaseNotDone = 10; $thirdbaseNotDone = 10; $shortstopNotDone = 10; $middleNotDone = 10; $cornerNotDone = 10; $outfieldNotDone = 50; $utilityNotDone = 10; @unsorted = (); @sorted = (); @newsorted = (); $i = 0; foreach $name (keys %proj) { $unsorted[$i++] = $name; $proj{$name}{draftable} = 1; } @sorted = sort { $proj{$b}{$stat} <=> $proj{$a}{$stat} } @unsorted; $i = 0; foreach $name (@sorted) { if (($proj{$name}{pos} =~ /2/) && $catcherNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $catcherNotDone--; $newSorted[$i++] = $name; } elsif (($proj{$name}{pos} =~ /6/) && $shortstopNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $shortstopNotDone--; $newSorted[$i++] = $name; } elsif (($proj{$name}{pos} =~ /4/) && $secondbaseNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $secondbaseNotDone--; $newSorted[$i++] = $name; } elsif (($proj{$name}{pos} =~ /3/) && $firstbaseNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $firstbaseNotDone--; $newSorted[$i++] = $name; } elsif (($proj{$name}{pos} =~ /5/) && $thirdbaseNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $thirdbaseNotDone--; $newSorted[$i++] = $name; } elsif (($proj{$name}{pos} =~ /[46]/) && $middleNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $middleNotDone--; $newSorted[$i++] = $name; } elsif (($proj{$name}{pos} =~ /[35]/) && $cornerNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $cornerNotDone--; $newSorted[$i++] = $name; } elsif (($proj{$name}{pos} =~ /[789]/) && $outfieldNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $outfieldNotDone--; $newSorted[$i++] = $name; } elsif ($utilityNotDone && $proj{$name}{draftable}) { $proj{$name}{draftable} = 0; $utilityNotDone--; $newSorted[$i++] = $name; } else { $proj{$name}{draftable} = 0; $newSorted[$i++] = $name; } } @sorted = @newSorted; } # end mark_drafted ################################################################################ # PITCHING ################################################################################ %proj = (); # clear hitting stats out @unsorted = (); @sorted = (); open (PITCHING, "Pitching_AL_P.csv") || die "Couldn't find Pitching_AL_P.csv\n"; while () { next if (/Lastname,Firstname/); next if (/Baseball HQ/); next if (/^\s*$/); chomp; (@temp) = split/,/; $name = "$temp[0],$temp[1]"; if ($proj{$name}) { print "Duplicate $name!\n"; } $proj{$name}{win} = $temp[7]; $proj{$name}{save} = $temp[10]; $proj{$name}{ip} = $temp[13]; $proj{$name}{hit} = $temp[14]; $proj{$name}{er} = $temp[15]; $proj{$name}{bb} = $temp[17]; $proj{$name}{k} = $temp[18]; $proj{$name}{era} = $temp[19]; $proj{$name}{whip} = $temp[20]; $proj{$name}{val_r} = $temp[21]; } close (PITCHING); ############################################################################## # Calculate League Average ER, IP, (ERA), Walks, Hits, (WHIP) ############################################################################## @unsorted = (); @sorted = (); $i = 0; foreach $name (keys %proj) { @unsorted[$i++] = $name; } @sorted = sort { $proj{$b}{val_r} <=> $proj{$a}{val_r} } @unsorted; for ($i = 0; $i < $totalPitchers; $i++) { $totalIP += $proj{$sorted[$i]}{ip}; $totalER += $proj{$sorted[$i]}{er}; $totalBB += $proj{$sorted[$i]}{bb}; $totalHit += $proj{$sorted[$i]}{hit}; } $avgERA = ($totalER * 9) / $totalIP; $avgWHIP = ($totalHit + $totalBB) / $totalIP; $avgIP = $totalIP / $totalPitchers; $avgER = $totalER / $totalPitchers; $avgBB = $totalBB / $totalPitchers; $avgHit = $totalHit / $totalPitchers; printf PVM "### AvgERA=%1.2f, AvgWHIP=%1.2f, AvgIP=%0d, AvgER=%0d, AvgHit=%0d, AvgBB=%0d \n", $avgERA, $avgWHIP, $avgIP, $avgER, $avgHit, $avgBB; foreach $name (keys %proj) { $proj{$name}{tera} = (((($avgER*8)+$proj{$name}{er})*9)/(($avgIP*8)+$proj{$name}{ip})); $proj{$name}{nera} = $avgERA - $proj{$name}{tera}; $proj{$name}{twhip} = (((($avgHit+$avgBB)*8)+$proj{$name}{hit}+$proj{$name}{bb}) / (($avgIP*8)+$proj{$name}{ip})); $proj{$name}{nwhip} = $avgWHIP - $proj{$name}{twhip}; } ############################################################################## # Calculate Percentage Contributions per Category for each Pitcher ############################################################################## @unsorted = (); @sorted = (); @statlist = (); @statlist = qw/win save nera nwhip k/; foreach $stat (@statlist) { $i = 0; $thisTotal = 0; $posPitchers = 0; foreach $name (keys %proj) { @unsorted[$i++] = $name; } @sorted = sort { $proj{$b}{$stat} <=> $proj{$a}{$stat} } @unsorted; $replacement{$stat} = $proj{$sorted[$totalPitchers-1]}{$stat}; for ($i = 0; $i < int(@sorted); $i++) { $proj{$sorted[$i]}{vorp}{$stat} = $proj{$sorted[$i]}{$stat} - $replacement{$stat}; if ($i < $totalPitchers) { $total{$stat} += $proj{$sorted[$i]}{vorp}{$stat}; } } foreach $name (@sorted) { $proj{$name}{marg}{$stat} = $proj{$name}{vorp}{$stat} / $total{$stat}; $proj{$name}{val_c}{$stat} = sprintf "%.0f", $proj{$name}{marg}{$stat} * ($pitcherSalary / 5); if ($proj{$name}{val_c}{$stat} == 0) { $proj{$name}{val_c}{$stat} = 0; } # print "for $stat, $name has a worth of $proj{$name}{val_c}{$stat} based on $proj{$name}{$stat} $stat s\n"; $proj{$name}{val_p} += $proj{$name}{val_c}{$stat}; if ($proj{$name}{val_c}{$stat} > 0) { $thisTotal += $proj{$name}{val_c}{$stat}; $posPitchers++; } } print PVM "### Total spent on $posPitchers was $thisTotal\n"; } @unsorted = @sorted; @sorted = sort { $proj{$b}{val_p} <=> $proj{$a}{val_p} } @unsorted; for ($i = 0; $i < int(@sorted); $i++) { print PVM "$sorted[$i],$proj{$sorted[$i]}{val_p}"; foreach $stat (@statlist) { print PVM ",$proj{$sorted[$i]}{val_c}{$stat}"; } print PVM "\n"; } foreach $stat (keys %replacement) { print PVM "### REPLACMENT $stat = $replacement{$stat}\n"; } close (PVM);