Baseball-Sabermetrics

 view release on metacpan or  search on metacpan

examples/ws.pl  view on Meta::CPAN


team_c_claim_point => 'team_pos_claim_point("c")',
team_b1_claim_point => 'team_pos_claim_point("b1")',
team_b2_claim_point => 'team_pos_claim_point("b2")',
team_b3_claim_point => 'team_pos_claim_point("b3")',
team_ss_claim_point => 'team_pos_claim_point("ss")',
team_of_claim_point => 'team_pos_claim_point("of")',

team_pos_claim_point => sub {
    my $pos = shift;
    my $cp = "${pos}_claim_percentage";
    my $weight = "${pos}_fielding_weight";
    exists $_->fielding->{$pos} ? ($_->$cp - 0.2) * $_->$weight : 0;
},

team_c_ws => 'team_fielding_ws * team_c_claim_point / team_total_claim_point',
team_b1_ws => 'team_fielding_ws * team_b1_claim_point / team_total_claim_point',
team_b2_ws => 'team_fielding_ws * team_b2_claim_point / team_total_claim_point',
team_b3_ws => 'team_fielding_ws * team_b3_claim_point / team_total_claim_point',
team_ss_ws => 'team_fielding_ws * team_ss_claim_point / team_total_claim_point',
team_of_ws => 'team_fielding_ws * team_of_claim_point / team_total_claim_point',

examples/ws.pl  view on Meta::CPAN

    return $_->{fielding}->{$pos};
},

limit => sub {
    my ($val, $max) = @_;
    return $val < 0 ? 0 : $val > $max ? $max : $val;
},

# Catchers' Claim Percentage

#c_claim_percentage => 'c_cs_grade + c_non_so_e_rate_grade + c_bunt_allowed_grade + c_pb_grade',
c_claim_percentage => '(
	limit(c_cs_grade, 50) +
	limit(c_non_so_e_rate_grade, 30) +
	limit(c_bunt_allowed_grade, 10)
) * 10 / 9',

non_so_error_per => 'e / (po + a + e - p_so)',

c_cs_grade => '25 + (cs_per - $league->cs_per) * 150',
c_non_so_e_rate_grade => '30 - 15 * non_so_error_per / $league->non_so_error_per',
c_bunt_allowed_grade => '0', # CPBL doesn't have this record
c_pb_grade => '5 + ($league->pb * tlpop - pb) / 5',

# 1st Basemans' Claim Percentage
b1_claim_percentage => '
	limit(b1_def_change_grade, 40) +
	limit(b1_e_ratio_grade, 30) +
	limit(b1_arm_grade, 20) +
	limit(err_of_b3ss_grade, 10)',

runners_on_b1 => '(h_allowed - hr_allowed) * (b1 / (h_allowed - hr_allowed)) + bb + hbp - wp - bk - pb',

est_x => 'fielders("b1")->po - 0.7 * fielders("p")->a - 0.86 * fielders("b2")->a - 0.78 * fielders("b3")->a - 0.78 * fielders("ss")->a + 0.115 * runners_on_b1 - 0.0575 * bip',

est_y => '0.1 * bip - fielders("b1")->a',

examples/ws.pl  view on Meta::CPAN


b1_e_ratio_grade => '30 - 15 * fielders("b1")->e_ratio / $league->fielders("b1")->e_ratio',

b1_arm_grade => '10 + (
	(fielders("b1")->a + fielders("ss")->f_dp / 2 - fielders("p")->po - fielders("b2")->f_dp / 2 + 0.015 * lhp) -
	($league->fielders("b1")->a + $league->fielders("ss")->f_dp / 2 - $league->fielders("p")->po - $league->fielders("b2")->f_dp / 2) ) / 5',

err_of_b3ss_grade => '10 - 5 * (fielders("b3")->e + fielders("ss")->e) / (($league->fielders("b3")->e + $league->fielders("ss")->e) * tlpop)',

# 2nd Basemans' Claim Percentage
b2_claim_percentage => '
	limit(b2_dp_grade, 40) +
	limit(b2_a_grade, 30) +
	limit(b2_e_ratio_grade, 20) +
	limit(b2_po_grade, 10)',

