1
1
Fork 0

Useraccounts + testing ML

This commit is contained in:
Jordy van Zeeland 2023-11-21 08:24:48 +01:00
parent 76cc5fb0f4
commit bc1083c257
12 changed files with 211 additions and 311 deletions

View File

@ -7,42 +7,20 @@ from sqlalchemy.sql import text
from django.http import JsonResponse from django.http import JsonResponse
import pandas as pd import pandas as pd
from rest_framework.response import Response from rest_framework.response import Response
from .functions import isAuthorized, getBooksData, getBookChallenge, filterData
def filterData(df, datayear = None):
df['readed'] = pd.to_datetime(df['readed'], format='%Y-%m-%d')
df['readed'] = df['readed'].dt.strftime('%m-%Y')
# Filter data on year
if datayear and datayear is not None:
df = df.where(df['readed'].str.contains(datayear))
return df
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 ORDER BY readed', engine, parse_dates={'readed': {'format': '%m-%Y'}})
return df
def getBookChallenge(year = None):
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'])
if(year):
df = pd.read_sql('SELECT * FROM book_challenge where year = ' + year, engine)
else:
df = pd.read_sql('SELECT * FROM book_challenge', engine)
return df
@api_view(['GET']) @api_view(['GET'])
def getAllChallenges(request): def getAllChallenges(request):
if(request.headers.get('Authorization')):
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
if(isLoggedIn):
data = [] data = []
df = getBookChallenge() df = getBookChallenge(request.headers.get('userid'))
for index, row in df.iterrows(): for index, row in df.iterrows():
books = filterData(getBooksData(request.headers.get('userid')), str(row['year']))
books = filterData(getBooksData(), str(row['year']))
books = books.dropna() books = books.dropna()
totalBooksRead = books['name'].count() totalBooksRead = books['name'].count()
data.append({ data.append({
@ -53,12 +31,20 @@ def getAllChallenges(request):
}) })
return Response(data) return Response(data)
else:
return JsonResponse({'error': 'No user detected'}, safe=False)
else:
return JsonResponse({'error': 'Unauthorized'}, safe=False)
@api_view(['GET']) @api_view(['GET'])
def getChallengeOfYear(request): def getChallengeOfYear(request):
if(request.headers.get('Authorization')):
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
if(isLoggedIn):
if request.META.get('HTTP_YEAR'): if request.META.get('HTTP_YEAR'):
data = [] data = []
df = getBookChallenge(request.META.get('HTTP_YEAR')) df = getBookChallenge(request.headers.get('userid'), request.META.get('HTTP_YEAR'))
for index, row in df.iterrows(): for index, row in df.iterrows():
data.append({ data.append({
@ -68,19 +54,18 @@ def getChallengeOfYear(request):
return Response(data) return Response(data)
else: else:
return Response("No year header included") return JsonResponse({'error': 'No year header included'}, safe=False)
else:
return JsonResponse({'error': 'No user detected'}, safe=False)
else:
return JsonResponse({'error': 'Unauthorized'}, safe=False)
@api_view(['POST']) @api_view(['POST'])
def addChallenge(request): def addChallenge(request):
if(request.headers.get('Authorization')): if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1] isLoggedIn = isAuthorized(request.headers.get('Authorization'));
try: if(isLoggedIn):
User = get_user_model()
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
year = request.POST.get('year') year = request.POST.get('year')
challenge = request.POST.get('challenge') challenge = request.POST.get('challenge')
@ -93,22 +78,15 @@ def addChallenge(request):
return JsonResponse({'error': 'No year and challenge detected'}, safe=False) return JsonResponse({'error': 'No year and challenge detected'}, safe=False)
else: else:
return JsonResponse({'error': 'No user detected'}, safe=False) return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist): else:
return JsonResponse({'error': 'Token invalid'}, safe=False) return JsonResponse({'error': 'Unauthorized'}, safe=False)
@api_view(['DELETE']) @api_view(['DELETE'])
def deleteChallenge(request, id = None): def deleteChallenge(request, id = None):
if(request.headers.get('Authorization')): if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1] isLoggedIn = isAuthorized(request.headers.get('Authorization'));
try:
User = get_user_model()
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
if(isLoggedIn):
if(id): if(id):
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']) 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'])
conn = engine.connect() conn = engine.connect()
@ -118,5 +96,6 @@ def deleteChallenge(request, id = None):
return JsonResponse({'error': 'No challengeid detected'}, safe=False) return JsonResponse({'error': 'No challengeid detected'}, safe=False)
else: else:
return JsonResponse({'error': 'No user detected'}, safe=False) return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist): else:
return JsonResponse({'error': 'Token invalid'}, safe=False) return JsonResponse({'error': 'Unauthorized'}, safe=False)

