2022-09-30 16:30:18 +02:00
|
|
|
from sqlite3 import connect
|
2022-09-05 15:53:48 +02:00
|
|
|
from rest_framework.decorators import api_view
|
|
|
|
from rest_framework.response import Response
|
|
|
|
from .models import Books
|
2022-09-28 14:29:54 +02:00
|
|
|
import pandas as pd
|
2022-09-30 16:30:18 +02:00
|
|
|
import ras.settings
|
2022-09-05 15:53:48 +02:00
|
|
|
|
2022-09-30 16:30:18 +02:00
|
|
|
from sqlalchemy import create_engine
|
2022-09-05 15:53:48 +02:00
|
|
|
from .serializers import BooksSerializer
|
|
|
|
from django.db.models import Q
|
2022-09-28 14:29:54 +02:00
|
|
|
from django.templatetags.static import static
|
|
|
|
import json
|
2022-09-05 15:53:48 +02:00
|
|
|
|
2022-09-30 16:30:18 +02:00
|
|
|
def getBooksData():
|
|
|
|
engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME'])
|
|
|
|
df = pd.read_sql('SELECT * FROM api_books', engine, parse_dates={'readed': {'format': '%m-%Y'}})
|
|
|
|
|
|
|
|
return df
|
|
|
|
|
2022-09-05 15:53:48 +02:00
|
|
|
@api_view(['GET'])
|
2022-09-28 14:29:54 +02:00
|
|
|
def books_per_genre_per_month(request):
|
|
|
|
|
|
|
|
datayear = request.META.get('HTTP_YEAR')
|
|
|
|
|
|
|
|
if datayear:
|
|
|
|
|
|
|
|
data = []
|
2022-09-30 16:30:18 +02:00
|
|
|
|
|
|
|
df = getBooksData()
|
|
|
|
|
|
|
|
df['readed'] = pd.to_datetime(df['readed'], format='%Y-%m-%d')
|
|
|
|
df['readed'] = df['readed'].dt.strftime('%m-%Y')
|
2022-09-28 14:29:54 +02:00
|
|
|
|
|
|
|
# Filter data on year
|
|
|
|
df = df.where(df['readed'].str.contains(datayear))
|
|
|
|
|
|
|
|
# Filter array on genre and date
|
|
|
|
booksPerMonth = df.groupby(['genre','readed'])['genre'].count().reset_index(name="count")
|
2022-09-30 16:30:18 +02:00
|
|
|
booksPerMonth = booksPerMonth.sort_values(by=['readed', 'count'], ascending=False)
|
2022-09-05 15:53:48 +02:00
|
|
|
|
2022-09-28 14:29:54 +02:00
|
|
|
for index, row in booksPerMonth.iterrows():
|
|
|
|
data.append({
|
|
|
|
"genre": row['genre'],
|
|
|
|
"readed": row['readed'],
|
|
|
|
"count": row['count']
|
|
|
|
})
|
|
|
|
|
2022-09-29 16:18:35 +02:00
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def avg_ratings_per_month(request):
|
|
|
|
datayear = request.META.get('HTTP_YEAR')
|
|
|
|
|
|
|
|
if datayear:
|
|
|
|
data = []
|
|
|
|
|
|
|
|
# Get CSV file with book data
|
2022-09-30 16:30:18 +02:00
|
|
|
df = getBooksData()
|
|
|
|
|
|
|
|
df['readed'] = pd.to_datetime(df['readed'], format='%Y-%m-%d')
|
|
|
|
df['readed'] = df['readed'].dt.strftime('%m-%Y')
|
2022-09-29 16:18:35 +02:00
|
|
|
|
|
|
|
# Filter data on year
|
|
|
|
df = df.where(df['readed'].str.contains(datayear))
|
|
|
|
|
|
|
|
avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating")
|
|
|
|
|
|
|
|
for index, row in avgratingspermonth.iterrows():
|
|
|
|
|
|
|
|
data.append({
|
|
|
|
"date": row['readed'],
|
|
|
|
"rating": int(row['rating'])
|
|
|
|
})
|
|
|
|
|
2022-09-28 14:29:54 +02:00
|
|
|
return Response(data)
|
2022-09-05 15:53:48 +02:00
|
|
|
else:
|
2022-09-30 16:30:18 +02:00
|
|
|
return Response("No year header included")
|
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def countGenres(request):
|
|
|
|
datayear = request.META.get('HTTP_YEAR')
|
|
|
|
|
|
|
|
if datayear:
|
|
|
|
data = []
|
|
|
|
|
|
|
|
# Get CSV file with book data
|
|
|
|
df = getBooksData()
|
|
|
|
|
|
|
|
df['readed'] = pd.to_datetime(df['readed'], format='%Y-%m-%d')
|
|
|
|
df['readed'] = df['readed'].dt.strftime('%m-%Y')
|
|
|
|
|
|
|
|
df = df.where(df['readed'].str.contains(datayear))
|
|
|
|
genres = df.groupby('genre')['genre'].count().reset_index(name="count")
|
|
|
|
genres = genres.sort_values(by='count', ascending=False)
|
|
|
|
|
|
|
|
for index, row in genres.iterrows():
|
|
|
|
|
|
|
|
data.append({
|
|
|
|
"genre": row['genre'],
|
|
|
|
"count": int(row['count'])
|
|
|
|
})
|
|
|
|
|
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|
|
|
|
|