class BaseballCalc::Player

Player objects know how to operate on their data. Player ojbects also know how merge data from multiple BattingSummaries since some players have batting data for multiple teams within the same year. As a result, most of the computational logic lives in the Player since it has to assume it’s data might be spread across multipe Batting Summaries.

Attributes

batting_summaries[RW]
birth_year[R]
first_name[R]
last_name[R]
player_id[R]

Public Class Methods

new(data) click to toggle source
# File lib/baseball_calc/player.rb, line 18
def initialize(data)
        @player_id = data["playerID"]
        @birth_year = data["birthYear"]
        @first_name = data["nameFirst"]
        @last_name = data["nameLast"]
        @batting_summaries = []
end

Public Instance Methods

at_bats_at_least?(threshold, year) click to toggle source
# File lib/baseball_calc/player.rb, line 45
def at_bats_at_least?(threshold, year)
        summaries = batting_summaries_for_year(year)
        total = summaries.inject(0) {|sum, summary| sum + summary.at_bats}
        total >= threshold
end
batting_avg_improvement(year1, year2) click to toggle source
# File lib/baseball_calc/player.rb, line 51
def batting_avg_improvement(year1, year2)
        start_summaries = batting_summaries_for_year(year1)
        return 0.0 if start_summaries.blank?
        end_summaries = batting_summaries_for_year(year2)
        return 0.0 if end_summaries.blank?
        
        total_start_at_bats = start_summaries.inject(0) {|sum, summary| sum + summary.at_bats}
        total_start_hits = start_summaries.inject(0) {|sum, summary| sum + summary.hits}
        total_end_at_bats = end_summaries.inject(0) {|sum, summary| sum + summary.at_bats}
        total_end_hits = end_summaries.inject(0) {|sum, summary| sum + summary.hits}

        return 0.0 if total_start_at_bats == 0 || total_end_at_bats == 0 

        start_batting_avg = total_start_hits * 1.0 / total_start_at_bats
        end_batting_avg = total_end_hits * 1.0 / total_end_at_bats

        change = (end_batting_avg - start_batting_avg).round(4)

        if player_id == "denorch01"
                puts "Start - #{start_batting_avg}"
                puts "End - #{end_batting_avg}"
        end
        change
end
batting_avg_in_year_and_league(year,league) click to toggle source
# File lib/baseball_calc/player.rb, line 89
def batting_avg_in_year_and_league(year,league)
        summaries = batting_summaries_for_year_and_league(year,league)
        total_hits = summaries.inject(0) {|sum, summary| sum + summary.hits}
        total_at_bats = summaries.inject(0) {|sum, summary| sum + summary.at_bats}
        return 0.0 if total_at_bats == 0
        (total_hits*1.0/total_at_bats).round(4)
end
batting_summaries_for_year(year) click to toggle source
# File lib/baseball_calc/player.rb, line 33
def batting_summaries_for_year(year)
        @batting_summaries.select {|summary| summary.year_id == year}
end
batting_summaries_for_year_and_league(year, league) click to toggle source
# File lib/baseball_calc/player.rb, line 41
def batting_summaries_for_year_and_league(year, league)
        @batting_summaries.select {|summary| summary.year_id == year && summary.league == league}
end
batting_summary_for_year_and_team(year, team) click to toggle source
# File lib/baseball_calc/player.rb, line 37
def batting_summary_for_year_and_team(year, team)
        @batting_summaries.detect {|summary| summary.year_id == year && summary.team_id == team}
end
full_name() click to toggle source
# File lib/baseball_calc/player.rb, line 26
def full_name
        return @player_id if @first_name.blank? && @last_name.blank?
        return @last_name if @first_name.blank?
        return @first_name if @last_name.blank?
        "#{@first_name} #{@last_name}"
end
home_runs_in_year_and_league(year, league) click to toggle source
# File lib/baseball_calc/player.rb, line 102
def home_runs_in_year_and_league(year, league)
        summaries = batting_summaries_for_year_and_league(year,league)
        summaries.inject(0) {|sum, summary| sum + summary.home_runs}
end
played_for?(team, year) click to toggle source
# File lib/baseball_calc/player.rb, line 76
def played_for?(team, year)
        !batting_summary_for_year_and_team(year,team).nil?
end
played_in_league_during_year?(league, year) click to toggle source
# File lib/baseball_calc/player.rb, line 80
def played_in_league_during_year?(league, year)
        !@batting_summaries.detect {|summary| summary.year_id == year && summary.league == league}.nil?
end
rbis_in_year_and_league(year, league) click to toggle source
# File lib/baseball_calc/player.rb, line 97
def rbis_in_year_and_league(year, league)
        summaries = batting_summaries_for_year_and_league(year,league)
        summaries.inject(0) {|sum, summary| sum + summary.runs_batted_in}
end
slugging_percent(year, team) click to toggle source
# File lib/baseball_calc/player.rb, line 84
def slugging_percent(year, team)
        summary = batting_summary_for_year_and_team(year, team)
        summary.slugging_percentage
end