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
|
2022-09-28 14:29:54 +02:00
|
|
|
import pandas as pd
|
2022-09-30 16:30:18 +02:00
|
|
|
import ras.settings
|
2023-02-15 16:00:58 +01:00
|
|
|
import math
|
|
|
|
|
|
|
|
from sklearn.linear_model import LinearRegression
|
|
|
|
from sklearn.metrics import mean_squared_error
|
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 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'])
|
2022-12-23 17:04:09 +01:00
|
|
|
df = pd.read_sql('SELECT * FROM api_books ORDER BY readed', engine, parse_dates={'readed': {'format': '%m-%Y'}})
|
2022-09-30 16:30:18 +02:00
|
|
|
|
|
|
|
return df
|
|
|
|
|
2022-10-27 11:17:03 +02:00
|
|
|
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
|
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
def filterData(df, datayear = None):
|
|
|
|
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
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
# Filter data on year
|
|
|
|
if datayear and datayear is not None:
|
|
|
|
df = df.where(df['readed'].str.contains(datayear))
|
2022-09-28 14:29:54 +02:00
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
return df
|
2022-09-30 16:30:18 +02:00
|
|
|
|
2022-10-27 11:17:03 +02:00
|
|
|
@api_view(['GET'])
|
|
|
|
def getAllBooks(request):
|
|
|
|
|
|
|
|
data = []
|
|
|
|
books = getBooksData()
|
|
|
|
|
|
|
|
for index, row in books.iterrows():
|
|
|
|
data.append({
|
|
|
|
"id": row['id'],
|
|
|
|
"name": row['name'],
|
|
|
|
"author": row['author'],
|
|
|
|
"genre": row['genre'],
|
|
|
|
"author": row['author'],
|
|
|
|
"country": row['country'],
|
|
|
|
"country_code": row['country_code'],
|
|
|
|
"pages": row['pages'],
|
|
|
|
"readed": row['readed'],
|
|
|
|
"rating": row['rating'],
|
|
|
|
})
|
|
|
|
|
|
|
|
return Response(data)
|
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def getChallengeOfYear(request):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
|
|
|
data = []
|
|
|
|
df = getBookChallenge(request.META.get('HTTP_YEAR'))
|
|
|
|
|
|
|
|
for index, row in df.iterrows():
|
|
|
|
data.append({
|
|
|
|
"year": row['year'],
|
|
|
|
"nrofbooks": row['nrofbooks']
|
|
|
|
})
|
|
|
|
|
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|
2022-09-30 16:30:18 +02:00
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
@api_view(['GET'])
|
|
|
|
def books_per_genre_per_month(request):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
2022-09-28 14:29:54 +02:00
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
data = []
|
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
2022-09-28 14:29:54 +02:00
|
|
|
|
|
|
|
# Filter array on genre and date
|
|
|
|
booksPerMonth = df.groupby(['genre','readed'])['genre'].count().reset_index(name="count")
|
2022-11-02 13:28:02 +01:00
|
|
|
booksPerMonth = booksPerMonth.sort_values(by=['genre', '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'])
|
2022-10-03 17:03:02 +02:00
|
|
|
def countGenres(request):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
|
|
|
|
2022-09-29 16:18:35 +02:00
|
|
|
data = []
|
2022-10-03 17:03:02 +02:00
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
2022-09-30 16:30:18 +02:00
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
genres = df.groupby('genre')['genre'].count().reset_index(name="count")
|
|
|
|
genres = genres.sort_values(by='count', ascending=False)
|
2022-09-29 16:18:35 +02:00
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
for index, row in genres.iterrows():
|
2022-09-29 16:18:35 +02:00
|
|
|
|
|
|
|
data.append({
|
2022-10-03 17:03:02 +02:00
|
|
|
"genre": row['genre'],
|
|
|
|
"count": int(row['count'])
|
2022-09-29 16:18:35 +02:00
|
|
|
})
|
2022-10-03 17:03:02 +02:00
|
|
|
|
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'])
|
2022-10-03 17:03:02 +02:00
|
|
|
def books_per_country(request):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
2022-09-30 16:30:18 +02:00
|
|
|
data = []
|
2022-10-03 17:03:02 +02:00
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
2022-09-30 16:30:18 +02:00
|
|
|
|
2022-10-04 16:28:55 +02:00
|
|
|
countries = df.groupby(['country_code', 'country'])['country'].count().reset_index(name="count")
|
2022-10-03 17:03:02 +02:00
|
|
|
countries = countries.sort_values(by='count', ascending=False)
|
2022-09-30 16:30:18 +02:00
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
for index, row in countries.iterrows():
|
2022-09-30 16:30:18 +02:00
|
|
|
|
|
|
|
data.append({
|
2022-10-04 16:28:55 +02:00
|
|
|
"code": row['country_code'],
|
2022-10-03 17:03:02 +02:00
|
|
|
"country": row['country'],
|
2022-09-30 16:30:18 +02:00
|
|
|
"count": int(row['count'])
|
|
|
|
})
|
|
|
|
|
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|
|
|
|
|
2022-10-11 15:33:16 +02:00
|
|
|
@api_view(['GET'])
|
|
|
|
def books_per_author(request):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
|
|
|
data = []
|
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
|
|
|
|
|
|
|
countries = df.groupby(['author'])['author'].count().reset_index(name="count")
|
|
|
|
countries = countries.sort_values(by='count', ascending=False)
|
|
|
|
|
|
|
|
for index, row in countries.iterrows():
|
|
|
|
|
|
|
|
data.append({
|
|
|
|
"author": row['author'],
|
|
|
|
"count": int(row['count'])
|
|
|
|
})
|
|
|
|
|
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
@api_view(['GET'])
|
|
|
|
def getStats(request):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
|
|
|
data = []
|
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
|
|
|
df = df.dropna()
|
|
|
|
|
|
|
|
statsTotalBooks = df['name'].count()
|
|
|
|
statsTotalPages = df['pages'].astype(int).sum()
|
|
|
|
statsTotalWriters = df['author'].nunique()
|
|
|
|
statsTotalCountries = df['country'].nunique()
|
|
|
|
statsTotalGenres = df['genre'].nunique()
|
|
|
|
|
|
|
|
|
|
|
|
data.append({
|
|
|
|
'totalbooks': statsTotalBooks,
|
|
|
|
'totalpages': statsTotalPages,
|
|
|
|
'totalauthors': statsTotalWriters,
|
|
|
|
'totalcountries': statsTotalCountries,
|
|
|
|
'totalgenres': statsTotalGenres
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
return Response(data[0])
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|
|
|
|
|
2022-10-11 15:33:16 +02:00
|
|
|
@api_view(['GET'])
|
|
|
|
def getStatsPages(request):
|
|
|
|
data = []
|
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
|
|
|
df = df.dropna()
|
|
|
|
|
|
|
|
df['pages'] = df['pages'].astype(int)
|
|
|
|
|
|
|
|
pages = df.groupby(['pages', 'name', 'author', 'rating'])['pages'].count().reset_index(name="count")
|
|
|
|
pages = pages.sort_values(by='pages', ascending=True)
|
|
|
|
|
|
|
|
shortestbook = pages.iloc[0]
|
|
|
|
longestbook = pages.iloc[-1]
|
|
|
|
avgPages = df["pages"].mean().astype(int)
|
|
|
|
|
|
|
|
shortestbook = {
|
|
|
|
"name": shortestbook["name"],
|
|
|
|
"author": shortestbook['author'],
|
|
|
|
"pages": shortestbook['pages'],
|
|
|
|
"rating": shortestbook['rating'].astype(int)
|
|
|
|
}
|
|
|
|
|
|
|
|
longestbook = {
|
|
|
|
"name": longestbook["name"],
|
|
|
|
"author": longestbook['author'],
|
|
|
|
"pages": longestbook['pages'],
|
|
|
|
"rating": longestbook['rating'].astype(int)
|
|
|
|
}
|
|
|
|
|
|
|
|
data = {
|
|
|
|
"longestbook": longestbook,
|
|
|
|
"shortestbook": shortestbook,
|
|
|
|
"avgbook": avgPages
|
|
|
|
}
|
|
|
|
|
|
|
|
return Response(data)
|
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def pages_per_month(request):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
|
|
|
|
|
|
|
data = []
|
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
|
|
|
|
|
|
|
# Filter array on genre and date
|
|
|
|
booksPerMonth = df.groupby(['pages', 'readed'])['pages'].count().reset_index(name="count")
|
|
|
|
booksPerMonth = booksPerMonth.sort_values(by=['readed', 'count'], ascending=True)
|
|
|
|
|
|
|
|
for index, row in booksPerMonth.iterrows():
|
|
|
|
data.append({
|
|
|
|
"pages": row['pages'],
|
|
|
|
"readed": row['readed']
|
|
|
|
})
|
|
|
|
|
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|
|
|
|
|
2022-10-03 17:03:02 +02:00
|
|
|
@api_view(['GET'])
|
|
|
|
def getYears(request):
|
|
|
|
df = filterData(getBooksData())
|
|
|
|
|
|
|
|
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")
|
|
|
|
|
2023-02-15 16:00:58 +01:00
|
|
|
return Response(years['year'])
|
|
|
|
|
|
|
|
@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])
|
|
|
|
})
|
2023-03-07 17:07:53 +01:00
|
|
|
# return Response(f"The amount of books i'm gonna read in {current_year} is {math.floor(predict_books[0])}")
|
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def avg_ratings_per_month(request):
|
|
|
|
datayear = request.META.get('HTTP_YEAR')
|
|
|
|
|
|
|
|
if datayear:
|
|
|
|
data = []
|
|
|
|
|
|
|
|
# Get CSV file with book data
|
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
|
|
|
|
|
|
|
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'])
|
|
|
|
})
|
|
|
|
|
2023-03-08 16:48:02 +01:00
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def countRatings(request):
|
|
|
|
datayear = request.META.get('HTTP_YEAR')
|
|
|
|
|
|
|
|
if datayear:
|
|
|
|
data = []
|
|
|
|
|
|
|
|
# Get CSV file with book data
|
|
|
|
df = filterData(getBooksData(), request.META.get('HTTP_YEAR'))
|
|
|
|
|
|
|
|
countratings = df.groupby('rating')['rating'].count().reset_index(name="count")
|
|
|
|
countratings = countratings.sort_values(by='rating', ascending=False)
|
|
|
|
|
|
|
|
for index, row in countratings.iterrows():
|
|
|
|
|
|
|
|
data.append({
|
|
|
|
"rating": int(row['rating']),
|
|
|
|
"count": int(row['count'])
|
|
|
|
})
|
|
|
|
|
2023-03-07 17:07:53 +01:00
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return Response("No year header included")
|