From 08e60d68383ce8bd64a6614bf8fe3e1fe4b6eb65 Mon Sep 17 00:00:00 2001 From: nprasad2077 <114438461+nprasad2077@users.noreply.github.com> Date: Sat, 22 Apr 2023 18:03:20 -0500 Subject: [PATCH] create view and logic to serve 2P and 3P data --- nba_data/views.py | 55 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/nba_data/views.py b/nba_data/views.py index 921f7a1..20876d7 100644 --- a/nba_data/views.py +++ b/nba_data/views.py @@ -4,6 +4,9 @@ from django.core import serializers from .models import PlayerData from rest_framework import generics from .serializers import PlayerDataSerializer +from rest_framework.views import APIView +from rest_framework.response import Response +from django.db.models import Avg # Create your views here. @@ -13,40 +16,68 @@ class PlayerDataList(generics.ListCreateAPIView): queryset = PlayerData.objects.all().order_by('id') serializer_class = PlayerDataSerializer # pagination_class = None - - + + # Fetch player data by team class PlayerDataByTeamList(generics.ListAPIView): serializer_class = PlayerDataSerializer - + def get_queryset(self): team = self.kwargs['team'] return PlayerData.objects.filter(team=team) - - + + # Fetch player data by season class PlayerDataBySeasonList(generics.ListAPIView): serializer_class = PlayerDataSerializer - + def get_queryset(self): season = self.kwargs['season'] return PlayerData.objects.filter(season=season) - - + + # Fetch player data by player name class PlayerDataByNameList(generics.ListAPIView): serializer_class = PlayerDataSerializer - + def get_queryset(self): name = self.kwargs['name'] return PlayerData.objects.filter(name__icontains=name) - - + + # Fetch Top 20 players by PTS DESC for the season specified. class TopScorersbySeasonList(generics.ListAPIView): serializer_class = PlayerDataSerializer - + def get_queryset(self): season = self.kwargs['season'] return PlayerData.objects.filter(season=season).order_by('-PTS')[:20] + +# Fetch and calculate the average 3P made, 3P attemps, 2P made, 2P attempts for all players in each season. +# Will use APIview here instead of generics.ListAPIView to avoid having to create a serializer to generate the queryset. avg_three_made and avg_two_made are new data points at the time of creation when compared to the per_game model. +class ThreeTopPointTrends(APIView): + def get(self, request, format=None): + seasons = PlayerData.objects.values_list( + 'season', flat=True).distinct().order_by('season') + data = [] + + for season in seasons: + season_data = PlayerData.objects.filter(season=season) + avg_three_made = season_data.aggregate(Avg('three_fg'))[ + 'three_fg_avg'] + avg_three_attempts = season_data.aggregate(Avg('three_attempts'))[ + 'three_attempts_avg'] + avg_two_made = season_data.aggregate(Avg('two_fg'))['two_fg_avg'] + avg_two_attempts = season_data.aggregate(Avg('two_attempts'))[ + 'two_attempts_avg'] + + data.append({ + 'season': season, + 'avg_three_made': avg_three_made, + 'avg_three_attempts': avg_three_attempts, + 'avg_two_made': avg_two_made, + 'avg_two_attempts': avg_two_attempts, + }) + + return Response(data)