From 0f88d004b1fd862e0a6a89c061c42be4dcaaeb7c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 18 Nov 2017 15:45:51 -0700 Subject: [PATCH 1/3] adds distance pieces to OTE ranking piece (PRO) The PRO ranking piece calculation for erg pieces now also calculates distance based pieces. --- rowers/templates/oterankings.html | 232 ++++++++++++++++++++++++++++++ rowers/views.py | 93 ++++++++++-- static/img/image.png | Bin 0 -> 73412 bytes 3 files changed, 316 insertions(+), 9 deletions(-) create mode 100644 rowers/templates/oterankings.html create mode 100644 static/img/image.png diff --git a/rowers/templates/oterankings.html b/rowers/templates/oterankings.html new file mode 100644 index 00000000..9fdc910d --- /dev/null +++ b/rowers/templates/oterankings.html @@ -0,0 +1,232 @@ +{% extends "base.html" %} +{% load staticfiles %} +{% load rowerfilters %} + +{% block scripts %} +{% include "monitorjobs.html" %} +{% endblock %} + +{% block title %}Workouts{% endblock %} + +{% block content %} + + + + + {{ interactiveplot |safe }} + + + + + +
+
+ {% if theuser %} +

{{ theuser.first_name }}'s Ranking Pieces

+ {% else %} +

{{ user.first_name }}'s Ranking Pieces

+ {% endif %} +
+
+ {% if user.is_authenticated and user|is_manager %} + +
+ +
+

Summary for {{ theuser.first_name }} {{ theuser.last_name }} + between {{ startdate|date }} and {{ enddate|date }}

+ +

Direct link for other users: + {% if workouttype == 'water' %} + https://rowsandall.com/rowers/{{ id }}/otw-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }} + {% else %} + https://rowsandall.com/rowers/{{ id }}/ote-ranking/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }} + {% endif %} +

+ +

The table gives the efforts you marked as Ranking Piece. + The graph shows the best segments from those pieces, plotted as + average power (over the segment) vs the duration of the segment/ + In other words: How long you can hold that power. +

+ +

When you change the date range, the algorithm calculates new + parameters in a background process. You may have to reload the + page to get an updated prediction.

+

At the bottom of the page, you will find predictions derived from the model.

+
+
+

Use this form to select a different date range:

+

+ Select start and end date for a date range: +

+ +
+ + + {{ dateform.as_table }} +
+ {% csrf_token %} +
+
+ +
+
+
+ Or use the last {{ deltaform }} days. +
+
+ {% csrf_token %} + + +
+
+ + + +
+ +

Critical Power Plot

+ + {{ the_div|safe }} + +
+ +
+ +

Ranking Piece Results

+ + {% if rankingworkouts %} + + + + + + + + + + + + + + + {% for workout in rankingworkouts %} + + + + + + + + + + + + {% endfor %} + +
Distance Duration Avg Power Date Avg HR Max HR Edit
{{ workout.distance }} m {{ workout.duration |durationprint:"%H:%M:%S.%f" }} {{ avgpower|lookup:workout.id }} W {{ workout.date }} {{ workout.averagehr }} {{ workout.maxhr }} + {{ workout.name }}
+ {% else %} +

No ranking workouts found

+ {% endif %} + +
+ +
+

Pace predictions for Ranking Pieces

+ +

Add non-ranking piece using the form. The piece will be added in the prediction tables below.

