nba 0.1.1 → 0.2.0
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 +5 -5
- data/AGENTS.md +362 -0
- data/CHANGELOG.md +169 -0
- data/CLAUDE.md +1 -0
- data/LICENSE +21 -0
- data/README.md +501 -101
- data/bin/console +10 -0
- data/bin/setup +6 -0
- data/exe/nba +8 -0
- data/lib/nba/all_time_leader.rb +77 -0
- data/lib/nba/all_time_leaders.rb +185 -0
- data/lib/nba/assist_leader.rb +92 -0
- data/lib/nba/assist_leaders.rb +64 -0
- data/lib/nba/assist_tracker.rb +108 -0
- data/lib/nba/assist_tracker_entry.rb +206 -0
- data/lib/nba/award.rb +128 -0
- data/lib/nba/box_score.rb +2 -0
- data/lib/nba/box_score_advanced.rb +114 -0
- data/lib/nba/box_score_advanced_player_stat.rb +297 -0
- data/lib/nba/box_score_advanced_team_stat.rb +237 -0
- data/lib/nba/box_score_advanced_v3.rb +124 -0
- data/lib/nba/box_score_defensive_player_stat.rb +281 -0
- data/lib/nba/box_score_defensive_team_stat.rb +85 -0
- data/lib/nba/box_score_defensive_v2.rb +190 -0
- data/lib/nba/box_score_four_factors.rb +91 -0
- data/lib/nba/box_score_four_factors_player_stat.rb +185 -0
- data/lib/nba/box_score_four_factors_team_stat.rb +141 -0
- data/lib/nba/box_score_four_factors_v3.rb +133 -0
- data/lib/nba/box_score_hustle.rb +226 -0
- data/lib/nba/box_score_hustle_player_stat.rb +233 -0
- data/lib/nba/box_score_hustle_team_stat.rb +189 -0
- data/lib/nba/box_score_matchup_stat.rb +417 -0
- data/lib/nba/box_score_matchups_v3.rb +184 -0
- data/lib/nba/box_score_misc.rb +100 -0
- data/lib/nba/box_score_misc_player_stat.rb +217 -0
- data/lib/nba/box_score_misc_team_stat.rb +173 -0
- data/lib/nba/box_score_misc_v3.rb +163 -0
- data/lib/nba/box_score_player_stat.rb +273 -0
- data/lib/nba/box_score_player_track.rb +223 -0
- data/lib/nba/box_score_player_track_stat.rb +273 -0
- data/lib/nba/box_score_player_track_team_stat.rb +229 -0
- data/lib/nba/box_score_scoring.rb +103 -0
- data/lib/nba/box_score_scoring_player_stat.rb +241 -0
- data/lib/nba/box_score_scoring_team_stat.rb +197 -0
- data/lib/nba/box_score_scoring_v3.rb +170 -0
- data/lib/nba/box_score_similarity_score.rb +119 -0
- data/lib/nba/box_score_similarity_stat.rb +76 -0
- data/lib/nba/box_score_starter_bench_stat.rb +257 -0
- data/lib/nba/box_score_summary.rb +285 -0
- data/lib/nba/box_score_summary_v2.rb +202 -0
- data/lib/nba/box_score_summary_v3.rb +120 -0
- data/lib/nba/box_score_summary_v3_data.rb +419 -0
- data/lib/nba/box_score_team_stat.rb +229 -0
- data/lib/nba/box_score_traditional.rb +101 -0
- data/lib/nba/box_score_traditional_v3.rb +195 -0
- data/lib/nba/box_score_usage.rb +102 -0
- data/lib/nba/box_score_usage_player_stat.rb +265 -0
- data/lib/nba/box_score_usage_team_stat.rb +221 -0
- data/lib/nba/box_score_usage_v3.rb +169 -0
- data/lib/nba/box_score_v3_helpers.rb +144 -0
- data/lib/nba/career_stats.rb +217 -0
- data/lib/nba/cli/display/player_display.rb +98 -0
- data/lib/nba/cli/display.rb +178 -0
- data/lib/nba/cli/formatters/game_formatters.rb +86 -0
- data/lib/nba/cli/formatters/leaders_formatters.rb +26 -0
- data/lib/nba/cli/formatters/player_formatters.rb +52 -0
- data/lib/nba/cli/formatters/standings_formatters.rb +26 -0
- data/lib/nba/cli/formatters/team_formatters.rb +67 -0
- data/lib/nba/cli/formatters/time_formatters.rb +82 -0
- data/lib/nba/cli/formatters.rb +56 -0
- data/lib/nba/cli/helpers.rb +135 -0
- data/lib/nba/cli.rb +171 -20
- data/lib/nba/client.rb +35 -0
- data/lib/nba/collection.rb +89 -0
- data/lib/nba/college_player_stat.rb +200 -0
- data/lib/nba/common_player_info.rb +142 -0
- data/lib/nba/common_playoff_series.rb +90 -0
- data/lib/nba/common_team_years.rb +113 -0
- data/lib/nba/conference.rb +39 -0
- data/lib/nba/connection.rb +84 -0
- data/lib/nba/cume_stats_player.rb +358 -0
- data/lib/nba/cume_stats_player_game.rb +217 -0
- data/lib/nba/cume_stats_player_games.rb +99 -0
- data/lib/nba/cume_stats_player_games_entry.rb +25 -0
- data/lib/nba/cume_stats_player_total.rb +481 -0
- data/lib/nba/cume_stats_team.rb +349 -0
- data/lib/nba/cume_stats_team_games.rb +145 -0
- data/lib/nba/cume_stats_team_games_entry.rb +25 -0
- data/lib/nba/cume_stats_team_player.rb +485 -0
- data/lib/nba/cume_stats_team_total.rb +267 -0
- data/lib/nba/data.rb +73 -0
- data/lib/nba/defense_hub.rb +109 -0
- data/lib/nba/defense_hub_stat.rb +57 -0
- data/lib/nba/defensive_shot_stat.rb +102 -0
- data/lib/nba/division.rb +49 -0
- data/lib/nba/draft_board.rb +126 -0
- data/lib/nba/draft_board_pick.rb +173 -0
- data/lib/nba/draft_combine_anthro_measurement.rb +163 -0
- data/lib/nba/draft_combine_drill_result.rb +115 -0
- data/lib/nba/draft_combine_drill_results.rb +112 -0
- data/lib/nba/draft_combine_non_stationary_shooting.rb +268 -0
- data/lib/nba/draft_combine_non_stationary_shooting_result.rb +355 -0
- data/lib/nba/draft_combine_player_anthro.rb +133 -0
- data/lib/nba/draft_combine_spot_shooting.rb +243 -0
- data/lib/nba/draft_combine_spot_shooting_result.rb +419 -0
- data/lib/nba/draft_combine_stat.rb +211 -0
- data/lib/nba/draft_combine_stats.rb +160 -0
- data/lib/nba/draft_history.rb +142 -0
- data/lib/nba/draft_pick.rb +154 -0
- data/lib/nba/dunk_score_leader.rb +93 -0
- data/lib/nba/dunk_score_leaders.rb +77 -0
- data/lib/nba/estimated_metrics_stat.rb +152 -0
- data/lib/nba/fantasy_profile_stat.rb +142 -0
- data/lib/nba/fantasy_widget.rb +72 -0
- data/lib/nba/fantasy_widget_player.rb +98 -0
- data/lib/nba/found_game.rb +260 -0
- data/lib/nba/franchise.rb +136 -0
- data/lib/nba/franchise_history.rb +142 -0
- data/lib/nba/franchise_leader.rb +147 -0
- data/lib/nba/franchise_leaders.rb +162 -0
- data/lib/nba/franchise_player.rb +224 -0
- data/lib/nba/franchise_players.rb +147 -0
- data/lib/nba/game.rb +80 -64
- data/lib/nba/game_log.rb +349 -0
- data/lib/nba/game_rotation.rb +152 -0
- data/lib/nba/game_streak.rb +102 -0
- data/lib/nba/games.rb +46 -0
- data/lib/nba/home_page_leader.rb +99 -0
- data/lib/nba/home_page_leaders.rb +75 -0
- data/lib/nba/home_page_stat.rb +57 -0
- data/lib/nba/home_page_v2.rb +110 -0
- data/lib/nba/hustle_stats_box_score.rb +182 -0
- data/lib/nba/infographic_fan_duel_player.rb +139 -0
- data/lib/nba/infographic_fan_duel_player_stat.rb +311 -0
- data/lib/nba/ist_standing.rb +167 -0
- data/lib/nba/ist_standings.rb +81 -0
- data/lib/nba/leader.rb +103 -0
- data/lib/nba/leaders.rb +110 -0
- data/lib/nba/leaders_tile.rb +57 -0
- data/lib/nba/leaders_tiles.rb +90 -0
- data/lib/nba/league.rb +37 -0
- data/lib/nba/league_dash_lineup_stat.rb +270 -0
- data/lib/nba/league_dash_lineups.rb +177 -0
- data/lib/nba/league_dash_opp_pt_shot.rb +150 -0
- data/lib/nba/league_dash_player_bio_stat.rb +217 -0
- data/lib/nba/league_dash_player_bio_stats.rb +164 -0
- data/lib/nba/league_dash_player_clutch.rb +212 -0
- data/lib/nba/league_dash_player_clutch_stat.rb +271 -0
- data/lib/nba/league_dash_player_pt_shot.rb +152 -0
- data/lib/nba/league_dash_player_pt_shot_stat.rb +193 -0
- data/lib/nba/league_dash_player_shot_location_stat.rb +265 -0
- data/lib/nba/league_dash_player_shot_locations.rb +210 -0
- data/lib/nba/league_dash_player_stat.rb +306 -0
- data/lib/nba/league_dash_player_stats.rb +176 -0
- data/lib/nba/league_dash_pt_defend.rb +160 -0
- data/lib/nba/league_dash_pt_defend_stat.rb +145 -0
- data/lib/nba/league_dash_pt_stats.rb +152 -0
- data/lib/nba/league_dash_pt_stats_stat.rb +169 -0
- data/lib/nba/league_dash_pt_team_defend.rb +158 -0
- data/lib/nba/league_dash_pt_team_defend_stat.rb +110 -0
- data/lib/nba/league_dash_team_clutch.rb +211 -0
- data/lib/nba/league_dash_team_clutch_stat.rb +237 -0
- data/lib/nba/league_dash_team_pt_shot.rb +150 -0
- data/lib/nba/league_dash_team_pt_shot_stat.rb +166 -0
- data/lib/nba/league_dash_team_shot_location_stat.rb +230 -0
- data/lib/nba/league_dash_team_shot_locations.rb +208 -0
- data/lib/nba/league_dash_team_stat.rb +275 -0
- data/lib/nba/league_dash_team_stats.rb +172 -0
- data/lib/nba/league_game_finder.rb +170 -0
- data/lib/nba/league_game_log.rb +224 -0
- data/lib/nba/league_hustle_stats_player.rb +161 -0
- data/lib/nba/league_hustle_stats_player_stat.rb +253 -0
- data/lib/nba/league_hustle_stats_team.rb +157 -0
- data/lib/nba/league_hustle_stats_team_stat.rb +179 -0
- data/lib/nba/league_lineup_viz.rb +184 -0
- data/lib/nba/league_lineup_viz_stat.rb +214 -0
- data/lib/nba/league_player_on_details.rb +175 -0
- data/lib/nba/league_player_on_details_stat.rb +313 -0
- data/lib/nba/league_season_matchup_stat.rb +241 -0
- data/lib/nba/league_season_matchups.rb +181 -0
- data/lib/nba/league_standing.rb +284 -0
- data/lib/nba/league_standings.rb +159 -0
- data/lib/nba/league_wide_shot_stat.rb +62 -0
- data/lib/nba/live_action.rb +240 -0
- data/lib/nba/live_box_score.rb +143 -0
- data/lib/nba/live_connection.rb +84 -0
- data/lib/nba/live_game.rb +230 -0
- data/lib/nba/live_play_by_play.rb +120 -0
- data/lib/nba/live_player_stat.rb +276 -0
- data/lib/nba/live_scoreboard.rb +102 -0
- data/lib/nba/matchup_rollup.rb +98 -0
- data/lib/nba/matchups_rollup.rb +81 -0
- data/lib/nba/pass_stat.rb +209 -0
- data/lib/nba/play.rb +258 -0
- data/lib/nba/play_by_play.rb +85 -0
- data/lib/nba/play_by_play_v3.rb +91 -0
- data/lib/nba/play_type_stat.rb +206 -0
- data/lib/nba/player.rb +242 -24
- data/lib/nba/player_awards.rb +110 -0
- data/lib/nba/player_career_by_college.rb +86 -0
- data/lib/nba/player_career_by_college_rollup.rb +143 -0
- data/lib/nba/player_career_stats.rb +77 -0
- data/lib/nba/player_compare.rb +156 -0
- data/lib/nba/player_comparison_stat.rb +242 -0
- data/lib/nba/player_dash_pt_pass.rb +164 -0
- data/lib/nba/player_dash_pt_reb.rb +235 -0
- data/lib/nba/player_dash_pt_shot_defend.rb +119 -0
- data/lib/nba/player_dash_pt_shots.rb +279 -0
- data/lib/nba/player_dashboard.rb +259 -0
- data/lib/nba/player_dashboard_stat.rb +248 -0
- data/lib/nba/player_estimated_metrics.rb +84 -0
- data/lib/nba/player_fantasy_profile_bar_graph.rb +147 -0
- data/lib/nba/player_game_log.rb +72 -0
- data/lib/nba/player_game_logs.rb +117 -0
- data/lib/nba/player_game_streak_finder.rb +108 -0
- data/lib/nba/player_index.rb +135 -0
- data/lib/nba/player_index_entry.rb +266 -0
- data/lib/nba/player_info.rb +225 -0
- data/lib/nba/player_next_n_games.rb +64 -0
- data/lib/nba/player_profile_v2.rb +169 -0
- data/lib/nba/player_vs_player.rb +153 -0
- data/lib/nba/players.rb +107 -0
- data/lib/nba/playoff_matchup.rb +84 -0
- data/lib/nba/playoff_picture.rb +98 -0
- data/lib/nba/playoff_series.rb +76 -0
- data/lib/nba/position.rb +48 -0
- data/lib/nba/rebound_stat.rb +189 -0
- data/lib/nba/response_parser.rb +116 -0
- data/lib/nba/roster.rb +74 -0
- data/lib/nba/rotation_entry.rb +154 -0
- data/lib/nba/schedule.rb +183 -0
- data/lib/nba/schedule_international.rb +182 -0
- data/lib/nba/scheduled_game.rb +240 -0
- data/lib/nba/scoreboard.rb +183 -0
- data/lib/nba/scoreboard_v3.rb +104 -0
- data/lib/nba/shot.rb +208 -0
- data/lib/nba/shot_chart.rb +75 -0
- data/lib/nba/shot_chart_league_wide.rb +102 -0
- data/lib/nba/shot_chart_lineup_detail.rb +109 -0
- data/lib/nba/shot_stat.rb +174 -0
- data/lib/nba/standing.rb +129 -0
- data/lib/nba/standings.rb +75 -0
- data/lib/nba/static.rb +107 -0
- data/lib/nba/synergy_play_types.rb +211 -0
- data/lib/nba/team.rb +203 -127
- data/lib/nba/team_and_players_vs_players.rb +227 -0
- data/lib/nba/team_and_players_vs_players_stat.rb +155 -0
- data/lib/nba/team_dash_pt_pass.rb +157 -0
- data/lib/nba/team_dash_pt_reb.rb +216 -0
- data/lib/nba/team_dash_pt_shots.rb +244 -0
- data/lib/nba/team_dashboard.rb +275 -0
- data/lib/nba/team_dashboard_stat.rb +248 -0
- data/lib/nba/team_detail.rb +117 -0
- data/lib/nba/team_details.rb +173 -0
- data/lib/nba/team_estimated_metrics.rb +91 -0
- data/lib/nba/team_estimated_metrics_stat.rb +146 -0
- data/lib/nba/team_game_log.rb +143 -0
- data/lib/nba/team_game_log_entry.rb +246 -0
- data/lib/nba/team_game_log_stat.rb +275 -0
- data/lib/nba/team_game_logs.rb +163 -0
- data/lib/nba/team_game_streak.rb +111 -0
- data/lib/nba/team_game_streak_finder.rb +109 -0
- data/lib/nba/team_historical_leader.rb +207 -0
- data/lib/nba/team_historical_leaders.rb +98 -0
- data/lib/nba/team_historical_record.rb +139 -0
- data/lib/nba/team_info.rb +150 -0
- data/lib/nba/team_info_common.rb +177 -0
- data/lib/nba/team_on_off_overall_stat.rb +477 -0
- data/lib/nba/team_on_off_player_stat.rb +523 -0
- data/lib/nba/team_on_off_player_summary.rb +135 -0
- data/lib/nba/team_pass_stat.rb +183 -0
- data/lib/nba/team_player_dashboard.rb +212 -0
- data/lib/nba/team_player_on_off_details.rb +218 -0
- data/lib/nba/team_player_on_off_summary.rb +214 -0
- data/lib/nba/team_player_stat.rb +275 -0
- data/lib/nba/team_rebound_stat.rb +189 -0
- data/lib/nba/team_season_rank.rb +110 -0
- data/lib/nba/team_shot_stat.rb +173 -0
- data/lib/nba/team_vs_player.rb +151 -0
- data/lib/nba/team_vs_player_stat.rb +157 -0
- data/lib/nba/team_year.rb +55 -0
- data/lib/nba/team_year_by_year_stats.rb +152 -0
- data/lib/nba/team_year_stat.rb +282 -0
- data/lib/nba/teams.rb +33 -0
- data/lib/nba/upcoming_game.rb +115 -0
- data/lib/nba/utils.rb +94 -0
- data/lib/nba/version.rb +5 -2
- data/lib/nba/video_detail.rb +103 -0
- data/lib/nba/video_details.rb +118 -0
- data/lib/nba/video_details_asset.rb +115 -0
- data/lib/nba/video_details_asset_entry.rb +91 -0
- data/lib/nba/video_event.rb +83 -0
- data/lib/nba/video_event_asset.rb +91 -0
- data/lib/nba/video_events.rb +106 -0
- data/lib/nba/video_events_asset.rb +107 -0
- data/lib/nba/video_status.rb +129 -0
- data/lib/nba/video_status_entry.rb +161 -0
- data/lib/nba/vs_player_stat.rb +156 -0
- data/lib/nba/win_probability.rb +117 -0
- data/lib/nba/win_probability_point.rb +140 -0
- data/lib/nba.rb +249 -5
- data/sig/equalizer.rbs +3 -0
- data/sig/nba.rbs +7297 -0
- data/sig/shale.rbs +24 -0
- data/sig/thor.rbs +19 -0
- metadata +324 -95
- data/.gitignore +0 -18
- data/.travis.yml +0 -22
- data/Gemfile +0 -23
- data/LICENSE.md +0 -22
- data/Rakefile +0 -18
- data/bin/nba +0 -7
- data/cache/teams.json +0 -16529
- data/lib/faraday_middleware/scrape_game.rb +0 -41
- data/lib/nba/request.rb +0 -37
- data/nba.gemspec +0 -28
- data/spec/fixtures/games.html +0 -785
- data/spec/fixtures/teams.json +0 -16529
- data/spec/game_spec.rb +0 -40
- data/spec/spec_helper.rb +0 -25
- data/spec/team_spec.rb +0 -93
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
require_relative "client"
|
|
3
|
+
require_relative "collection"
|
|
4
|
+
require_relative "utils"
|
|
5
|
+
|
|
6
|
+
require_relative "box_score_similarity_stat"
|
|
7
|
+
|
|
8
|
+
module NBA
|
|
9
|
+
# Provides methods to retrieve G League Alum box score similarity scores
|
|
10
|
+
module BoxScoreSimilarityScore
|
|
11
|
+
# Result set name for similarity scores
|
|
12
|
+
# @return [String] the result set name
|
|
13
|
+
RESULT_SET_NAME = "GLeagueAlumBoxScoreSimilarityScores".freeze
|
|
14
|
+
|
|
15
|
+
# Regular season type constant
|
|
16
|
+
# @return [String] the season type
|
|
17
|
+
REGULAR_SEASON = "Regular Season".freeze
|
|
18
|
+
|
|
19
|
+
# Playoffs season type constant
|
|
20
|
+
# @return [String] the season type
|
|
21
|
+
PLAYOFFS = "Playoffs".freeze
|
|
22
|
+
|
|
23
|
+
# Retrieves box score similarity scores for two players
|
|
24
|
+
#
|
|
25
|
+
# @api public
|
|
26
|
+
# @example
|
|
27
|
+
# stats = NBA::BoxScoreSimilarityScore.find(first_person: 201939, second_person: 203507)
|
|
28
|
+
# stats.first.similarity_score #=> 0.85
|
|
29
|
+
# @param first_person [Integer, Player] the first player ID or Player object
|
|
30
|
+
# @param second_person [Integer, Player] the second player ID or Player object
|
|
31
|
+
# @param first_season [Integer] the season year for first player
|
|
32
|
+
# @param second_season [Integer] the season year for second player
|
|
33
|
+
# @param first_season_type [String] the season type for first player
|
|
34
|
+
# @param second_season_type [String] the season type for second player
|
|
35
|
+
# @param client [Client] the API client to use
|
|
36
|
+
# @return [Collection] a collection of similarity stats
|
|
37
|
+
def self.find(first_person:, second_person:, first_season: Utils.current_season, second_season: Utils.current_season,
|
|
38
|
+
first_season_type: REGULAR_SEASON, second_season_type: REGULAR_SEASON, client: CLIENT)
|
|
39
|
+
first_id = Utils.extract_id(first_person)
|
|
40
|
+
second_id = Utils.extract_id(second_person)
|
|
41
|
+
path = build_path(first_id: first_id, second_id: second_id, first_season: first_season, second_season: second_season,
|
|
42
|
+
first_season_type: first_season_type, second_season_type: second_season_type)
|
|
43
|
+
response = client.get(path)
|
|
44
|
+
parse_response(response, first_id)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Builds the API path
|
|
48
|
+
#
|
|
49
|
+
# @api private
|
|
50
|
+
# @return [String] the request path
|
|
51
|
+
def self.build_path(opts)
|
|
52
|
+
"glalumboxscoresimilarityscore?Person1Id=#{opts[:first_id]}&Person2Id=#{opts[:second_id]}" \
|
|
53
|
+
"&Person1LeagueId=00&Person2LeagueId=00" \
|
|
54
|
+
"&Person1Season=#{Utils.format_season(opts[:first_season])}&Person2Season=#{Utils.format_season(opts[:second_season])}" \
|
|
55
|
+
"&Person1SeasonType=#{opts[:first_season_type]}&Person2SeasonType=#{opts[:second_season_type]}"
|
|
56
|
+
end
|
|
57
|
+
private_class_method :build_path
|
|
58
|
+
|
|
59
|
+
# Parses the API response into stat objects
|
|
60
|
+
#
|
|
61
|
+
# @api private
|
|
62
|
+
# @return [Collection] collection of similarity stats
|
|
63
|
+
def self.parse_response(response, first_person_id)
|
|
64
|
+
return Collection.new unless response
|
|
65
|
+
|
|
66
|
+
data = JSON.parse(response)
|
|
67
|
+
result_set = find_result_set(data)
|
|
68
|
+
return Collection.new unless result_set
|
|
69
|
+
|
|
70
|
+
build_stats(result_set, first_person_id)
|
|
71
|
+
end
|
|
72
|
+
private_class_method :parse_response
|
|
73
|
+
|
|
74
|
+
# Finds the result set by name
|
|
75
|
+
#
|
|
76
|
+
# @api private
|
|
77
|
+
# @return [Hash, nil] the result set hash or nil if not found
|
|
78
|
+
def self.find_result_set(data)
|
|
79
|
+
result_sets = data["resultSets"]
|
|
80
|
+
return unless result_sets
|
|
81
|
+
|
|
82
|
+
result_sets.find { |rs| rs["name"].eql?(RESULT_SET_NAME) }
|
|
83
|
+
end
|
|
84
|
+
private_class_method :find_result_set
|
|
85
|
+
|
|
86
|
+
# Builds stats collection from result set
|
|
87
|
+
#
|
|
88
|
+
# @api private
|
|
89
|
+
# @return [Collection] the stats collection
|
|
90
|
+
def self.build_stats(result_set, first_person_id)
|
|
91
|
+
headers = result_set["headers"]
|
|
92
|
+
rows = result_set["rowSet"]
|
|
93
|
+
return Collection.new unless headers && rows
|
|
94
|
+
|
|
95
|
+
Collection.new(rows.map { |row| build_stat(headers.zip(row).to_h, first_person_id) })
|
|
96
|
+
end
|
|
97
|
+
private_class_method :build_stats
|
|
98
|
+
|
|
99
|
+
# Builds a single stat object from API data
|
|
100
|
+
#
|
|
101
|
+
# @api private
|
|
102
|
+
# @return [BoxScoreSimilarityStat] the stat object
|
|
103
|
+
def self.build_stat(data, first_person_id)
|
|
104
|
+
BoxScoreSimilarityStat.new(**stat_attributes(data, first_person_id))
|
|
105
|
+
end
|
|
106
|
+
private_class_method :build_stat
|
|
107
|
+
|
|
108
|
+
# Extracts stat attributes from data
|
|
109
|
+
#
|
|
110
|
+
# @api private
|
|
111
|
+
# @return [Hash] the stat attributes
|
|
112
|
+
def self.stat_attributes(data, first_person_id)
|
|
113
|
+
{first_person_id: first_person_id, second_person_id: data["PERSON_2_ID"],
|
|
114
|
+
second_person_name: data["PERSON_2"], team_id: data["TEAM_ID"],
|
|
115
|
+
similarity_score: data["SIMILARITY_SCORE"]}
|
|
116
|
+
end
|
|
117
|
+
private_class_method :stat_attributes
|
|
118
|
+
end
|
|
119
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module NBA
|
|
2
|
+
# Represents a G League Alum box score similarity score
|
|
3
|
+
class BoxScoreSimilarityStat < Shale::Mapper
|
|
4
|
+
include Equalizer.new(:first_person_id, :second_person_id)
|
|
5
|
+
|
|
6
|
+
# @!attribute [rw] first_person_id
|
|
7
|
+
# Returns the first player ID
|
|
8
|
+
# @api public
|
|
9
|
+
# @example
|
|
10
|
+
# stat.first_person_id #=> 201939
|
|
11
|
+
# @return [Integer] the first player ID
|
|
12
|
+
attribute :first_person_id, Shale::Type::Integer
|
|
13
|
+
|
|
14
|
+
# @!attribute [rw] second_person_id
|
|
15
|
+
# Returns the second player ID
|
|
16
|
+
# @api public
|
|
17
|
+
# @example
|
|
18
|
+
# stat.second_person_id #=> 203507
|
|
19
|
+
# @return [Integer] the second player ID
|
|
20
|
+
attribute :second_person_id, Shale::Type::Integer
|
|
21
|
+
|
|
22
|
+
# @!attribute [rw] second_person_name
|
|
23
|
+
# Returns the second player name
|
|
24
|
+
# @api public
|
|
25
|
+
# @example
|
|
26
|
+
# stat.second_person_name #=> "Giannis Antetokounmpo"
|
|
27
|
+
# @return [String] the second player name
|
|
28
|
+
attribute :second_person_name, Shale::Type::String
|
|
29
|
+
|
|
30
|
+
# @!attribute [rw] team_id
|
|
31
|
+
# Returns the team ID
|
|
32
|
+
# @api public
|
|
33
|
+
# @example
|
|
34
|
+
# stat.team_id #=> 1610612749
|
|
35
|
+
# @return [Integer] the team ID
|
|
36
|
+
attribute :team_id, Shale::Type::Integer
|
|
37
|
+
|
|
38
|
+
# @!attribute [rw] similarity_score
|
|
39
|
+
# Returns the similarity score between the two players
|
|
40
|
+
# @api public
|
|
41
|
+
# @example
|
|
42
|
+
# stat.similarity_score #=> 0.85
|
|
43
|
+
# @return [Float] the similarity score
|
|
44
|
+
attribute :similarity_score, Shale::Type::Float
|
|
45
|
+
|
|
46
|
+
# Returns the first player object
|
|
47
|
+
#
|
|
48
|
+
# @api public
|
|
49
|
+
# @example
|
|
50
|
+
# stat.first_person #=> #<NBA::Player>
|
|
51
|
+
# @return [Player, nil] the first player object
|
|
52
|
+
def first_person
|
|
53
|
+
Players.find(first_person_id)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Returns the second player object
|
|
57
|
+
#
|
|
58
|
+
# @api public
|
|
59
|
+
# @example
|
|
60
|
+
# stat.second_person #=> #<NBA::Player>
|
|
61
|
+
# @return [Player, nil] the second player object
|
|
62
|
+
def second_person
|
|
63
|
+
Players.find(second_person_id)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Returns the team object
|
|
67
|
+
#
|
|
68
|
+
# @api public
|
|
69
|
+
# @example
|
|
70
|
+
# stat.team #=> #<NBA::Team>
|
|
71
|
+
# @return [Team, nil] the team object
|
|
72
|
+
def team
|
|
73
|
+
Teams.find(team_id)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
require "equalizer"
|
|
2
|
+
require "shale"
|
|
3
|
+
|
|
4
|
+
module NBA
|
|
5
|
+
# Represents starter vs bench aggregate statistics for a team in a game
|
|
6
|
+
class BoxScoreStarterBenchStat < Shale::Mapper
|
|
7
|
+
include Equalizer.new(:game_id, :team_id, :starters_bench)
|
|
8
|
+
|
|
9
|
+
# @!attribute [rw] game_id
|
|
10
|
+
# Returns the game ID
|
|
11
|
+
# @api public
|
|
12
|
+
# @example
|
|
13
|
+
# stat.game_id #=> "0022400001"
|
|
14
|
+
# @return [String] the game ID
|
|
15
|
+
attribute :game_id, Shale::Type::String
|
|
16
|
+
|
|
17
|
+
# @!attribute [rw] team_id
|
|
18
|
+
# Returns the team ID
|
|
19
|
+
# @api public
|
|
20
|
+
# @example
|
|
21
|
+
# stat.team_id #=> 1610612744
|
|
22
|
+
# @return [Integer] the team ID
|
|
23
|
+
attribute :team_id, Shale::Type::Integer
|
|
24
|
+
|
|
25
|
+
# @!attribute [rw] team_name
|
|
26
|
+
# Returns the team name
|
|
27
|
+
# @api public
|
|
28
|
+
# @example
|
|
29
|
+
# stat.team_name #=> "Warriors"
|
|
30
|
+
# @return [String] the team name
|
|
31
|
+
attribute :team_name, Shale::Type::String
|
|
32
|
+
|
|
33
|
+
# @!attribute [rw] team_abbreviation
|
|
34
|
+
# Returns the team abbreviation
|
|
35
|
+
# @api public
|
|
36
|
+
# @example
|
|
37
|
+
# stat.team_abbreviation #=> "GSW"
|
|
38
|
+
# @return [String] the team abbreviation
|
|
39
|
+
attribute :team_abbreviation, Shale::Type::String
|
|
40
|
+
|
|
41
|
+
# @!attribute [rw] team_city
|
|
42
|
+
# Returns the team city
|
|
43
|
+
# @api public
|
|
44
|
+
# @example
|
|
45
|
+
# stat.team_city #=> "Golden State"
|
|
46
|
+
# @return [String] the team city
|
|
47
|
+
attribute :team_city, Shale::Type::String
|
|
48
|
+
|
|
49
|
+
# @!attribute [rw] starters_bench
|
|
50
|
+
# Returns whether this is starters or bench stats
|
|
51
|
+
# @api public
|
|
52
|
+
# @example
|
|
53
|
+
# stat.starters_bench #=> "starters"
|
|
54
|
+
# @return [String] "starters" or "bench"
|
|
55
|
+
attribute :starters_bench, Shale::Type::String
|
|
56
|
+
|
|
57
|
+
# @!attribute [rw] min
|
|
58
|
+
# Returns minutes played
|
|
59
|
+
# @api public
|
|
60
|
+
# @example
|
|
61
|
+
# stat.min #=> "PT120M00.00S"
|
|
62
|
+
# @return [String] minutes played
|
|
63
|
+
attribute :min, Shale::Type::String
|
|
64
|
+
|
|
65
|
+
# @!attribute [rw] fgm
|
|
66
|
+
# Returns field goals made
|
|
67
|
+
# @api public
|
|
68
|
+
# @example
|
|
69
|
+
# stat.fgm #=> 35
|
|
70
|
+
# @return [Integer] field goals made
|
|
71
|
+
attribute :fgm, Shale::Type::Integer
|
|
72
|
+
|
|
73
|
+
# @!attribute [rw] fga
|
|
74
|
+
# Returns field goals attempted
|
|
75
|
+
# @api public
|
|
76
|
+
# @example
|
|
77
|
+
# stat.fga #=> 70
|
|
78
|
+
# @return [Integer] field goals attempted
|
|
79
|
+
attribute :fga, Shale::Type::Integer
|
|
80
|
+
|
|
81
|
+
# @!attribute [rw] fg_pct
|
|
82
|
+
# Returns field goal percentage
|
|
83
|
+
# @api public
|
|
84
|
+
# @example
|
|
85
|
+
# stat.fg_pct #=> 0.5
|
|
86
|
+
# @return [Float] field goal percentage
|
|
87
|
+
attribute :fg_pct, Shale::Type::Float
|
|
88
|
+
|
|
89
|
+
# @!attribute [rw] fg3m
|
|
90
|
+
# Returns three-pointers made
|
|
91
|
+
# @api public
|
|
92
|
+
# @example
|
|
93
|
+
# stat.fg3m #=> 10
|
|
94
|
+
# @return [Integer] three-pointers made
|
|
95
|
+
attribute :fg3m, Shale::Type::Integer
|
|
96
|
+
|
|
97
|
+
# @!attribute [rw] fg3a
|
|
98
|
+
# Returns three-pointers attempted
|
|
99
|
+
# @api public
|
|
100
|
+
# @example
|
|
101
|
+
# stat.fg3a #=> 25
|
|
102
|
+
# @return [Integer] three-pointers attempted
|
|
103
|
+
attribute :fg3a, Shale::Type::Integer
|
|
104
|
+
|
|
105
|
+
# @!attribute [rw] fg3_pct
|
|
106
|
+
# Returns three-point percentage
|
|
107
|
+
# @api public
|
|
108
|
+
# @example
|
|
109
|
+
# stat.fg3_pct #=> 0.4
|
|
110
|
+
# @return [Float] three-point percentage
|
|
111
|
+
attribute :fg3_pct, Shale::Type::Float
|
|
112
|
+
|
|
113
|
+
# @!attribute [rw] ftm
|
|
114
|
+
# Returns free throws made
|
|
115
|
+
# @api public
|
|
116
|
+
# @example
|
|
117
|
+
# stat.ftm #=> 15
|
|
118
|
+
# @return [Integer] free throws made
|
|
119
|
+
attribute :ftm, Shale::Type::Integer
|
|
120
|
+
|
|
121
|
+
# @!attribute [rw] fta
|
|
122
|
+
# Returns free throws attempted
|
|
123
|
+
# @api public
|
|
124
|
+
# @example
|
|
125
|
+
# stat.fta #=> 18
|
|
126
|
+
# @return [Integer] free throws attempted
|
|
127
|
+
attribute :fta, Shale::Type::Integer
|
|
128
|
+
|
|
129
|
+
# @!attribute [rw] ft_pct
|
|
130
|
+
# Returns free throw percentage
|
|
131
|
+
# @api public
|
|
132
|
+
# @example
|
|
133
|
+
# stat.ft_pct #=> 0.833
|
|
134
|
+
# @return [Float] free throw percentage
|
|
135
|
+
attribute :ft_pct, Shale::Type::Float
|
|
136
|
+
|
|
137
|
+
# @!attribute [rw] oreb
|
|
138
|
+
# Returns offensive rebounds
|
|
139
|
+
# @api public
|
|
140
|
+
# @example
|
|
141
|
+
# stat.oreb #=> 8
|
|
142
|
+
# @return [Integer] offensive rebounds
|
|
143
|
+
attribute :oreb, Shale::Type::Integer
|
|
144
|
+
|
|
145
|
+
# @!attribute [rw] dreb
|
|
146
|
+
# Returns defensive rebounds
|
|
147
|
+
# @api public
|
|
148
|
+
# @example
|
|
149
|
+
# stat.dreb #=> 22
|
|
150
|
+
# @return [Integer] defensive rebounds
|
|
151
|
+
attribute :dreb, Shale::Type::Integer
|
|
152
|
+
|
|
153
|
+
# @!attribute [rw] reb
|
|
154
|
+
# Returns total rebounds
|
|
155
|
+
# @api public
|
|
156
|
+
# @example
|
|
157
|
+
# stat.reb #=> 30
|
|
158
|
+
# @return [Integer] total rebounds
|
|
159
|
+
attribute :reb, Shale::Type::Integer
|
|
160
|
+
|
|
161
|
+
# @!attribute [rw] ast
|
|
162
|
+
# Returns assists
|
|
163
|
+
# @api public
|
|
164
|
+
# @example
|
|
165
|
+
# stat.ast #=> 20
|
|
166
|
+
# @return [Integer] assists
|
|
167
|
+
attribute :ast, Shale::Type::Integer
|
|
168
|
+
|
|
169
|
+
# @!attribute [rw] stl
|
|
170
|
+
# Returns steals
|
|
171
|
+
# @api public
|
|
172
|
+
# @example
|
|
173
|
+
# stat.stl #=> 6
|
|
174
|
+
# @return [Integer] steals
|
|
175
|
+
attribute :stl, Shale::Type::Integer
|
|
176
|
+
|
|
177
|
+
# @!attribute [rw] blk
|
|
178
|
+
# Returns blocks
|
|
179
|
+
# @api public
|
|
180
|
+
# @example
|
|
181
|
+
# stat.blk #=> 4
|
|
182
|
+
# @return [Integer] blocks
|
|
183
|
+
attribute :blk, Shale::Type::Integer
|
|
184
|
+
|
|
185
|
+
# @!attribute [rw] tov
|
|
186
|
+
# Returns turnovers
|
|
187
|
+
# @api public
|
|
188
|
+
# @example
|
|
189
|
+
# stat.tov #=> 10
|
|
190
|
+
# @return [Integer] turnovers
|
|
191
|
+
attribute :tov, Shale::Type::Integer
|
|
192
|
+
|
|
193
|
+
# @!attribute [rw] pf
|
|
194
|
+
# Returns personal fouls
|
|
195
|
+
# @api public
|
|
196
|
+
# @example
|
|
197
|
+
# stat.pf #=> 12
|
|
198
|
+
# @return [Integer] personal fouls
|
|
199
|
+
attribute :pf, Shale::Type::Integer
|
|
200
|
+
|
|
201
|
+
# @!attribute [rw] pts
|
|
202
|
+
# Returns points
|
|
203
|
+
# @api public
|
|
204
|
+
# @example
|
|
205
|
+
# stat.pts #=> 95
|
|
206
|
+
# @return [Integer] points
|
|
207
|
+
attribute :pts, Shale::Type::Integer
|
|
208
|
+
|
|
209
|
+
# @!attribute [rw] plus_minus
|
|
210
|
+
# Returns plus/minus
|
|
211
|
+
# @api public
|
|
212
|
+
# @example
|
|
213
|
+
# stat.plus_minus #=> 15
|
|
214
|
+
# @return [Integer] plus/minus
|
|
215
|
+
attribute :plus_minus, Shale::Type::Integer
|
|
216
|
+
|
|
217
|
+
# Returns whether this is starter stats
|
|
218
|
+
#
|
|
219
|
+
# @api public
|
|
220
|
+
# @example
|
|
221
|
+
# stat.starters? #=> true
|
|
222
|
+
# @return [Boolean] true if starters
|
|
223
|
+
def starters?
|
|
224
|
+
starters_bench.eql?("starters")
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Returns whether this is bench stats
|
|
228
|
+
#
|
|
229
|
+
# @api public
|
|
230
|
+
# @example
|
|
231
|
+
# stat.bench? #=> true
|
|
232
|
+
# @return [Boolean] true if bench
|
|
233
|
+
def bench?
|
|
234
|
+
starters_bench.eql?("bench")
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# Returns the team object
|
|
238
|
+
#
|
|
239
|
+
# @api public
|
|
240
|
+
# @example
|
|
241
|
+
# stat.team #=> #<NBA::Team>
|
|
242
|
+
# @return [Team, nil] the team object
|
|
243
|
+
def team
|
|
244
|
+
Teams.find(team_id)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# Returns the game object
|
|
248
|
+
#
|
|
249
|
+
# @api public
|
|
250
|
+
# @example
|
|
251
|
+
# stat.game #=> #<NBA::Game>
|
|
252
|
+
# @return [Game, nil] the game object
|
|
253
|
+
def game
|
|
254
|
+
Games.find(game_id)
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
end
|