View File

@ -7,6 +7,7 @@ from sqlalchemy.sql import text
from django.http import JsonResponse from django.http import JsonResponse
import pandas as pd import pandas as pd
from rest_framework.response import Response from rest_framework.response import Response
from .functions import isAuthorized, getBooksData, filterData
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']) 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'])
conn = engine.connect() conn = engine.connect()
@ -18,15 +19,10 @@ conn = engine.connect()
@api_view(['GET']) @api_view(['GET'])
def getAllBooks(request): def getAllBooks(request):
if(request.headers.get('Authorization')): if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1] isLoggedIn = isAuthorized(request.headers.get('Authorization'));
try: if(isLoggedIn):
User = get_user_model() books = getBooksData(request.headers.get('userid'))
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
books = pd.read_sql('SELECT * FROM api_books ORDER BY readed', engine, parse_dates={'readed': {'format': '%m-%Y'}})
data = [] data = []
for index, row in books.iterrows(): for index, row in books.iterrows():
@ -46,9 +42,6 @@ def getAllBooks(request):
return Response(data) return Response(data)
else: else:
return JsonResponse({'error': 'No user detected'}, safe=False) return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist):
return JsonResponse({'error': 'Token invalid'}, safe=False)
else: else:
return JsonResponse({'error': 'Unauthorized'}, safe=False) return JsonResponse({'error': 'Unauthorized'}, safe=False)
@ -59,23 +52,13 @@ def getAllBooks(request):
@api_view(['POST']) @api_view(['POST'])
def addBook(request): def addBook(request):
if(request.headers.get('Authorization')): if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1] isLoggedIn = isAuthorized(request.headers.get('Authorization'));
book = request.POST.get('book')
book = json.loads(book)
try: if(isLoggedIn):
User = get_user_model()
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
conn.execute(text("INSERT INTO api_books (name, author, genre, country, country_code, pages, readed, rating) VALUES ('" + str(book['name']) + "', '" + str(book['author']) + "', '" + str(book['genre']) + "', '" + str(book['country']) + "', '" + str(book['country_code']) + "', " + str(book['pages']) + ", '" + str(book['readed']) + "', " + str(book['rating']) + ")")) conn.execute(text("INSERT INTO api_books (name, author, genre, country, country_code, pages, readed, rating) VALUES ('" + str(book['name']) + "', '" + str(book['author']) + "', '" + str(book['genre']) + "', '" + str(book['country']) + "', '" + str(book['country_code']) + "', " + str(book['pages']) + ", '" + str(book['readed']) + "', " + str(book['rating']) + ")"))
return JsonResponse("OK", safe=False) return JsonResponse("OK", safe=False)
else: else:
return JsonResponse({'error': 'No user detected'}, safe=False) return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist):
return JsonResponse({'error': 'Token invalid'}, safe=False)
else: else:
return JsonResponse({'error': 'Unauthorized'}, safe=False) return JsonResponse({'error': 'Unauthorized'}, safe=False)
@ -86,24 +69,17 @@ def addBook(request):
@api_view(['PUT']) @api_view(['PUT'])
def updateBook(request): def updateBook(request):
if(request.headers.get('Authorization')): if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1] isLoggedIn = isAuthorized(request.headers.get('Authorization'));
if(isLoggedIn):
book = request.POST.get('book') book = request.POST.get('book')
book = json.loads(book) book = json.loads(book)
bookid = request.headers.get('bookid') bookid = request.headers.get('bookid')
try:
User = get_user_model()
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
conn.execute(text("UPDATE api_books set name='" + str(book['name']) + "', author='" + str(book['author']) + "', genre='" + str(book['genre']) + "', country='" + str(book['country']) + "', country_code='" + str(book['country_code']) + "', pages='" + str(book['pages']) + "', readed='" + str(book['readed']) + "', rating='" + str(book['rating']) + "' WHERE id=" + str(bookid))) conn.execute(text("UPDATE api_books set name='" + str(book['name']) + "', author='" + str(book['author']) + "', genre='" + str(book['genre']) + "', country='" + str(book['country']) + "', country_code='" + str(book['country_code']) + "', pages='" + str(book['pages']) + "', readed='" + str(book['readed']) + "', rating='" + str(book['rating']) + "' WHERE id=" + str(bookid)))
return JsonResponse("OK", safe=False) return JsonResponse("OK", safe=False)
else: else:
return JsonResponse({'error': 'No user detected'}, safe=False) return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist):
return JsonResponse({'error': 'Token invalid'}, safe=False)
else: else:
return JsonResponse({'error': 'Unauthorized'}, safe=False) return JsonResponse({'error': 'Unauthorized'}, safe=False)
@ -115,21 +91,14 @@ def updateBook(request):
@api_view(['DELETE']) @api_view(['DELETE'])
def deleteBook(request): def deleteBook(request):
if(request.headers.get('Authorization')): if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1] isLoggedIn = isAuthorized(request.headers.get('Authorization'));
if(isLoggedIn):
bookid = request.headers.get('bookid') bookid = request.headers.get('bookid')
try:
User = get_user_model()
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
conn.execute(text("DELETE FROM api_books WHERE id = " + str(bookid))) conn.execute(text("DELETE FROM api_books WHERE id = " + str(bookid)))
return JsonResponse("OK", safe=False) return JsonResponse("OK", safe=False)
else: else:
return JsonResponse({'error': 'No user detected'}, safe=False) return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist):
return JsonResponse({'error': 'Token invalid'}, safe=False)
else: else:
return JsonResponse({'error': 'Unauthorized'}, safe=False) return JsonResponse({'error': 'Unauthorized'}, safe=False)