b2_dp_grade => '20 + (f_dp - expected_dp) / 3',
b2_a_grade => sub {
    my $A = $_->fielders('b2')->a - $_->fielders('b2')->f_dp;
    my $B = ($_->league->fielders('b2')->a - $_->league->fielders('b2')->f_dp) * $_->tlpop - $_->lhp / 35;
    return 15 + ($A - $B) / 6;

examples/ws.pl  view on Meta::CPAN

    my $Y = $X * ($_->h - $_->hr) + $_->bb + $_->hbp - $_->sh - $_->wp - $_->bk - $_->pb;
    my $Z = $league->{'b1'} + $league->bb + $league->hbp - $league->sh - $league->wp - $league->bk - $league->pb;
    my $W = $league->f_dp / $Z;
    return $Y * $W * ($_->a / $_->ip) / ($league->a / $league->ip);
},
sh => '0',

e_ratio => '1 - fpct',

# 3nd Basemans' Claim Percentage
b3_claim_percentage => '(
	limit(b3_a_grade, 50) +
	limit(b3_e_ratio_grade, 30) +
	limit(b3_dp_grade, 10)
) * 10 / 9',

b3_a_grade => '25 + (fielders("b3")->a - (
	    a * ($league->fielders("b3")->a / $league->a)
	)) / 4',

b3_e_ratio_grade => '15 + (
	((fielders("b3")->a + fielders("b3")->po) / league_b3_fpct - (fielders("b3")->a + fielders("b3")->po)) -
	fielders("b3")->e
	) / 2',

b3_dp_grade => '5 + (fielders("b3")->f_dp - expected_dp * ($league->fielders("b3")->f_dp / $league->f_dp)) / 2',

league_b3_fpct => '$league->fielders("b3")->fpct',

# Shortstops' Claim Percentage
ss_claim_percentage => '
	limit(ss_a_grade, 40) +
	limit(ss_dp_grade, 30) +
	limit(ss_e_ratio_grade, 20) +
	limit(ss_po_grade, 10)',

ss_a_grade => '20 + (
	(fielders("ss")->a) -
	(a * $league->fielders("ss")->a / $league->a + lhp / 100)
    ) / 4',

examples/ws.pl  view on Meta::CPAN

ss_e_ratio_grade => '20 - 10 * fielders("ss")->e_ratio / $league->fielders("ss")->e_ratio',

ss_po_grade => '
    5 + (fielders("ss")->po -
    ((po - p_so) * (fielders("ss")->po / (po - p_so)) + (p_bb / ip - $league->p_bb / $league->ip) / 14 + lhp / 64)
    ) / 15',


# Outfielders' Claim Percentage

of_claim_percentage => '
	limit(of_po_grade, 40) +
	limit(of_der_grade, 40) +
	limit(of_a_and_po_grade, 10) +
	limit(of_e_ration_grade, 10)',

por => 'fielders("of")->po / (po - p_so - a)',
der_point => '100 + (der - $league->der) * 2500',

of_po_grade => '20 + (por - $league->por) * 100',
of_der_grade => 'der_point * 0.24 - 9',

examples/ws.pl  view on Meta::CPAN


print "TEAM\tmRunScored\tmRunCreated 投手零價值標準\n";
$_->print qw/ name m_save m_run pitcher_zero_base / for $league->teams;
print "\n";

print "TEAM\tNAME\tBAT\tPITCH\tFIELD\tTOTAL\t投手ws比重\n";
$_->print qw/ team name att_ws pitch_ws def_ws ws pitcher_ws_weight / for $league->pitchers;
print "\n";


#$_->print qw/ name c_claim_percentage b1_claim_percentage b2_claim_percentage b3_claim_percentage ss_claim_percentage of_claim_percentage / for $league->teams;


#print Dumper($league->teams('bears'));

for ($league->batters) {
    if (keys %{$_->fielding} == 0) {
	$_->print qw/ name /;
    }
}



( run in 0.448 second using v1.01-cache-2.11-cpan-709fd43a63f )