class NpbApi::HittingStats

Public Class Methods

new(date: '', id: '') click to toggle source
# File lib/npb_api/hitting_stats.rb, line 2
def initialize(date: '', id: '')
  @date = date
  @game_id = (date.year.to_s + format('%02d', date.month) + format('%02d', date.day) + id).to_i
  @url = "http://baseball.yahoo.co.jp/npb/game/#{@game_id}/stats"
  @doc = TableExtraction.new(url: @url, klass: 'yjS').doc
end

Public Instance Methods

away() click to toggle source
# File lib/npb_api/hitting_stats.rb, line 9
def away
  stats(:away)
end
home() click to toggle source
# File lib/npb_api/hitting_stats.rb, line 13
def home
  stats(:home)
end

Private Instance Methods

bases_on_balls(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 81
def bases_on_balls(row)
  details(row).values.count('四球')
end
details(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 120
def details(row)
  hash = {
    first: row.children[27].text,
    second: row.children[28].text,
    third: row.children[29].text,
    fourth: row.children[30].text,
    fifth: row.children[31].text,
    sixth: row.children[32].text,
    seventh: row.children[33].text,
    eighth: row.children[34].text,
    ninth: row.children[35].text,
  }
  hash.merge!({ tenth: row.children[36].text }) if row.children[36]
  hash.merge!({ eleventh: row.children[37].text }) if row.children[37]
  hash.merge!({ twelfth: row.children[38].text }) if row.children[38]
  hash
end
double_plays(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 97
def double_plays(row)
  details(row).values.count { |v| v.include?('併') }
end
doubles(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 105
def doubles(row)
  details(row).values.count { |v| v.include?('2') }
end
hit_by_pitch(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 89
def hit_by_pitch(row)
  details(row).values.count('死球')
end
intentional_bases_on_balls(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 85
def intentional_bases_on_balls(row)
  details(row).values.count('敬遠')
end
plate_appearances(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 101
def plate_appearances(row)
  details(row).values.reject { |v| v == '' }.count
end
player_id(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 76
def player_id(row)
  row.children[3].css('a').attribute('href').value =~ /\A\/npb\/player\?id=(\d+)\z/
  $1.to_i
end
position(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 67
def position(row)
  if row.children[1].text.match(/\A\(.+\)\z/)
    row.children[1].text.match(/\A\((.+)\)\z/)
    $1
  else
    row.children[1].text
  end
end
sacrifice_flies(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 93
def sacrifice_flies(row)
  details(row).values.count { |v| v.include?('犠飛') }
end
starting_lineup?(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 63
def starting_lineup?(row)
  row.children[1].text.match(/\A\(.+\)\z/) ? true : false
end
stats(home_or_away) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 19
def stats(home_or_away)
  doc =
    case home_or_away
    when :home then @doc[1]
    when :away then @doc[0]
    end
  rows = doc.css('tr')
  rows.shift
  rows.pop
  order = 0
  rows.each_with_object([]) do |row, arr|
    order += 1 if starting_lineup?(row)
    arr << {
      date: @date,
      game_id: @game_id,
            order: order,
      starting_lineup: starting_lineup?(row),
      position: position(row),
      player_id: player_id(row),
      batting_average: row.children[5].text.to_f,
      at_bats: row.children[7].text.to_i,
      runs: row.children[9].text.to_i,
      hits: row.children[11].text.to_i,
      runs_batted_in: row.children[13].text.to_i,
      strikeouts: row.children[15].text.to_i,
            sacrifice_hits: row.children[19].text.to_i,
            stolen_bases: row.children[21].text.to_i,
            errors: row.children[23].text.to_i,
            home_runs: row.children[25].text.to_i,
            bases_on_balls: bases_on_balls(row),
            intentional_bases_on_balls: intentional_bases_on_balls(row),
            hit_by_pitch: hit_by_pitch(row),
            sacrifice_flies: sacrifice_flies(row),
            double_plays: double_plays(row),
            plate_appearances: plate_appearances(row),
            doubles: doubles(row),
            triples: triples(row),
            total_bases: total_bases(row),
            details: details(row),
      team_id: team_id(home_or_away)
    }
  end
end
team_id(home_or_away) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 138
def team_id(home_or_away)
  scoreboard =
    case home_or_away
    when :home
      TableExtraction.new(url: @url, klass: 'scoreboard').doc[1]
    when :away
      TableExtraction.new(url: @url, klass: 'scoreboard').doc[0]
    end
  scoreboard.css('td.tn').children[0].attribute('href').value =~ /\A\/npb\/teams\/(\d+)\/\z/
  $1.to_i
end
total_bases(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 113
def total_bases(row)
  bases = details(row).values.count { |v| v.include?('安') }
  bases += doubles(row) * 2
  bases += triples(row) * 3
  bases += details(row).values.count { |v| v.include?('本') } * 4
end
triples(row) click to toggle source
# File lib/npb_api/hitting_stats.rb, line 109
def triples(row)
  details(row).values.count { |v| v.include?('3') }
end