View File

@ -20,9 +20,26 @@ def isAuthorized(authtoken):
else: else:
return JsonResponse({'error': 'Unauthorized'}, safe=False) return JsonResponse({'error': 'Unauthorized'}, safe=False)
def getBooksData(): def getBooksData(userid, year = None):
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']) 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 ORDER BY readed', engine, parse_dates={'readed': {'format': '%m-%Y'}})
if year:
sql = 'SELECT * FROM api_books WHERE userid = ' + userid + ' AND year = ' + str(year) + ' ORDER BY readed'
else:
sql = 'SELECT * FROM api_books WHERE userid = ' + userid + ' ORDER BY readed'
df = pd.read_sql(sql, engine, parse_dates={'readed': {'format': '%m-%Y'}})
return df
def getBookChallenge(userid, year = None):
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'])
if year:
sql = 'SELECT * FROM book_challenge WHERE userid = ' + userid + ' AND year = ' + year
else:
sql = 'SELECT * FROM book_challenge WHERE userid = ' + userid
df = pd.read_sql(sql, engine)
return df return df

View File

@ -15,7 +15,7 @@ def getYears(request):
isLoggedIn = isAuthorized(request.headers.get('Authorization')); isLoggedIn = isAuthorized(request.headers.get('Authorization'));
if(isLoggedIn): if(isLoggedIn):
df = filterData(getBooksData()) df = filterData(getBooksData(request.headers.get('userid')))
df['readed'] = pd.to_datetime(df['readed'], errors='coerce') df['readed'] = pd.to_datetime(df['readed'], errors='coerce')
df['year']= df['readed'].dt.year df['year']= df['readed'].dt.year
years = df.groupby('year')['year'].count().reset_index(name="count") years = df.groupby('year')['year'].count().reset_index(name="count")
@ -38,7 +38,7 @@ def books_per_genre_per_month(request):
if(isLoggedIn): if(isLoggedIn):
if request.META.get('HTTP_YEAR'): if request.META.get('HTTP_YEAR'):
data = [] data = []
df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
booksPerMonth = df.groupby(['genre','readed'])['genre'].count().reset_index(name="count") booksPerMonth = df.groupby(['genre','readed'])['genre'].count().reset_index(name="count")
booksPerMonth = booksPerMonth.sort_values(by=['genre', 'readed', 'count'], ascending=False) booksPerMonth = booksPerMonth.sort_values(by=['genre', 'readed', 'count'], ascending=False)
@ -70,7 +70,7 @@ def countGenres(request):
if request.META.get('HTTP_YEAR'): if request.META.get('HTTP_YEAR'):
data = [] data = []
df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
genres = df.groupby('genre')['genre'].count().reset_index(name="count") genres = df.groupby('genre')['genre'].count().reset_index(name="count")
genres = genres.sort_values(by='count', ascending=False) genres = genres.sort_values(by='count', ascending=False)
@ -101,7 +101,7 @@ def getStats(request):
if(isLoggedIn): if(isLoggedIn):
if request.META.get('HTTP_YEAR'): if request.META.get('HTTP_YEAR'):
data = [] data = []
df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
df = df.dropna() df = df.dropna()
statsTotalBooks = df['name'].count() statsTotalBooks = df['name'].count()
statsTotalGenres = df['genre'].nunique() statsTotalGenres = df['genre'].nunique()
@ -133,7 +133,7 @@ def avg_ratings_per_month(request):
if(isLoggedIn): if(isLoggedIn):
if request.META.get('HTTP_YEAR'): if request.META.get('HTTP_YEAR'):
data = [] data = []
df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating") avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating")
for index, row in avgratingspermonth.iterrows(): for index, row in avgratingspermonth.iterrows():
@ -163,7 +163,7 @@ def countRatings(request):
if(isLoggedIn): if(isLoggedIn):
if request.META.get('HTTP_YEAR'): if request.META.get('HTTP_YEAR'):
data = [] data = []
df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
countratings = df.groupby('rating')['rating'].count().reset_index(name="count") countratings = df.groupby('rating')['rating'].count().reset_index(name="count")
countratings = countratings.sort_values(by='rating', ascending=False) countratings = countratings.sort_values(by='rating', ascending=False)

