From 647f88b87db9d8bf406c9f7015eecdb391925c53 Mon Sep 17 00:00:00 2001 From: frlzjosh Date: Mon, 4 May 2020 03:21:02 -0700 Subject: [PATCH] visualized data based off our stored from mongodb databases and services created to obtain this data --- backend-services/app.py | 137 +++++++++++++++++++++--------- backend-services/focus_scores.png | Bin 0 -> 24930 bytes backend-services/getFocusScore.py | 16 ---- backend-services/topicChart.png | Bin 0 -> 26921 bytes 4 files changed, 96 insertions(+), 57 deletions(-) create mode 100644 backend-services/focus_scores.png delete mode 100644 backend-services/getFocusScore.py create mode 100644 backend-services/topicChart.png diff --git a/backend-services/app.py b/backend-services/app.py index 89f5d21..520b13f 100644 --- a/backend-services/app.py +++ b/backend-services/app.py @@ -11,6 +11,10 @@ from flask_mysqldb import MySQL import requests import json +import matplotlib.pyplot as plt +from matplotlib.patches import Patch +from matplotlib.lines import Line2D +import numpy as np app= Flask(__name__) @@ -32,11 +36,12 @@ def userSessionDuration(): sessions = getAllSessions() all_sessions = sessions.json.get("sessions") - user_ids = [1,2,3,4,5,6] + users = retrieveUsers().json.get("Users") user_time_list = [] user_sesssion_duration_list = [] - for user_id in user_ids: + for user in users: + user_id = int(user['user_id']) user_transcribed_counter = 0 transcribed_list = [] for session in all_sessions: @@ -79,10 +84,11 @@ def aggregateUserTopics(): sessions = getAllSessions() all_sessions = sessions.json.get("sessions") - user_ids = [1,2,3,4,5,6] + users = retrieveUsers().json.get("Users") user_topic_list =[] - for user_id in user_ids: + for user in users: + user_id = user['user_id'] for session in all_sessions: session_user_id = int(session['user_id']) if user_id == session_user_id: @@ -90,25 +96,40 @@ def aggregateUserTopics(): "user_id": session_user_id, "topic": session["topic"] } - if user_topic not in user_topic_list: - user_topic_list.append(user_topic) - - + if user_topic not in user_topic_list: + user_topic_list.append(user_topic) + visualizeTopics() return jsonify(user_topic_list) +def visualizeTopics(): + outputFile = "topicChart.png" + plt.switch_backend('Agg') + sizes= [33.3, 33.3, 33.3] + labels= ['sports', 'food', 'computer science'] + colors = ['gold', 'yellowgreen', 'lightcoral'] + explode = (0, 0, 0) # explode 1st slice + + plt.pie(sizes, explode=explode, labels=labels, colors=colors, + autopct='%1.1f%%', shadow=True, startangle=140) + plt.title("Topics") + plt.axis('equal') + plt.savefig(outputFile) + plt.show() + @app.route('/get-users-avg-scores', methods=['GET']) def userAverageFocusScore(): sessions = getAllSessions() all_sessions = sessions.json.get("sessions") - user_ids = [1,2,3,4,5,6] + user_ids = retrieveUsers().json.get("Users") user_score_list =[] summedScore = 0 user_session_count = 0 - for user_id in user_ids: + for user in user_ids: for session in all_sessions: session_user_id = int(session['user_id']) + user_id = int(user['user_id']) if user_id == session_user_id: user_session_count +=1 if session['focus_score'] == 'true': @@ -135,7 +156,7 @@ def userAverageFocusScore(): @app.route('/get-users-profession-with-score', methods=['GET']) def getProfession(): - users = retrieveUser() + users = retrieveUsers() get_users = users.json.get("Users") user_average_score = userAverageFocusScore() scores = user_average_score.json.get("avgScore") @@ -149,16 +170,50 @@ def getProfession(): if user_id == score_from_userAverageFocusScore: profession_object ={ "user_id": score["user_id"], - "avg_focus_score": score ["avg_focus_score"], + "avg_focus_score": score["avg_focus_score"], "profession" : user["professional"] } profession_list.append(profession_object) profession_with_score ={ "profession_with_score":profession_list } + visualizeFocus(profession_with_score) return jsonify(profession_with_score) - +def visualizeFocus(users): + professions = [] + focus_scores = [] + colors = [] + for user in users['profession_with_score']: + professions.append(user['profession']) + focus_scores.append(user['avg_focus_score']) + print(int(user['avg_focus_score'])) + if(int(user['avg_focus_score']) >= 7.0): + colors.append('green') + elif(int(user['avg_focus_score']) > 4.0 and int(user['avg_focus_score']) < 7.0): + colors.append('yellow') + else: + colors.append('red') + + plt.switch_backend('Agg') + legend_elements = [ + Line2D([0], [0], color='g', lw=4, label='Good Focus Score'), + Line2D([0], [0], color='y', lw=4, label='Decent Focus Score'), + Line2D([0], [0], color='r', lw=4, label='Bad Focus Score'), + ] + plt.legend(handles=legend_elements) + + + + outputFile = "focus_scores.png" + index = np.arange(len(professions)) + plt.bar(index, focus_scores, color=colors, edgecolor='black') + plt.xlabel('User Professions', fontsize=10) + plt.ylabel('Focus Scores', fontsize=12) + plt.xticks(index, professions, fontsize=8, rotation=0) + plt.title('User Focus Scores') + plt.savefig(outputFile) + plt.show() @app.route("/") def hello(): @@ -207,39 +262,39 @@ def insertSession(): @app.route('/get-user-information', methods=['GET']) -def retrieveUser(): - cur = mysql.connection.cursor() - cur.execute ("SELECT * FROM user") - fetchdata = cur.fetchall() - cur.close() - - users = [] +def retrieveUsers(): + cur = mysql.connection.cursor() + cur.execute ("SELECT * FROM user") + fetchdata = cur.fetchall() + cur.close() - for row in fetchdata: - user_info = { - "user_id":row[0], - "age":row[1], - "city":row[2], - "first_name":row[6], - "last_name":row[8], - "email":row[5], - "gender":row[7], - "user_name":row[11], - "password":row[9], - "professional":row[10], - "created_at":row[3], - "deleted_at":row[4] - } - users.append(user_info) - all_users = { - "Users":users + users = [] + + for row in fetchdata: + user_info = { + "user_id":row[0], + "age":row[1], + "city":row[2], + "first_name":row[6], + "last_name":row[8], + "email":row[5], + "gender":row[7], + "user_name":row[11], + "password":row[9], + "professional":row[10], + "created_at":row[3], + "deleted_at":row[4] } - - return jsonify(all_users) + users.append(user_info) + all_users = { + "Users":users + } + + return jsonify(all_users) @app.route('/merge-user-data',methods=['GET']) def mergeUserData(): - users = retrieveUser() + users = retrieveUsers() get_users = users.json.get("Users") sessions = getAllSessions() all_sessions = sessions.json.get("sessions") diff --git a/backend-services/focus_scores.png b/backend-services/focus_scores.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb26280681f73d45a0b30a52d2968336f145a7d GIT binary patch literal 24930 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 Q2(*pC)78&qol`;+0QvMjm;e9( literal 0 HcmV?d00001 diff --git a/backend-services/getFocusScore.py b/backend-services/getFocusScore.py deleted file mode 100644 index f5c4e56..0000000 --- a/backend-services/getFocusScore.py +++ /dev/null @@ -1,16 +0,0 @@ -from pymongo import MongoClient - -def getAverageScore(collection): - - summedFS = 0 - for doc in collection.find(): - summedFS += int(doc["focus_score"]) - - return(summedFS/collection.count()) #.count() is deprecated - - -mongo_client = MongoClient("mongodb+srv://off-top-dev:offtop123@cluster0-ci5ku.gcp.mongodb.net/off-top-db") - -col = mongo_client["off-top-db"].sessions -score = getAverageScore(col) -print(score) \ No newline at end of file diff --git a/backend-services/topicChart.png b/backend-services/topicChart.png new file mode 100644 index 0000000000000000000000000000000000000000..e252aa301062f5a360e349b2fac3e5bff4453cf1 GIT binary patch literal 26921 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 literal 0 HcmV?d00001