bb_analytics 0.0.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.
@@ -0,0 +1,218 @@
1
+ class StatsForYear
2
+
3
+ FANTASY_HR = 4
4
+ FANTASY_RBI = 1
5
+ FANTASY_SB = 1
6
+ FANTASY_CS = -1
7
+
8
+ attr_accessor :player_external_id, :year, :team, :games, :at_bats, :runs,
9
+ :hits, :doubles, :triples, :home_runs, :runs_batted_in, :stolen_bases,
10
+ :caught_stealing, :batting_average, :slugging_percentage, :fantasy_points
11
+
12
+ def save
13
+ # first see if we can update an existing record
14
+ DataStore.instance.db.execute("select * from stats_for_years where player_external_id = ? and year = ? and team = ?",
15
+ [self.player_external_id, self.year, self.team]) do |row|
16
+
17
+ DataStore.instance.db.execute "update stats_for_years " +
18
+ "set year = ?, team = ?, games = ?, at_bats = ?, runs =?, " +
19
+ "hits = ?, doubles = ?, triples = ?, home_runs = ?, runs_batted_in = ?, " +
20
+ "stolen_bases = ?, caught_stealing = ?, batting_average = ?, slugging_percentage = ?, fantasy_points = ? " +
21
+ "where player_external_id = ?",
22
+ [(self.year.present? ? self.year : row[1]),
23
+ (self.team.present? ? self.team : row[2]),
24
+ (self.games.present? ? self.games : row[3]),
25
+ (self.at_bats.present? ? self.at_bats : row[4]),
26
+ (self.runs.present? ? self.runs : row[5]),
27
+ (self.hits.present? ? self.hits : row[6]),
28
+ (self.doubles.present? ? self.doubles : row[7]),
29
+ (self.triples.present? ? self.triples : row[8]),
30
+ (self.home_runs.present? ? self.home_runs : row[9]),
31
+ (self.runs_batted_in.present? ? self.runs_batted_in : row[10]),
32
+ (self.stolen_bases.present? ? self.stolen_bases : row[11]),
33
+ (self.caught_stealing.present? ? self.caught_stealing : row[12]),
34
+ (self.batting_average.present? ? self.batting_average : row[13]),
35
+ (self.slugging_percentage.present? ? self.slugging_percentage : row[14]),
36
+ (self.fantasy_points.present? ? self.fantasy_points : row[15]),
37
+ self.player_external_id]
38
+ return
39
+ end
40
+
41
+ # if not, just insert
42
+ DataStore.instance.db.execute "insert into stats_for_years values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
43
+ [self.player_external_id,
44
+ self.year,
45
+ self.team,
46
+ self.games,
47
+ self.at_bats,
48
+ self.runs,
49
+ self.hits,
50
+ self.doubles,
51
+ self.triples,
52
+ self.home_runs,
53
+ self.runs_batted_in,
54
+ self.stolen_bases,
55
+ self.caught_stealing,
56
+ self.batting_average,
57
+ self.slugging_percentage,
58
+ self.fantasy_points]
59
+ end
60
+
61
+ def reload
62
+ DataStore.instance.db.execute("select * from stats_for_years where player_external_id = ? and year = ? and team = ?", [self.player_external_id, self.year, self.team]) do |row|
63
+ self.build_from_result_row row
64
+ end
65
+ self
66
+ end
67
+
68
+ def calculate_batting_average!
69
+ self.batting_average = (((self.hits.to_f / self.at_bats.to_f) * 1000).to_i rescue nil)
70
+ end
71
+
72
+ def calculate_slugging_percentage!
73
+ self.slugging_percentage = (((((self.hits - self.doubles - self.triples - self.home_runs) +
74
+ (2 * self.doubles) + (3 * self.triples) +
75
+ (4 * self.home_runs)).to_f / self.at_bats.to_f) * 1000).to_i rescue nil)
76
+ end
77
+
78
+ def calculate_fantasy_points!
79
+ self.fantasy_points = ((self.home_runs * FANTASY_HR) + (self.runs_batted_in * FANTASY_RBI) +
80
+ (self.stolen_bases * FANTASY_SB) + (self.caught_stealing * FANTASY_CS) rescue nil)
81
+ end
82
+
83
+ # finders
84
+
85
+ def self.find_triple_crown_winner year, min_at_bats
86
+ home_run_winners = find_highest_home_runs year, min_at_bats
87
+ rbi_winners = find_highest_rbi year, min_at_bats
88
+ batting_crown_winners = find_highest_batting_average year, min_at_bats
89
+
90
+ first_group = []
91
+ home_run_winners.each{ |hr| first_group << hr if rbi_winners.any?{ |rbi| rbi.player_external_id == hr.player_external_id } }
92
+ second_group = []
93
+ first_group.each{ |fg| second_group << fg if batting_crown_winners.any?{ |bc| bc.player_external_id == fg.player_external_id } }
94
+ second_group.first
95
+ end
96
+
97
+ def self.find_highest_batting_average year, min_at_bats
98
+ highest_batting_average = 0
99
+
100
+ # find the max value in case there are folks who are tied
101
+ DataStore.instance.db.execute("select max(batting_average) from stats_for_years where at_bats > ? and year = ?", [min_at_bats, year]) do |row|
102
+ highest_batting_average = row[0]
103
+ end
104
+
105
+ stats_to_return = []
106
+ # now grab everyone with the high value
107
+ DataStore.instance.db.execute("select * from stats_for_years where at_bats > ? and year = ? and batting_average = ?", [min_at_bats, year, highest_batting_average]) do |row|
108
+ stats = StatsForYear.new
109
+ stats.build_from_result_row row
110
+ stats_to_return << stats
111
+ end
112
+ stats_to_return
113
+ end
114
+
115
+ def self.find_highest_home_runs year, min_at_bats
116
+ highest_home_runs = 0
117
+
118
+ # find the max value in case there are folks who are tied
119
+ DataStore.instance.db.execute("select max(home_runs) from stats_for_years where at_bats > ? and year = ?", [min_at_bats, year]) do |row|
120
+ highest_home_runs = row[0]
121
+ end
122
+
123
+ stats_to_return = []
124
+ # now grab everyone with the high value
125
+ DataStore.instance.db.execute("select * from stats_for_years where at_bats > ? and year = ? and home_runs = ?", [min_at_bats, year, highest_home_runs]) do |row|
126
+ stats = StatsForYear.new
127
+ stats.build_from_result_row row
128
+ stats_to_return << stats
129
+ end
130
+ stats_to_return
131
+ end
132
+
133
+ def self.find_highest_rbi year, min_at_bats
134
+ highest_rbi = 0
135
+
136
+ # find the max value in case there are folks who are tied
137
+ DataStore.instance.db.execute("select max(runs_batted_in) from stats_for_years where at_bats > ? and year = ?", [min_at_bats, year]) do |row|
138
+ highest_rbi = row[0]
139
+ end
140
+
141
+ stats_to_return = []
142
+ # now grab everyone with the high value
143
+ DataStore.instance.db.execute("select * from stats_for_years where at_bats > ? and year = ? and runs_batted_in = ?", [min_at_bats, year, highest_rbi]) do |row|
144
+ stats = StatsForYear.new
145
+ stats.build_from_result_row row
146
+ stats_to_return << stats
147
+ end
148
+ stats_to_return
149
+ end
150
+
151
+ def self.find_team_for_year year, team
152
+ teammates = []
153
+ DataStore.instance.db.execute("select * from stats_for_years where year = ? and team = ?", [year, team]) do |row|
154
+ stats = StatsForYear.new
155
+ stats.build_from_result_row row
156
+ teammates << stats
157
+ end
158
+ teammates
159
+ end
160
+
161
+ # end finders
162
+
163
+ def build_from_result_row row
164
+ self.player_external_id = row[0]
165
+ self.year = row[1]
166
+ self.team = row[2]
167
+ self.games = row[3]
168
+ self.at_bats = row[4]
169
+ self.runs = row[5]
170
+ self.hits = row[6]
171
+ self.doubles = row[7]
172
+ self.triples = row[8]
173
+ self.home_runs = row[9]
174
+ self.runs_batted_in = row[10]
175
+ self.stolen_bases = row[11]
176
+ self.caught_stealing = row[12]
177
+ self.batting_average = row[13]
178
+ self.slugging_percentage = row[14]
179
+ self.fantasy_points = row[15]
180
+ end
181
+
182
+ def baseball_player
183
+ BaseballPlayer.find_by_external_id self.player_external_id
184
+ end
185
+
186
+ def self.most_improved_batting_average from_year, to_year
187
+ sql = 'select a.player_external_id, (a.batting_average - b.batting_average) ' +
188
+ 'from stats_for_years a, stats_for_years b ' +
189
+ 'where a.year = ? and b.year = ? ' +
190
+ 'and a.player_external_id = b.player_external_id'
191
+
192
+ parse_most_improved sql, from_year, to_year
193
+ end
194
+
195
+ def self.most_improved_fantasy_points from_year, to_year
196
+ sql = 'select a.player_external_id, (a.fantasy_points - b.fantasy_points) ' +
197
+ 'from stats_for_years a, stats_for_years b ' +
198
+ 'where a.year = ? and b.year = ? ' +
199
+ 'and a.player_external_id = b.player_external_id'
200
+
201
+
202
+ parse_most_improved sql, from_year, to_year
203
+ end
204
+
205
+ private
206
+
207
+ def self.parse_most_improved sql, from_year, to_year
208
+ deltas = []
209
+ DataStore.instance.db.execute(sql,[to_year, from_year]) do |row|
210
+ deltas << [row[0], row[1]]
211
+ end
212
+ deltas.select!{ |d| d[0].present? && d[1].present? }
213
+ deltas.sort!{ |x,y| y[1] <=> x[1] }
214
+ highest = deltas.first
215
+ deltas.select{ |d| d[1] == highest[1] }.map{ |d| d[0] }
216
+ end
217
+
218
+ end
@@ -0,0 +1,3 @@
1
+ module BbAnalytics
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,24 @@
1
+ require 'bb_analytics/version.rb'
2
+ require 'bb_analytics/models/importer.rb'
3
+ require 'bb_analytics/models/baseball_player.rb'
4
+ require 'bb_analytics/models/stats_for_year.rb'
5
+ require 'bb_analytics/models/data_store.rb'
6
+
7
+ # some ActiveSupport style monkey patching for '#present?'
8
+ class String
9
+ def present?
10
+ !self.nil? && self != ""
11
+ end
12
+ end
13
+
14
+ class NilClass
15
+ def present?
16
+ false
17
+ end
18
+ end
19
+
20
+ class Integer
21
+ def present?
22
+ !self.nil?
23
+ end
24
+ end