+ + + +
+ + + + + + + + + + + + {% for pred in cpredictions %} + + {% for key, value in pred.items %} + {% if key == "power" or key == "upper" %} + + {% endif %} + {% if key == "duration" %} + + {% endif %} + {% if key == "distance" %} + + {% endif %} + {% if key == 'pace' %} + + {% endif %} + {% endfor %} + + {% endfor %} + +
Duration Distance Pace (upper) Power     Power (upper)
{{ value }} W {{ value |deltatimeprint }} {{ value }} m {{ value|paceprint }}
+ +
+ +
+
+ {{ form.value }} {{ form.pieceunit }} + + {% csrf_token %} +
+
+ minutes +
+
+ + +
+ + +
+ +{% endblock %} diff --git a/rowers/views.py b/rowers/views.py index 8fe5e197..13c9cee9 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3779,6 +3779,8 @@ def oterankings_view(request,theuser=0, rankingdurations.append(datetime.time(hour=1)) rankingdurations.append(datetime.time(hour=1,minute=15)) + rankingdistances = [100,500,1000,2000,5000,6000,10000,21097,42195,100000] + thedistances = [] theworkouts = [] thesecs = [] @@ -3874,21 +3876,29 @@ def oterankings_view(request,theuser=0, form = PredictedPieceForm(request.POST) clean = form.is_valid() value = form.cleaned_data['value'] - hourvalue,value = divmod(value,60) + hourvalue,tvalue = divmod(value,60) hourvalue = int(hourvalue) - minutevalue = int(value) - value = int(60*(value-minutevalue)) + minutevalue = int(tvalue) + tvalue = int(60*(tvalue-minutevalue)) if hourvalue >= 24: hourvalue = 23 - rankingdurations.append(datetime.time(minute=minutevalue, - hour=hourvalue, - second=value)) + pieceunit = form.cleaned_data['pieceunit'] + if pieceunit == 'd': + rankingdistances.append(value) + else: + rankingdurations.append(datetime.time( + minute=minutevalue, + hour=hourvalue, + second=tvalue + )) else: form = PredictedPieceForm() cpredictions = [] + + for rankingduration in rankingdurations: t = 3600.*rankingduration.hour t += 60.*rankingduration.minute @@ -3900,6 +3910,9 @@ def oterankings_view(request,theuser=0, pwr = p1[0]/(1+t/p1[2]) pwr += p1[1]/(1+t/p1[3]) + velo = (pwr/2.8)**(1./3.) + p = 500./velo + d = t*velo if pwr <= 0: pwr = 50. @@ -3912,16 +3925,78 @@ def oterankings_view(request,theuser=0, pwr2 = pwr a = { + 'distance':int(d), 'duration':timedeltaconv(t), 'power':int(pwr), - 'upper':int(pwr2)} + 'upper':int(pwr2), + 'pace':timedeltaconv(p)} + cpredictions.append(a) - del form.fields["pieceunit"] + # initiation - get 10 min power, then use Paul's law + + t_10 = 600. + power_10 = p1[0]/(1+t_10/p1[2]) + power_10 += p1[1]/(1+t_10/p1[3]) + + velo_10 = (power_10/2.8)**(1./3.) + pace_10 = 500./velo_10 + distance_10 = t_10*velo_10 + + paulslope = 5. + + for rankingdistance in rankingdistances: + + delta = paulslope * np.log(rankingdistance/distance_10)/np.log(2) + + + p = pace_10+delta + velo = 500./p + t = rankingdistance/velo + + pwr2 = p1[0]/(1+t/p1[2]) + pwr2 += p1[1]/(1+t/p1[3]) + pwr2 *= ratio + + if pwr2 <= 0: + pwr2 = 50. + + velo2 = (pwr2/2.8)**(1./3.) + + if np.isnan(velo2) or velo2 <= 0: + velo2 = 1.0 + + t2 = rankingdistance/velo2 + + pwr3 = p1[0]/(1+t2/p1[2]) + pwr3 += p1[1]/(1+t2/p1[3]) + pwr3 *= ratio + + + if pwr3 <= 0: + pwr3 = 50. + + velo3 = (pwr3/2.8)**(1./3.) + if np.isnan(velo3) or velo3 <= 0: + velo3 = 1.0 + + t3 = rankingdistance/velo3 + p3 = 500./velo3 + + a = { + 'distance':rankingdistance, + 'duration':timedeltaconv(t3), + 'power':'--', + 'upper':int(pwr3), + 'pace':timedeltaconv(p3)} + + cpredictions.append(a) + + # del form.fields["pieceunit"] messages.error(request,message) - return render(request, 'otwrankings.html', + return render(request, 'oterankings.html', {'rankingworkouts':theworkouts, 'interactiveplot':script, 'the_div':div, diff --git a/static/img/image.png b/static/img/image.png new file mode 100644 index 0000000000000000000000000000000000000000..d6acd4178ac041dd26a1a4e813d4b57c3cb5a247 GIT binary patch literal 73412 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 literal 0 HcmV?d00001 From b21c0c122f5c07b7fb097aebf9873fadc68f7069 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 18 Nov 2017 17:03:18 -0700 Subject: [PATCH 2/3] manual workout form - datetime is 48 years off --- rowers/dataprep.py | 43 ++++++++++++++++++++ rowers/templates/manualadd.html | 38 +++++++++++++++++ rowers/templates/rankings.html | 15 ++++++- rowers/urls.py | 1 + rowers/views.py | 72 +++++++++++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 rowers/templates/manualadd.html diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 45cfd3d4..f5e70a66 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -555,6 +555,49 @@ def fetchcp(rower,theworkouts,table='cpdata'): return [],[],avgpower2 +# create a new workout from manually entered data +def create_row_df(distance,duration,startdatetime): + + print startdatetime + + nr_strokes = int(distance/10.) + + unixstarttime = arrow.get(startdatetime).timestamp + + print unixstarttime,'aap' + + totalseconds = duration.hour*3600. + totalseconds += duration.minute*60. + totalseconds += duration.second + totalseconds += duration.microsecond/1.e6 + + + spm = 60.*nr_strokes/totalseconds + + step = totalseconds/float(nr_strokes) + + elapsed = np.arange(0,totalseconds+step,step) + + dstep = distance/float(nr_strokes) + + d = np.arange(0,distance+dstep,dstep) + + unixtime = unixstarttime + elapsed + + print unixtime + + pace = 500.*totalseconds/distance + + df = pd.DataFrame({ + 'TimeStamp (sec)': unixtime, + ' Horizontal (meters)': d, + ' Cadence (stokes/min)': spm, + ' Stroke500mPace (sec/500m)':pace, + ' ElapsedTime (sec)':elapsed, + }) + + return df + # Processes painsled CSV file to database diff --git a/rowers/templates/manualadd.html b/rowers/templates/manualadd.html new file mode 100644 index 00000000..60540df9 --- /dev/null +++ b/rowers/templates/manualadd.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} +{% load staticfiles %} +{% load rowerfilters %} +{% load tz %} + + +{% get_current_timezone as TIME_ZONE %} + +{% block content %} +
+

Add Workout Manually

+
+ {% if form.errors %} +

+ Please correct the error{{ form.errors|pluralize }} below. +

+ {% endif %} + +
+ + {{ form.as_table }} +
+ {% csrf_token %} +
+ +
+
+
+ +
+

 

+ +
+
+ + +{% endblock %} diff --git a/rowers/templates/rankings.html b/rowers/templates/rankings.html index e5625f95..741f5a41 100644 --- a/rowers/templates/rankings.html +++ b/rowers/templates/rankings.html @@ -72,7 +72,7 @@

The table gives the best efforts achieved on the official Concept2 ranking pieces in the selected date range.

-

This page will evolve and try to give you guidance on where to improve.

+

Use this form to select a different date range:

@@ -138,6 +138,19 @@

No ranking workouts found

{% endif %} +

Missing your best pieces? Upload stroke data of any Concept2 + ranking piece and they will be automatically added to this page.

+

Don't have stroke data for official Concept2 ranking pieces? + The PRO membership ranking piece functionality + allows you to include your best non ranking pieces and even use + parts of workouts for improved calculation accuracy. +

+ +

Want to add race results but you don't have stroke data? + Click here.

+ +

Scroll down for the chart and pace predictions for ranking pieces.

+
diff --git a/rowers/urls.py b/rowers/urls.py index b31c2be7..46406980 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -126,6 +126,7 @@ urlpatterns = [ url(r'^list-workouts/team/(?P\d+)/$',views.workouts_view), url(r'^list-workouts/(?P\w+.*)/(?P\w+.*)$',views.workouts_view), url(r'^list-workouts/$',views.workouts_view), + url(r'^addmanual/$',views.addmanual_view), url(r'^team-compare-select/team/(?P\d+)/(?P\w+.*)/(?P\w+.*)$',views.team_comparison_select), url(r'^team-compare-select/team/(?P\d+)/$',views.team_comparison_select), url(r'^team-compare-select/(?P\w+.*)/(?P\w+.*)$',views.team_comparison_select), diff --git a/rowers/views.py b/rowers/views.py index 13c9cee9..3f9a38c5 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3096,6 +3096,78 @@ def histo(request,theuser=0, 'teams':get_my_teams(request.user), }) +# add a workout manually +@login_required() +def addmanual_view(request): + r = Rower.objects.get(user=request.user) + + if request.method == 'POST': + # Form was submitted + form = WorkoutForm(request.POST) + if form.is_valid(): + # Get values from form + name = form.cleaned_data['name'] + date = form.cleaned_data['date'] + starttime = form.cleaned_data['starttime'] + workouttype = form.cleaned_data['workouttype'] + duration = form.cleaned_data['duration'] + distance = form.cleaned_data['distance'] + notes = form.cleaned_data['notes'] + thetimezone = form.cleaned_data['timezone'] + try: + boattype = request.POST['boattype'] + except KeyError: + boattype = '1x' + try: + privacy = request.POST['privacy'] + except KeyError: + privacy = 'visible' + try: + rankingpiece = form.cleaned_data['rankingpiece'] + except KeyError: + rankingpiece =- Workout.objects.get(id=id).rankingpiece + + startdatetime = (str(date) + ' ' + str(starttime)) + startdatetime = datetime.datetime.strptime(startdatetime, + "%Y-%m-%d %H:%M:%S") + startdatetime = timezone.make_aware(startdatetime) + startdatetime = startdatetime.astimezone( + pytz.timezone(thetimezone) + ) + + df = dataprep.create_row_df(distance,duration,startdatetime) + + id,message = dataprep.new_workout_from_df(r,df, + title = name, + parent = None, + ) + + if message: + messages.error(request,message) + + if id: + w = Workout.objects.get(id=id) + w.rankingpiece = rankingpiece + w.notes = notes + w.save() + messages.info(request,'New workout created') + + + initial = { + 'workouttype':'rower', + 'date':datetime.date.today(), + 'starttime':timezone.now(), + 'timezone':r.defaulttimezone, + 'duration':datetime.timedelta(minutes=2), + 'distance':500, + + } + form = WorkoutForm(initial=initial) + + return render(request,'manualadd.html', + {'form':form, + }) + # Show ranking distances including predicted paces @login_required() def rankings_view(request,theuser=0, From ec287cc4b5cb42f9ee5c57e4858a18425b7bd81a Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 18 Nov 2017 17:38:01 -0700 Subject: [PATCH 3/3] manually adding ranking pieces works --- rowers/dataprep.py | 36 +++++++++++++++++++++++++++++------- rowers/views.py | 14 +++++++++----- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index f5e70a66..f99a9468 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -556,16 +556,15 @@ def fetchcp(rower,theworkouts,table='cpdata'): # create a new workout from manually entered data -def create_row_df(distance,duration,startdatetime): +def create_row_df(r,distance,duration,startdatetime, + title = 'Manually added workout',notes='', + workouttype='rower'): - print startdatetime nr_strokes = int(distance/10.) unixstarttime = arrow.get(startdatetime).timestamp - print unixstarttime,'aap' - totalseconds = duration.hour*3600. totalseconds += duration.minute*60. totalseconds += duration.second @@ -584,19 +583,42 @@ def create_row_df(distance,duration,startdatetime): unixtime = unixstarttime + elapsed - print unixtime - pace = 500.*totalseconds/distance + if workouttype in ['rower','slides','dynamic']: + velo = distance/totalseconds + power = 2.8*velo**3 + else: + power = 0 + df = pd.DataFrame({ 'TimeStamp (sec)': unixtime, ' Horizontal (meters)': d, ' Cadence (stokes/min)': spm, ' Stroke500mPace (sec/500m)':pace, ' ElapsedTime (sec)':elapsed, + ' Power (watts)':power, }) - return df + timestr = strftime("%Y%m%d-%H%M%S") + + csvfilename = 'media/df_' + timestr + '.csv' + df[' ElapsedTime (sec)'] = df['TimeStamp (sec)'] + + row = rrdata(df=df) + + row.write_csv(csvfilename, gzip = True) + + id, message = save_workout_database(csvfilename, r, + title=title, + notes=notes, + dosmooth=False, + workouttype=workouttype, + consistencychecks=False, + totaltime=totalseconds) + + return (id, message) + # Processes painsled CSV file to database diff --git a/rowers/views.py b/rowers/views.py index 3f9a38c5..58cbdee0 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3135,12 +3135,16 @@ def addmanual_view(request): pytz.timezone(thetimezone) ) - df = dataprep.create_row_df(distance,duration,startdatetime) - id,message = dataprep.new_workout_from_df(r,df, - title = name, - parent = None, - ) + print name + id,message = dataprep.create_row_df(r, + distance, + duration,startdatetime, + title = name, + notes=notes, + workouttype=workouttype) + + if message: messages.error(request,message)