From 38f7a59476c91e46b42c5aa05d069ff0a1df672d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 6 Feb 2017 09:56:09 +0100 Subject: [PATCH] automating the stats --- rowers/models.py | 1 + rowers/templates/workoutstats.html | 82 +++++------------------------- rowers/views.py | 82 +++++++++++++++--------------- 3 files changed, 56 insertions(+), 109 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 04896767..78b95e1b 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -280,6 +280,7 @@ class Workout(models.Model): ('slides','Indoor Rower on Slides'), ('paddle','Paddle Adapter'), ('snow','On-snow'), + ('other','Other'), ) boattypes = ( diff --git a/rowers/templates/workoutstats.html b/rowers/templates/workoutstats.html index 360c0071..aebd71a4 100644 --- a/rowers/templates/workoutstats.html +++ b/rowers/templates/workoutstats.html @@ -6,7 +6,7 @@ {% block content %}
-

Workout Statistics

+

Workout Statistics for {{ workout.name }}

Edit Workout @@ -38,7 +38,9 @@

-

Stroke Rate

+{% if stats %} +{% for key, value in stats.items %} +

{{ key }}

@@ -48,80 +50,24 @@ - + - + - + - + - + - + - + -
Mean{{ stats.spm.mean|floatformat:-2 }}Mean{{ value.mean|floatformat:-2 }}
Minimum{{ stats.spm.min|floatformat:-2 }}Minimum{{ value.min|floatformat:-2 }}
25%{{ stats.spm.firstq|floatformat:-2 }}25%{{ value.firstq|floatformat:-2 }}
Median{{ stats.spm.median|floatformat:-2 }}Median{{ value.median|floatformat:-2 }}
75%{{ stats.spm.thirdq|floatformat:-2 }}75%{{ value.thirdq|floatformat:-2 }}
Maximum{{ stats.spm.max|floatformat:-2 }}Maximum{{ value.max|floatformat:-2 }}
Standard Deviation{{ stats.spm.std|floatformat:-2 }}Standard Deviation{{ value.std|floatformat:-2 }}
-
-
-

Heart Rate

- - - - - - - - - - - - - - - - - - - - - - - - -
MetricValue
Mean{{ stats.hr.mean|floatformat:-2 }}
Minimum{{ stats.hr.min|floatformat:-2 }}
25%{{ stats.hr.firstq|floatformat:-2 }}
Median{{ stats.hr.median|floatformat:-2 }}
75%{{ stats.hr.thirdq|floatformat:-2 }}
Maximum{{ stats.hr.max|floatformat:-2 }}
Standard Deviation{{ stats.hr.std|floatformat:-2 }}
-
-
-
-

Power

- - - - - - - - - - - - - - - - - - - - - - - - -
MetricValue
Mean{{ stats.power.mean|floatformat:-2 }}
Minimum{{ stats.power.min|floatformat:-2 }}
25%{{ stats.power.firstq|floatformat:-2 }}
Median{{ stats.power.median|floatformat:-2 }}
75%{{ stats.power.thirdq|floatformat:-2 }}
Maximum{{ stats.power.max|floatformat:-2 }}
Standard Deviation{{ stats.power.std|floatformat:-2 }}
-
+ +{% endfor %} +{% endif %}
{% endblock %} diff --git a/rowers/views.py b/rowers/views.py index 6cf816ea..e6a1b021 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -26,7 +26,7 @@ from rowers.forms import SummaryStringForm,IntervalUpdateForm,StrokeDataForm from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart from rowers.models import ( RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm, - RowerPowerZonesForm,AccountRowerForm,UserForm, + RowerPowerZonesForm,AccountRowerForm,UserForm,StrokeData, ) from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement from django.forms.formsets import formset_factory @@ -2611,15 +2611,15 @@ def workout_stats_view(request,id=0,message="",successmessage=""): if request.method == 'POST' and 'workstrokesonly' in request.POST: workstrokesonly = request.POST['workstrokesonly'] - row = Workout.objects.get(id=id) + + # prepare data frame + datadf,row = dataprep.getrowdata_db(id=id) if (checkworkoutuser(request.user,row)==False): message = "You are not allowed to see the stats of this workout" url = reverse(workouts_view,args=[str(message)]) return HttpResponseRedirect(url) - columns = ['hr','spm','power','workoutstate'] - datadf = dataprep.getsmallrowdata_db(columns,ids=[id]) - + if datadf.empty: return HttpResponse("CSV data file not found") @@ -2634,45 +2634,45 @@ def workout_stats_view(request,id=0,message="",successmessage=""): pass workstrokesonly = True + # Create stats stats = {} - # SPM - spmdict = { - 'mean':datadf['spm'].mean(), - 'max': datadf['spm'].max(), - 'min': datadf['spm'].min(), - 'std': datadf['spm'].std(), - 'median': datadf['spm'].median(), - 'firstq':datadf['spm'].quantile(q=0.25), - 'thirdq':datadf['spm'].quantile(q=0.75), - } - stats['spm'] = spmdict + # Get field names and remove those that are not useful in stats + fieldnames = StrokeData._meta.get_all_field_names() + fieldnames.remove('workoutid') + fieldnames.remove('ergpace') + fieldnames.remove('hr_an') + fieldnames.remove('hr_tr') + fieldnames.remove('hr_at') + fieldnames.remove('hr_ut2') + fieldnames.remove('hr_ut1') + fieldnames.remove('time') + fieldnames.remove('distance') + fieldnames.remove('nowindpace') + fieldnames.remove('fnowindpace') + fieldnames.remove('fergpace') + fieldnames.remove('equivergpower') + fieldnames.remove('workoutstate') + fieldnames.remove('fpace') + fieldnames.remove('id') + fieldnames.remove('ftime') + fieldnames.remove('x_right') + fieldnames.remove('hr_max') + fieldnames.remove('hr_bottom') + fieldnames.remove('cumdist') - # HR - hrdict = { - 'mean':datadf['hr'].mean(), - 'max': datadf['hr'].max(), - 'min': datadf['hr'].min(), - 'std': datadf['hr'].std(), - 'median': datadf['hr'].median(), - 'firstq':datadf['hr'].quantile(q=0.25), - 'thirdq':datadf['hr'].quantile(q=0.75), - } - - stats['hr'] = hrdict - - # Power - powerdict = { - 'mean':datadf['power'].mean(), - 'max': datadf['power'].max(), - 'min': datadf['power'].min(), - 'std': datadf['power'].std(), - 'median': datadf['power'].median(), - 'firstq':datadf['power'].quantile(q=0.25), - 'thirdq':datadf['power'].quantile(q=0.75), - } - - stats['power'] = powerdict + for field in fieldnames: + thedict = { + 'mean':datadf[field].mean(), + 'min': datadf[field].min(), + 'std': datadf[field].std(), + 'max': datadf[field].max(), + 'median': datadf[field].median(), + 'firstq':datadf[field].quantile(q=0.25), + 'thirdq':datadf[field].quantile(q=0.75), + } + stats[field] = thedict + return render(request, 'workoutstats.html',