View File

@ -0,0 +1,52 @@
from rest_framework.decorators import api_view
import pandas as pd
import math
from rest_framework.response import Response
from sqlalchemy import create_engine
import ras.settings
from django.http import JsonResponse
from .functions import isAuthorized, getBooksData, filterData
from sklearn.linear_model import LinearRegression
def getChallenges():
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 book_challenge', engine)
return df
def train_model_challenges(data):
df = pd.DataFrame(data)
X = df.index.values.reshape(-1, 1)
Y = df['nrofbooks']
model = LinearRegression()
model.fit(X, Y)
return model
def predict_challenge(model):
future_index = pd.RangeIndex(start=0, stop=1, step=1)
future_X = future_index.values.reshape(-1, 1)
predicted_books = model.predict(future_X)
prediction_next_year = round(predicted_books[-1])
return prediction_next_year
@api_view(['GET'])
def predict_next_year(request):
if(request.headers.get('Authorization')):
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
if(isLoggedIn):
data = getChallenges()
trained_model = train_model_challenges(data)
next_year_challenge = predict_challenge(trained_model)
return Response(f"Volgend jaar lees ik {next_year_challenge} boeken")
# def train_model_books_per_month():
# def predict_books_per_month():
# def train_model_genres():
# def predict_genres():

View File

