npb_api 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/npb_api/game.rb +80 -0
- data/lib/npb_api.rb +8 -0
- metadata +51 -12
- data/lib/npb_api/base.rb +0 -23
- data/lib/npb_api/fielding.rb +0 -89
- data/lib/npb_api/hitting.rb +0 -81
- data/lib/npb_api/pitching.rb +0 -108
- data/lib/npb_api/table_extraction.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e803a0b961d518feeeed96ca41a8054a88097af
|
4
|
+
data.tar.gz: 5350d4a294585a75bd8056e55e338c24065f15d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d4c2e2fb7a7fbf36e37b76aef97c8232b83a4b5ec0f82d9142089f79773564bbd1235ef89b99195e2d779e7641dec9d65019057000abe866d366ddd68f96d94
|
7
|
+
data.tar.gz: 891f85e1f161252cd9d1ae53d33d136198d73f3f97cb9d14f42bd5210c8045afcf29f6f00d7b985c69e27cd93d9728a3b7acea5d6af816b61bef23db9b8b286d
|
data/lib/npb_api/game.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
class NpbApi::Game
|
2
|
+
def initialize(date: '', id: '')
|
3
|
+
@date = date
|
4
|
+
@game_id = date.year.to_s + format('%02d', date.month) + format('%02d', date.day) + id
|
5
|
+
@doc = Nokogiri::HTML(open("http://baseball.yahoo.co.jp/npb/game/#{@game_id}/top"))
|
6
|
+
end
|
7
|
+
|
8
|
+
def away
|
9
|
+
{
|
10
|
+
game_id: @game_id,
|
11
|
+
status: status,
|
12
|
+
team: @doc.css('.column-right.clearfix i').text,
|
13
|
+
score: away_score,
|
14
|
+
result: away_result,
|
15
|
+
datetime: datetime,
|
16
|
+
ballpark: ballpark
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def home
|
21
|
+
{
|
22
|
+
game_id: @game_id,
|
23
|
+
status: status,
|
24
|
+
team: @doc.css('.column-left.clearfix i').text,
|
25
|
+
score: home_score,
|
26
|
+
result: home_result,
|
27
|
+
datetime: datetime,
|
28
|
+
ballpark: ballpark
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def status
|
35
|
+
@doc.css('.column-center em').text
|
36
|
+
end
|
37
|
+
|
38
|
+
def away_score
|
39
|
+
return nil if status == '試合前中止'
|
40
|
+
@doc.css('tr#tb1 td.sum').text.to_i
|
41
|
+
end
|
42
|
+
|
43
|
+
def away_result
|
44
|
+
return 'postponed' if status.include?('中止')
|
45
|
+
|
46
|
+
if away_score > home_score
|
47
|
+
'win'
|
48
|
+
elsif away_score < home_score
|
49
|
+
'lose'
|
50
|
+
else
|
51
|
+
'draw'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def home_score
|
56
|
+
return nil if status == '試合前中止'
|
57
|
+
@doc.css('tr#tb2 td.sum').text.to_i
|
58
|
+
end
|
59
|
+
|
60
|
+
def home_result
|
61
|
+
return 'postponed' if status.include?('中止')
|
62
|
+
|
63
|
+
if home_score > away_score
|
64
|
+
'win'
|
65
|
+
elsif home_score < away_score
|
66
|
+
'lose'
|
67
|
+
else
|
68
|
+
'draw'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def datetime
|
73
|
+
hour, minute = @doc.css('p.stadium').children[2].text.split(':').map(&:to_i)
|
74
|
+
DateTime.new(@date.year, @date.month, @date.day, hour, minute, 0, '+9')
|
75
|
+
end
|
76
|
+
|
77
|
+
def ballpark
|
78
|
+
@doc.css('p.stadium').children[0].text.strip
|
79
|
+
end
|
80
|
+
end
|
data/lib/npb_api.rb
ADDED
metadata
CHANGED
@@ -1,27 +1,66 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: npb_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ohtsuka Takahiro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
12
|
-
dependencies:
|
13
|
-
|
11
|
+
date: 2016-05-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: table_extraction
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '11'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '11'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5'
|
55
|
+
description: npbのデータを取得する
|
14
56
|
email: t.o.0526@gmail.com
|
15
57
|
executables: []
|
16
58
|
extensions: []
|
17
59
|
extra_rdoc_files: []
|
18
60
|
files:
|
19
|
-
- lib/npb_api
|
20
|
-
- lib/npb_api/
|
21
|
-
|
22
|
-
- lib/npb_api/pitching.rb
|
23
|
-
- lib/npb_api/table_extraction.rb
|
24
|
-
homepage: http://rubygems.org/gems/npb_api
|
61
|
+
- lib/npb_api.rb
|
62
|
+
- lib/npb_api/game.rb
|
63
|
+
homepage: https://github.com/to0526/npb_api
|
25
64
|
licenses:
|
26
65
|
- MIT
|
27
66
|
metadata: {}
|
@@ -41,8 +80,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
80
|
version: '0'
|
42
81
|
requirements: []
|
43
82
|
rubyforge_project:
|
44
|
-
rubygems_version: 2.
|
83
|
+
rubygems_version: 2.5.1
|
45
84
|
signing_key:
|
46
85
|
specification_version: 4
|
47
|
-
summary:
|
86
|
+
summary: npbのデータを取得する
|
48
87
|
test_files: []
|
data/lib/npb_api/base.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require './lib/npb_api/table_extraction'
|
2
|
-
|
3
|
-
class NpbApi::Base
|
4
|
-
def initialize(team: '', year: '', league: '')
|
5
|
-
@team = team
|
6
|
-
@year = year
|
7
|
-
@league = league
|
8
|
-
end
|
9
|
-
|
10
|
-
def table
|
11
|
-
raise NotImplementedError
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def extracted_table
|
17
|
-
raise NotImplementedError
|
18
|
-
end
|
19
|
-
|
20
|
-
def url
|
21
|
-
raise NotImplementedError
|
22
|
-
end
|
23
|
-
end
|
data/lib/npb_api/fielding.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
require './lib/npb_api/base'
|
2
|
-
|
3
|
-
module NpbApi
|
4
|
-
class Fielding < Base
|
5
|
-
def table
|
6
|
-
position = ''
|
7
|
-
extracted_table.map do |values|
|
8
|
-
if values[0] =~ /\A【(.+)】\z/
|
9
|
-
position = human_position($1)
|
10
|
-
next
|
11
|
-
end
|
12
|
-
values.unshift(@year, @team, @league, position)
|
13
|
-
_hash(keys, values).map do |key, value|
|
14
|
-
case key
|
15
|
-
when :throw
|
16
|
-
[key, _throw(value)]
|
17
|
-
when :year, :team, :league, :position, :player
|
18
|
-
[key, value]
|
19
|
-
when :fielding_percentage
|
20
|
-
[key, value.to_f]
|
21
|
-
when :passed_balls
|
22
|
-
[key, (value.empty? ? 'NULL' : value.to_i)]
|
23
|
-
else
|
24
|
-
[key, value.to_i]
|
25
|
-
end
|
26
|
-
end.to_h
|
27
|
-
end.compact
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def extracted_table
|
33
|
-
table = TableExtraction.new(url: url).tables.first
|
34
|
-
table.delete_at(0)
|
35
|
-
table
|
36
|
-
end
|
37
|
-
|
38
|
-
def url
|
39
|
-
case @league
|
40
|
-
when 'CL', 'PL'
|
41
|
-
"http://npb.jp/bis/#{@year}/stats/idf1_#{@team.downcase}.html"
|
42
|
-
when 'WL', 'EL'
|
43
|
-
"http://npb.jp/bis/#{@year}/stats/idf2_#{@team.downcase}.html"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def keys
|
48
|
-
[
|
49
|
-
:year,
|
50
|
-
:team,
|
51
|
-
:league,
|
52
|
-
:position,
|
53
|
-
:throw,
|
54
|
-
:player,
|
55
|
-
:games,
|
56
|
-
:putout,
|
57
|
-
:assists,
|
58
|
-
:errors,
|
59
|
-
:double_plays,
|
60
|
-
:passed_balls,
|
61
|
-
:fielding_percentage
|
62
|
-
]
|
63
|
-
end
|
64
|
-
|
65
|
-
def human_position(position)
|
66
|
-
case position
|
67
|
-
when '一塁手' then '1B'
|
68
|
-
when '二塁手' then '2B'
|
69
|
-
when '三塁手' then '3B'
|
70
|
-
when '遊撃手' then 'SS'
|
71
|
-
when '外野手' then 'OF'
|
72
|
-
when '捕手' then 'C'
|
73
|
-
when '投手' then 'P'
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def _hash(keys, values)
|
78
|
-
Hash[*[keys, values].transpose.flatten]
|
79
|
-
end
|
80
|
-
|
81
|
-
def _throw(value)
|
82
|
-
case value
|
83
|
-
when '' then 'R'
|
84
|
-
when '*' then 'L'
|
85
|
-
when '+' then 'S'
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
data/lib/npb_api/hitting.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
require './lib/npb_api/base'
|
2
|
-
|
3
|
-
module NpbApi
|
4
|
-
class Hitting < Base
|
5
|
-
def table
|
6
|
-
extracted_table.map do |values|
|
7
|
-
values.unshift(@year, @team, @league)
|
8
|
-
hash = Hash[*[keys, values].transpose.flatten]
|
9
|
-
hash.map do |key, value|
|
10
|
-
case key
|
11
|
-
when :bat
|
12
|
-
[key, bat(value)]
|
13
|
-
when :year, :team, :league, :player
|
14
|
-
[key, value]
|
15
|
-
when :batting_average, :slugging_percentage, :on_base_percentage
|
16
|
-
[key, value.to_f]
|
17
|
-
else
|
18
|
-
[key, value.to_i]
|
19
|
-
end
|
20
|
-
end.to_h
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def bat(column)
|
27
|
-
case column
|
28
|
-
when '' then 'R'
|
29
|
-
when '*' then 'L'
|
30
|
-
when '+' then 'S'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def extracted_table
|
35
|
-
table = TableExtraction.new(url: url).tables.first
|
36
|
-
table.slice!(0..1)
|
37
|
-
table
|
38
|
-
end
|
39
|
-
|
40
|
-
def url
|
41
|
-
case @league
|
42
|
-
when 'CL', 'PL'
|
43
|
-
"http://npb.jp/bis/#{@year}/stats/idb1_#{@team.downcase}.html"
|
44
|
-
when 'WL', 'EL'
|
45
|
-
"http://npb.jp/bis/#{@year}/stats/idb2_#{@team.downcase}.html"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def keys
|
50
|
-
[
|
51
|
-
:year,
|
52
|
-
:team,
|
53
|
-
:league,
|
54
|
-
:bat,
|
55
|
-
:player,
|
56
|
-
:games,
|
57
|
-
:plate_appearances,
|
58
|
-
:at_bats,
|
59
|
-
:runs,
|
60
|
-
:hits,
|
61
|
-
:doubles,
|
62
|
-
:triples,
|
63
|
-
:home_runs,
|
64
|
-
:total_bases,
|
65
|
-
:runs_batted_in,
|
66
|
-
:stolen_bases,
|
67
|
-
:caught_stealing,
|
68
|
-
:sacrifice_bunts,
|
69
|
-
:sacrifice_flies,
|
70
|
-
:bases_on_balls,
|
71
|
-
:intentional_bases_on_balls,
|
72
|
-
:hit_by_pitch,
|
73
|
-
:strikeouts,
|
74
|
-
:grounded_into_double_playes,
|
75
|
-
:batting_average,
|
76
|
-
:slugging_percentage,
|
77
|
-
:on_base_percentage
|
78
|
-
]
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
data/lib/npb_api/pitching.rb
DELETED
@@ -1,108 +0,0 @@
|
|
1
|
-
require './lib/npb_api/base'
|
2
|
-
|
3
|
-
module NpbApi
|
4
|
-
class Pitching < Base
|
5
|
-
def table
|
6
|
-
extracted_table.map do |values|
|
7
|
-
values.unshift(@year, @team, @league)
|
8
|
-
hash = Hash[*[keys, values].transpose.flatten]
|
9
|
-
hash = hash.map do |key, value|
|
10
|
-
case key
|
11
|
-
when :year, :team, :league, :player
|
12
|
-
[key, value]
|
13
|
-
when :throw
|
14
|
-
[key, _throw(value)]
|
15
|
-
when :winning_percentage
|
16
|
-
[key, value.to_f]
|
17
|
-
when :innings_pitched
|
18
|
-
[key, innings_pitched(value, hash[:innings_pitched_2])]
|
19
|
-
when :earned_run_average
|
20
|
-
[key, earned_run_average(value)]
|
21
|
-
else
|
22
|
-
[key, value.to_i]
|
23
|
-
end
|
24
|
-
end.to_h
|
25
|
-
hash.delete(:innings_pitched_2) # 投球回が2列で表現していたため、一箇所にまとめて小数点の部分を削除
|
26
|
-
hash.merge!(hold: 'NULL', hold_points: 'NULL') if farm?
|
27
|
-
hash
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
# ruby の帯域脱出の throw と名前が重複するのでアンダースコアをつけている
|
34
|
-
def _throw(column)
|
35
|
-
case column
|
36
|
-
when '' then 'R'
|
37
|
-
when '*' then 'L'
|
38
|
-
when '+' then 'S'
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def innings_pitched(innings_pitched_1, innings_pitched_2)
|
43
|
-
return innings_pitched_1.to_i if innings_pitched_2.empty?
|
44
|
-
"#{innings_pitched_1}#{innings_pitched_2}".to_f
|
45
|
-
end
|
46
|
-
|
47
|
-
# 無限大の時は-1を返すようにする
|
48
|
-
def earned_run_average(column)
|
49
|
-
return -1 if column == '----'
|
50
|
-
column.to_f
|
51
|
-
end
|
52
|
-
|
53
|
-
def extracted_table
|
54
|
-
table = TableExtraction.new(url: url).tables.first
|
55
|
-
table.slice!(0..1)
|
56
|
-
table
|
57
|
-
end
|
58
|
-
|
59
|
-
def url
|
60
|
-
case @league
|
61
|
-
when 'CL', 'PL'
|
62
|
-
"http://npb.jp/bis/#{@year}/stats/idp1_#{@team.downcase}.html"
|
63
|
-
when 'WL', 'EL'
|
64
|
-
"http://npb.jp/bis/#{@year}/stats/idp2_#{@team.downcase}.html"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def keys
|
69
|
-
keys = [
|
70
|
-
:year,
|
71
|
-
:team,
|
72
|
-
:league,
|
73
|
-
:throw,
|
74
|
-
:player,
|
75
|
-
:games,
|
76
|
-
:wins,
|
77
|
-
:loses,
|
78
|
-
:saves,
|
79
|
-
:hold,
|
80
|
-
:hold_points,
|
81
|
-
:complete_games,
|
82
|
-
:shutouts,
|
83
|
-
:no_bases_on_balls,
|
84
|
-
:winning_percentage,
|
85
|
-
:total_batters_faced,
|
86
|
-
:innings_pitched,
|
87
|
-
:innings_pitched_2,
|
88
|
-
:hits,
|
89
|
-
:home_runs,
|
90
|
-
:bases_on_balls,
|
91
|
-
:intentional_bases_on_balls,
|
92
|
-
:hit_batsmen,
|
93
|
-
:strikeouts,
|
94
|
-
:wild_pitches,
|
95
|
-
:balks,
|
96
|
-
:runs,
|
97
|
-
:earned_runs,
|
98
|
-
:earned_run_average
|
99
|
-
]
|
100
|
-
keys.delete_if { |key| %i(hold hold_points).include?(key) } if farm?
|
101
|
-
keys
|
102
|
-
end
|
103
|
-
|
104
|
-
def farm?
|
105
|
-
%w(EL WL).include?(@league)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
require 'nokogiri'
|
3
|
-
|
4
|
-
module NpbApi
|
5
|
-
class TableExtraction
|
6
|
-
def initialize(url: '')
|
7
|
-
@url = url
|
8
|
-
end
|
9
|
-
|
10
|
-
def tables
|
11
|
-
tables = Nokogiri::HTML(open(@url)).css('table')
|
12
|
-
tables.inject([]) { |arr, table| arr << table_arr(table) }
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def table_arr(table)
|
18
|
-
table.css('tr').inject([]) { |arr, row| arr << row_arr(row) }
|
19
|
-
end
|
20
|
-
|
21
|
-
def row_arr(row)
|
22
|
-
row.css('th', 'td').inject([]) { |arr, column| arr << column.content }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|