From 2ec7b206ba10f04fae415a61d72f5fd7b46342a2 Mon Sep 17 00:00:00 2001 From: nprasad2077 <114438461+nprasad2077@users.noreply.github.com> Date: Mon, 1 May 2023 22:53:09 -0500 Subject: [PATCH] modify 2009 route to return proper data --- nba_data/urls.py | 3 ++- nba_data/views.py | 69 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/nba_data/urls.py b/nba_data/urls.py index 0a9df80..f493960 100644 --- a/nba_data/urls.py +++ b/nba_data/urls.py @@ -1,5 +1,5 @@ from django.urls import path -from .views import PlayerDataList, PlayerDataByTeamList, PlayerDataBySeasonList, PlayerDataByNameList, TopScorersbySeasonList, ThreeTwoTopPointTrends, TopAssistsBySeasonList, TopReboundsBySeasonList, TopBlocksBySeasonList, TopStealsBySeasonList, TopOffensiveReboundsBySeasonList, TopDefensiveReboundsBySeasonList, PointsPerGameHistogramBySeasonList, TopPtsScatterPlotData, TopPtsScatterPlotDataFast, Top20ScorersPost2009WS, Top20ScorersPost2014WS, Top20ScorersPost2018WS +from .views import PlayerDataList, PlayerDataByTeamList, PlayerDataBySeasonList, PlayerDataByNameList, TopScorersbySeasonList, ThreeTwoTopPointTrends, TopAssistsBySeasonList, TopReboundsBySeasonList, TopBlocksBySeasonList, TopStealsBySeasonList, TopOffensiveReboundsBySeasonList, TopDefensiveReboundsBySeasonList, PointsPerGameHistogramBySeasonList, TopPtsScatterPlotData, TopPtsScatterPlotDataFast, TopPtsScatterPlotDataFast2018, Top20ScorersPost2009WS, Top20ScorersPost2014WS, Top20ScorersPost2018WS urlpatterns = [ path('api/playerdata/', PlayerDataList.as_view(), name='playerdata_list'), @@ -17,6 +17,7 @@ urlpatterns = [ path('api/points_per_game_histogram//', PointsPerGameHistogramBySeasonList.as_view(), name='points_per_game_histogram'), path('api/top_pts_scatter_plot/', TopPtsScatterPlotData.as_view(), name='top_pts_scatter_plot'), path('api/top_pts_scatter_plot_fast/', TopPtsScatterPlotDataFast.as_view(), name='top_pts_scatter_plot_fast'), + path('api/top_pts_scatter_plot_fast_2018/', TopPtsScatterPlotDataFast2018.as_view(), name='top_pts_scatter_plot_fast_2018'), path('api/top_20_post_2009_PTS_ws/', Top20ScorersPost2009WS.as_view(), name='top_20_post_2009_PTS_ws'), path('api/top_20_post_2014_PTS_ws/', Top20ScorersPost2014WS.as_view(), name='top_20_post_2014_PTS_ws'), path('api/top_20_post_2018_PTS_ws/', Top20ScorersPost2018WS.as_view(), name='top_20_post_2018_PTS_ws'), diff --git a/nba_data/views.py b/nba_data/views.py index 17bdecf..f788c48 100644 --- a/nba_data/views.py +++ b/nba_data/views.py @@ -253,31 +253,82 @@ class TopPtsScatterPlotDataFast(APIView): return Response(result) + +class TopPtsScatterPlotDataFast2018(APIView): + def get(self, request): + with connection.cursor() as cursor: + cursor.execute(""" + -- The modified query from earlier + WITH player_season_pts AS ( + SELECT player_name, season, SUM("PTS") as season_pts + FROM nba_data_playertotalsdata + WHERE player_name IN (SELECT player_name FROM ( + SELECT player_name, SUM("PTS") as total_pts + FROM nba_data_playertotalsdata + WHERE season >= 2018 + GROUP BY player_name + ORDER BY total_pts DESC + LIMIT 25) as top_25_players) + AND season >= 2018 + GROUP BY player_name, season + ), + player_season_ws AS ( + SELECT player_name, season, SUM("ws") as season_ws + FROM nba_data_playeradvanceddata + WHERE season >= 2018 + GROUP BY player_name, season + ) + SELECT player_season_pts.player_name, player_season_pts.season, player_season_pts.season_pts, player_season_ws.season_ws + FROM player_season_pts + JOIN player_season_ws + ON player_season_pts.player_name = player_season_ws.player_name AND player_season_pts.season = player_season_ws.season + ORDER BY player_season_pts.player_name, player_season_pts.season; + """) + rows = cursor.fetchall() + + result = [] + for row in rows: + player_name, season, season_pts, season_ws = row + result.append({ + 'player_name': player_name, + 'season': season, + 'season_pts': season_pts, + 'season_ws': season_ws + }) + + return Response(result) + # Top 20 players in playoffs by PTS X ws for scatter plot in chart.js class Top20ScorersPost2009WS(APIView): def get(self, request): - # Get the top 20 scorers after the 2015 season + # Get the top 20 scorers after the 2009 season top_scorers = PlayerPlayoffTotalsData.objects \ .filter(season__gt=2009) \ .values('player_name') \ .annotate(total_pts=Sum('PTS')) \ .order_by('-total_pts')[:20] - # Get the total WS for each of the top 20 scorers after the 2015 season + # Get the total WS for each of the top 20 scorers after the 2009 season chart_data = [] for scorer in top_scorers: player_name = scorer['player_name'] - total_ws = PlayerPlayoffAdvancedData.objects \ + player_season_data = PlayerPlayoffAdvancedData.objects \ .filter(player_name=player_name, season__gt=2009) \ - .aggregate(total_ws=Sum('ws'))['total_ws'] + .annotate(season_value=F('season')) \ + .values('season_value', 'ws') - chart_data.append({ - 'x': scorer['total_pts'], - 'y': total_ws, - 'player_name': player_name - }) + for data in player_season_data: + season_value = data['season_value'] + season_pts = PlayerPlayoffTotalsData.objects \ + .get(player_name=player_name, season=season_value).PTS + chart_data.append({ + 'x': season_pts, + 'y': data['ws'], + 'player_name': player_name, + 'season': data['season_value'] + }) # Sort the data by total_ws DESC chart_data = sorted(chart_data, key=lambda x: x['y'], reverse=True)