@ -1,65 +0,0 @@
book;author;genre;pages;readed;rating
Omnia in Omnibus;Lisa Pennings;Sciencefiction;166;2013-05-01;4
Het leven van Pi;Yann Martel;Roman;317;2020-10-01;4
Ze komt nooit meer terug;Hans Koppel;Thriller;220;2020-10-01;5
Vriendschapsverzoek;Laura Marshall;Thriller;368;2020-10-01;4
De analist;John Katzenbach;Thriller;518;2020-11-01;4
Komt een vrouw bij de hacker;Maria Genova;Thriller;224;2020-11-01;4
Niemand hoort het;Linwood Barclay;Thriller;304;2020-11-01;5
Lift;Linwood Barclay;Thriller;480;2020-11-01;3
Kijk niet weg;Linwood Barclay;Thriller;400;2020-12-01;5
Het duistere net;Carmen Mola;Thriller;415;2020-12-01;5
De 50/50-moorden;Steve Mosby;Thriller;344;2020-12-01;3
Zonder een woord;Linwood Barclay;Thriller;368;2021-01-01;5
Geen veilige plek;Linwood Barclay;Thriller;368;2021-01-01;3
Op slot;Chris McGeorge;Thriller;320;2021-01-01;5
Alles is eventueel / 1408;Stephen King;Thriller;462;2021-02-01;3
Waarom je niet zomaar moet stemmen waar je ouders op stemmen;Titia Hoogendoorn&Nienke Schuitemaker;Non-fictie;125;2021-02-01;4
Geloof je ogen;Linwood Barclay;Thriller;384;2021-02-01;4
Voor ik ga slapen;SJ Watson;Thriller;333;2021-03-01;5
Echo;Tamara Geraeds;Thriller;280;2021-03-01;5
Niemand vertellen;Harlan Coben;Thriller;302;2021-03-01;4
Ik zie je;Michael Berg;Thriller;320;2021-04-01;4
Toevluchtsoord;Jerome Loubry;Thriller;355;2021-04-01;5
In een donker donker bos;Ruth Ware;Thriller;320;2021-04-01;3
Een voor een;Ruth Ware;Thriller;368;2021-04-01;4
Vrees het ergste;Linwood Barclay;Thriller;400;2021-05-01;4
Het poppenhuis;W.R. Dantz;Thriller;270;2021-05-01;3
Malorie;Josh Malerman;Thriller;320;2021-05-01;4
Opgejaagd;Gabriel Bergmoser;Thriller;256;2021-06-01;4
Reset;Blake Crouch;Thriller;352;2021-06-01;4
Wacht maar af;Loes den Hollander;Thriller;300;2021-06-01;4
De Russische connectie;Gerrit Barendrecht;Thriller;320;2021-06-01;4
Wat jij niet ziet;M.J. Arlidge;Thriller;95;2021-07-01;3
Het ongeluk;Linwood Barclay;Thriller;382;2021-07-01;4
Slapen in een zee van sterren;Christopher Paolini;Sciencefiction;880;2021-07-01;2
Tik Tak;Chris McGeorge;Thriller;320;2021-07-01;4
Gegijzeld;Clare Mackintosh;Thriller;397;2021-08-01;5
Eindbestemming;Marjolein van der Gaag&Marcella Kleine;Thriller;158;2021-08-01;4
Een kille rilling;Bernard Minier;Thriller;582;2021-09-01;4
De nachtdienst;Esther Verhoef;Thriller;365;2021-09-01;5
Kiekeboe;Chris McGeorge;Thriller;352;2021-10-01;3
Noorderlicht;Mariska Overman;Thriller;313;2021-10-01;4
De kleine getuige;Jilliane Hoffman;Thriller;368;2021-11-01;4
De marathon;Stephen King;Thriller;261;2021-11-01;4
Het appartement;Tatiana de Rosnay;Roman;215;2021-11-01;4
De intrigant;Patricia Snel;Thriller;189;2021-12-01;4
Een schuldig huis;Robert Goddard;Thriller;384;2021-12-01;5
Te koop;Eva Monte;Thriller;350;2021-12-01;3
Prison Break S1B1;Paul T. Scheuring;Thriller;221;2022-01-01;5
Prison Break S1B2;Ed van Eeden;Thriller;272;2022-01-01;4
Prison Break S1B3;Paul T. Scheuring;Thriller;285;2022-01-01;4
Herfstlied;Simone van der Vlugt;Thriller;277;2022-02-01;5
De gastenlijst;Lucy Foley;Thriller;352;2022-02-01;2
Anomalie;Herve le Tellier;Thriller;302;2022-02-01;2
Prison Break S2B1;Paul T. Scheuring;Thriller;207;2022-03-01;4
Prison Break S2B2;Paul T. Scheuring;Thriller;205;2022-03-01;4
Prison Break S2B3;Paul T. Scheuring;Thriller;245;2022-03-01;4
Ik weet je wachtwoord;Daniel Verlaan;Non-fictie;347;2022-04-01;5
De vrouw die een jaar in bed ging liggen;Sue Townsend;Roman;368;2022-04-01;3
Moord in de bibliotheek;Agatha Christie;Thriller;256;2022-04-01;3
Geestdrift;Daniel Hecht;Thriller;509;2022-05-01;1
Moord in de Orient Expres;Agatha Christie;Thriller;222;2022-05-01;4
Crash;Jack Bowman;Thriller;344;2022-05-01;3
Erken mij;Esther Verhoef;Thriller;91;2022-06-01;4
Gestrand;Sarah Goodwin;Thriller;352;2022-06-01;5
1 book author genre pages readed rating
2 Omnia in Omnibus Lisa Pennings Sciencefiction 166 2013-05-01 4
3 Het leven van Pi Yann Martel Roman 317 2020-10-01 4
4 Ze komt nooit meer terug Hans Koppel Thriller 220 2020-10-01 5
5 Vriendschapsverzoek Laura Marshall Thriller 368 2020-10-01 4
6 De analist John Katzenbach Thriller 518 2020-11-01 4
7 Komt een vrouw bij de hacker Maria Genova Thriller 224 2020-11-01 4
8 Niemand hoort het Linwood Barclay Thriller 304 2020-11-01 5
9 Lift Linwood Barclay Thriller 480 2020-11-01 3
10 Kijk niet weg Linwood Barclay Thriller 400 2020-12-01 5
11 Het duistere net Carmen Mola Thriller 415 2020-12-01 5
12 De 50/50-moorden Steve Mosby Thriller 344 2020-12-01 3
13 Zonder een woord Linwood Barclay Thriller 368 2021-01-01 5
14 Geen veilige plek Linwood Barclay Thriller 368 2021-01-01 3
15 Op slot Chris McGeorge Thriller 320 2021-01-01 5
16 Alles is eventueel / 1408 Stephen King Thriller 462 2021-02-01 3
17 Waarom je niet zomaar moet stemmen waar je ouders op stemmen Titia Hoogendoorn&Nienke Schuitemaker Non-fictie 125 2021-02-01 4
18 Geloof je ogen Linwood Barclay Thriller 384 2021-02-01 4
19 Voor ik ga slapen SJ Watson Thriller 333 2021-03-01 5
20 Echo Tamara Geraeds Thriller 280 2021-03-01 5
21 Niemand vertellen Harlan Coben Thriller 302 2021-03-01 4
22 Ik zie je Michael Berg Thriller 320 2021-04-01 4
23 Toevluchtsoord Jerome Loubry Thriller 355 2021-04-01 5
24 In een donker donker bos Ruth Ware Thriller 320 2021-04-01 3
25 Een voor een Ruth Ware Thriller 368 2021-04-01 4
26 Vrees het ergste Linwood Barclay Thriller 400 2021-05-01 4
27 Het poppenhuis W.R. Dantz Thriller 270 2021-05-01 3
28 Malorie Josh Malerman Thriller 320 2021-05-01 4
29 Opgejaagd Gabriel Bergmoser Thriller 256 2021-06-01 4
30 Reset Blake Crouch Thriller 352 2021-06-01 4
31 Wacht maar af Loes den Hollander Thriller 300 2021-06-01 4
32 De Russische connectie Gerrit Barendrecht Thriller 320 2021-06-01 4
33 Wat jij niet ziet M.J. Arlidge Thriller 95 2021-07-01 3
34 Het ongeluk Linwood Barclay Thriller 382 2021-07-01 4
35 Slapen in een zee van sterren Christopher Paolini Sciencefiction 880 2021-07-01 2
36 Tik Tak Chris McGeorge Thriller 320 2021-07-01 4
37 Gegijzeld Clare Mackintosh Thriller 397 2021-08-01 5
38 Eindbestemming Marjolein van der Gaag&Marcella Kleine Thriller 158 2021-08-01 4
39 Een kille rilling Bernard Minier Thriller 582 2021-09-01 4
40 De nachtdienst Esther Verhoef Thriller 365 2021-09-01 5
41 Kiekeboe Chris McGeorge Thriller 352 2021-10-01 3
42 Noorderlicht Mariska Overman Thriller 313 2021-10-01 4
43 De kleine getuige Jilliane Hoffman Thriller 368 2021-11-01 4
44 De marathon Stephen King Thriller 261 2021-11-01 4
45 Het appartement Tatiana de Rosnay Roman 215 2021-11-01 4
46 De intrigant Patricia Snel Thriller 189 2021-12-01 4
47 Een schuldig huis Robert Goddard Thriller 384 2021-12-01 5
48 Te koop Eva Monte Thriller 350 2021-12-01 3
49 Prison Break S1B1 Paul T. Scheuring Thriller 221 2022-01-01 5
50 Prison Break S1B2 Ed van Eeden Thriller 272 2022-01-01 4
51 Prison Break S1B3 Paul T. Scheuring Thriller 285 2022-01-01 4
52 Herfstlied Simone van der Vlugt Thriller 277 2022-02-01 5
53 De gastenlijst Lucy Foley Thriller 352 2022-02-01 2
54 Anomalie Herve le Tellier Thriller 302 2022-02-01 2
55 Prison Break S2B1 Paul T. Scheuring Thriller 207 2022-03-01 4
56 Prison Break S2B2 Paul T. Scheuring Thriller 205 2022-03-01 4
57 Prison Break S2B3 Paul T. Scheuring Thriller 245 2022-03-01 4
58 Ik weet je wachtwoord Daniel Verlaan Non-fictie 347 2022-04-01 5
59 De vrouw die een jaar in bed ging liggen Sue Townsend Roman 368 2022-04-01 3
60 Moord in de bibliotheek Agatha Christie Thriller 256 2022-04-01 3
61 Geestdrift Daniel Hecht Thriller 509 2022-05-01 1
62 Moord in de Orient Expres Agatha Christie Thriller 222 2022-05-01 4
63 Crash Jack Bowman Thriller 344 2022-05-01 3
64 Erken mij Esther Verhoef Thriller 91 2022-06-01 4
65 Gestrand Sarah Goodwin Thriller 352 2022-06-01 5

