1
1
Fork 0
novelmetrix-python/ras/api/modules/pandas.py

183 lines
7.0 KiB
Python
Raw Normal View History

2023-11-10 11:57:38 +01:00
from rest_framework.decorators import api_view
import pandas as pd
2023-11-13 16:09:59 +01:00
import math
2023-11-10 11:57:38 +01:00
from rest_framework.response import Response
2023-11-13 16:09:59 +01:00
from django.http import JsonResponse
from .functions import isAuthorized, getBooksData, filterData
2023-11-10 11:57:38 +01:00
2023-11-13 16:09:59 +01:00
# ----------------------
# Get all reading years
# ----------------------
2023-11-10 11:57:38 +01:00
@api_view(['GET'])
def getYears(request):
2023-12-21 15:36:28 +01:00
try:
authorization_token = request.headers.get('Authorization')
isLoggedIn = isAuthorized(authorization_token)
2023-11-13 16:09:59 +01:00
2023-12-21 15:36:28 +01:00
if not authorization_token:
return JsonResponse({'error': 'No authorization token'}, safe=False)
2023-11-13 16:09:59 +01:00
2023-12-21 15:36:28 +01:00
if not isLoggedIn:
2023-11-13 16:09:59 +01:00
return JsonResponse({'error': 'Unauthorized'}, safe=False)
2023-12-21 15:36:28 +01:00
df = filterData(getBooksData(request.headers.get('userid')))
df['readed'] = pd.to_datetime(df['readed'], errors='coerce')
df['year']= df['readed'].dt.year
years = df.groupby('year')['year'].count().reset_index(name="count")
return Response(years['year'])
except Exception as e:
return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False)
2023-11-10 11:57:38 +01:00
2023-11-13 16:09:59 +01:00
# ------------------------------------------------------------------
# Get books of selected year and filter it per month and per genre
# ------------------------------------------------------------------
2023-11-10 11:57:38 +01:00
@api_view(['GET'])
def books_per_genre_per_month(request):
2023-12-21 15:36:28 +01:00
try:
authorization_token = request.headers.get('Authorization')
isLoggedIn = isAuthorized(authorization_token)
if not authorization_token:
return JsonResponse({'error': 'No authorization token'}, safe=False)
if not isLoggedIn:
2023-11-13 16:09:59 +01:00
return JsonResponse({'error': 'Unauthorized'}, safe=False)
2023-12-21 15:36:28 +01:00
if not request.META.get('HTTP_YEAR'):
return JsonResponse({'error': 'No year in header'}, safe=False)
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
booksPerMonth = df.groupby(['genre', 'readed']).size().reset_index(name='count')
booksPerMonth = booksPerMonth.sort_values(by=['genre', 'readed', 'count'], ascending=False)
data = booksPerMonth.to_dict(orient='records')
return Response(data)
except Exception as e:
return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False)
2023-11-13 16:09:59 +01:00
# ---------------------------------------------
# Get genres of selected year with percentages
# ---------------------------------------------
2023-11-10 11:57:38 +01:00
@api_view(['GET'])
def countGenres(request):
2023-12-21 15:36:28 +01:00
try:
authorization_token = request.headers.get('Authorization')
isLoggedIn = isAuthorized(authorization_token)
if not authorization_token:
return JsonResponse({'error': 'No authorization token'}, safe=False)
if not isLoggedIn:
2023-11-13 16:09:59 +01:00
return JsonResponse({'error': 'Unauthorized'}, safe=False)
2023-12-21 15:36:28 +01:00
if not request.META.get('HTTP_YEAR'):
return JsonResponse({'error': 'No year in header'}, safe=False)
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
genres = df.groupby('genre')['genre'].count().reset_index(name="count")
genres = genres.sort_values(by='count', ascending=False)
data = [{"genre": genre, "count": int(count)} for genre, count in zip(genres['genre'], genres['count'])]
return Response(data)
except Exception as e:
return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False)
2023-11-13 16:09:59 +01:00
# ----------------
# Get year stats
# ----------------
2023-11-10 11:57:38 +01:00
@api_view(['GET'])
def getStats(request):
2023-12-21 15:36:28 +01:00
try:
authorization_token = request.headers.get('Authorization')
isLoggedIn = isAuthorized(authorization_token)
if not authorization_token:
return JsonResponse({'error': 'No authorization token'}, safe=False)
if not isLoggedIn:
2023-11-13 16:09:59 +01:00
return JsonResponse({'error': 'Unauthorized'}, safe=False)
2023-12-21 15:36:28 +01:00
if not request.META.get('HTTP_YEAR'):
return JsonResponse({'error': 'No year in header'}, safe=False)
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
df = df.dropna()
2024-01-18 16:36:14 +01:00
if not df.empty:
statsTotalBooks = df['name'].count()
statsTotalGenres = df['genre'].nunique()
avgratingsperyear = round(df['rating'].mean(), 0)
data = {
'totalbooks': statsTotalBooks,
'totalgenres': statsTotalGenres,
'avgyearrating': avgratingsperyear
}
else:
data = {}
2023-12-21 15:36:28 +01:00
return Response(data)
except Exception as e:
return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False)
2023-11-10 11:57:38 +01:00
2023-11-13 16:09:59 +01:00
# ------------------------------------------------
# Get books of selected year and group by ratings
# ------------------------------------------------
2023-11-10 11:57:38 +01:00
@api_view(['GET'])
def avg_ratings_per_month(request):
2023-12-21 15:36:28 +01:00
try:
authorization_token = request.headers.get('Authorization')
isLoggedIn = isAuthorized(authorization_token)
if not authorization_token:
return JsonResponse({'error': 'No authorization token'}, safe=False)
2023-11-10 11:57:38 +01:00
2023-12-21 15:36:28 +01:00
if not isLoggedIn:
return JsonResponse({'error': 'Unauthorized'}, safe=False)
if not request.META.get('HTTP_YEAR'):
return JsonResponse({'error': 'No year in header'}, safe=False)
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating")
data = [{"date": date, "rating": int(rating)} for date, rating in zip(avgratingspermonth['readed'], avgratingspermonth['rating'])]
return Response(data)
except Exception as e:
return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False)
2023-11-10 11:57:38 +01:00
2023-11-13 16:09:59 +01:00
# -----------------------------
# Get ratings of selected year
# -----------------------------
2023-11-10 11:57:38 +01:00
@api_view(['GET'])
def countRatings(request):
2023-12-21 15:36:28 +01:00
try:
authorization_token = request.headers.get('Authorization')
isLoggedIn = isAuthorized(authorization_token)
if not authorization_token:
return JsonResponse({'error': 'No authorization token'}, safe=False)
if not isLoggedIn:
2023-11-13 16:09:59 +01:00
return JsonResponse({'error': 'Unauthorized'}, safe=False)
2023-12-21 15:36:28 +01:00
if not request.META.get('HTTP_YEAR'):
return JsonResponse({'error': 'No year in header'}, safe=False)
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
countratings = df.groupby('rating')['rating'].count().reset_index(name="count")
countratings = countratings.sort_values(by='rating', ascending=False)
data = [{"rating": int(rating), "count": int(count)} for rating, count in zip(countratings['rating'], countratings['count'])]
return Response(data)
except Exception as e:
return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False)