View File

@ -1,5 +0,0 @@
year,books_read
2013,1
2020,10
2021,36
2022,24
1 year books_read
2 2013 1
3 2020 10
4 2021 36
5 2022 24

View File

@ -5,6 +5,7 @@ from .modules.auth import *
from .modules.crud import * from .modules.crud import *
from .modules.challenges import * from .modules.challenges import *
from .modules.pandas import * from .modules.pandas import *
from .modules.predictions import *
urlpatterns = [ urlpatterns = [
path('books/all', getAllBooks), path('books/all', getAllBooks),
@ -25,4 +26,5 @@ urlpatterns = [
path('books/challenges', getAllChallenges), path('books/challenges', getAllChallenges),
path('books/challenges/insert', addChallenge), path('books/challenges/insert', addChallenge),
path('books/challenges/<int:id>/delete', deleteChallenge), path('books/challenges/<int:id>/delete', deleteChallenge),
path('books/challenges/prediction/train', predict_next_year),
] ]

View File

@ -60,24 +60,3 @@ def getStats(request):
return Response(data[0]) return Response(data[0])
else: else:
return Response("No year header included") return Response("No year header included")
@api_view(['GET'])
def predictAmountBooks(request):
books_data = pd.read_csv("api/static/books_data.csv")
books_data = books_data.dropna()
model = LinearRegression()
X = books_data[['year']]
Y = books_data['books_read']
model.fit(X.values, Y.values)
current_year = 2023
predict_books = model.predict([[current_year]])
return Response({
"year": current_year,
"amount": math.floor(predict_books[0])
})

View File

@ -4,7 +4,8 @@ export const getAllBooks = () => {
return fetch('/api/books/all', { return fetch('/api/books/all', {
"method": "GET", "method": "GET",
"headers": { "headers": {
"Authorization": "Bearer " + localStorage.getItem("token") "Authorization": "Bearer " + localStorage.getItem("token"),
"userid": localStorage.getItem('id')
}, },
}) })
.then(response => response.json()) .then(response => response.json())
@ -13,22 +14,13 @@ export const getAllBooks = () => {
}) })
} }
// export const getBooksByYear = (year) => {
// return fetch('/api/books', {
// "method": "GET",
// "headers": {
// "year": year
// }
// })
// .then(response => response.json())
// .then(data => {
// return data;
// })
// }
export const getAllChallenges = () => { export const getAllChallenges = () => {
return fetch('/api/books/challenges', { return fetch('/api/books/challenges', {
"method": "GET", "method": "GET",
"headers": {
"Authorization": "Bearer " + localStorage.getItem("token"),
"userid": localStorage.getItem('id')
},
}) })
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
@ -73,7 +65,8 @@ export const getStats = (year) => {
"method": "GET", "method": "GET",
"headers": { "headers": {
"year": year, "year": year,
"Authorization": "Bearer " + localStorage.getItem("token") "Authorization": "Bearer " + localStorage.getItem("token"),
"userid": localStorage.getItem('id')
} }
}) })
.then(response => response.json()) .then(response => response.json())
@ -86,7 +79,8 @@ export const getChallenge = (year) => {
return fetch('/api/books/challenge', { return fetch('/api/books/challenge', {
"method": "GET", "method": "GET",
"headers": { "headers": {
"year": year "year": year,
"userid": localStorage.getItem('id')
} }
}) })
.then(response => response.json()) .then(response => response.json())
@ -99,7 +93,8 @@ export const getReadingYears = () => {
return fetch('/api/books/years', { return fetch('/api/books/years', {
"method": "GET", "method": "GET",
"headers": { "headers": {
"Authorization": "Bearer " + localStorage.getItem("token") "Authorization": "Bearer " + localStorage.getItem("token"),
"userid": localStorage.getItem('id')
} }
}) })
.then(response => response.json()) .then(response => response.json())
@ -108,39 +103,13 @@ export const getReadingYears = () => {
}) })
} }
// export const getCountries = (year) => {
// return fetch('/api/books/countries', {
// "method": "GET",
// "headers": {
// "year": year
// }
// })
// .then(response => response.json())
// .then(data => {
// return data;
// })
// }
// export const getShortestLongestBook = (year) => {
// return fetch('/api/books/pages/stats', {
// "method": "GET",
// "headers": {
// "year": year,
// "Authorization": "Bearer " + localStorage.getItem("token")
// }
// })
// .then(response => response.json())
// .then(data => {
// return data;
// })
// }
export const getBooksPerYearPerGenres = (year) => { export const getBooksPerYearPerGenres = (year) => {
return fetch('/api/books/genres', { return fetch('/api/books/genres', {
"method": "GET", "method": "GET",
"headers": { "headers": {
"year": year, "year": year,
"Authorization": "Bearer " + localStorage.getItem("token") "Authorization": "Bearer " + localStorage.getItem("token"),
"userid": localStorage.getItem('id')
} }
}) })
.then(response => response.json()) .then(response => response.json())
@ -154,7 +123,8 @@ export const getGenresCount = (year) => {
"method": "GET", "method": "GET",
"headers": { "headers": {
"year": year, "year": year,
"Authorization": "Bearer " + localStorage.getItem("token") "Authorization": "Bearer " + localStorage.getItem("token"),
"userid": localStorage.getItem('id')
} }
}) })
.then(response => response.json()) .then(response => response.json())
@ -168,7 +138,8 @@ export const getAvgRatings = (year) => {
"method": "GET", "method": "GET",
"headers": { "headers": {
"year": year, "year": year,
"Authorization": "Bearer " + localStorage.getItem("token") "Authorization": "Bearer " + localStorage.getItem("token"),
"userid": localStorage.getItem('id')
} }
}) })
.then(response => response.json()) .then(response => response.json())
@ -182,7 +153,8 @@ export const getRatingsCount = (year) => {
"method": "GET", "method": "GET",
"headers": { "headers": {
"year": year, "year": year,
"Authorization": "Bearer " + localStorage.getItem("token") "Authorization": "Bearer " + localStorage.getItem("token"),
"userid": localStorage.getItem('id')
} }
}) })
.then(response => response.json()) .then(response => response.json())

Binary file not shown.

File diff suppressed because one or more lines are too long