From e673255f438ebee07c00846ee2f3104d53497ee1 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 4 Aug 2017 10:25:49 +0200 Subject: [PATCH 1/7] improved callout on trend flex --- rowers/dataprep.py | 9 +++++++++ rowers/interactiveplots.py | 5 +++++ rowers/views.py | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index bf527500..5ce1a5d6 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -403,6 +403,15 @@ def timedeltaconv(x): return dt +def paceformatsecs(values): + out = [] + for v in values: + td = timedeltaconv(v) + formattedv = strfdelta(td) + out.append(formattedv) + + return out + # Processes painsled CSV file to database def save_workout_database(f2,r,dosmooth=True,workouttype='rower', dosummary=True,title='Workout', diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 18262087..82325366 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1331,11 +1331,16 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='', hover = HoverTool(names=['data'], tooltips = [ (groupby,'@groupval{1.1}'), + (xparamname,'@x{1.1}'), + (yparamname,'@y') ]) else: hover = HoverTool(names=['data'], tooltips = [ (groupby,'@groupval'), + (xparamname,'@x{1.1}'), + (yparamname,'@y') + , ]) hover.mode = 'mouse' diff --git a/rowers/views.py b/rowers/views.py index 1d73ac7d..fc671f05 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3631,11 +3631,16 @@ def multiflex_view(request,userid=0, df = pd.DataFrame({ xparam:xvalues, yparam:yvalues, + 'x':xvalues, + 'y':yvalues, 'xerror':xerror, 'yerror':yerror, 'groupsize':groupsize, }) + if yparam == 'pace': + df['y'] = dataprep.paceformatsecs(df['y']/1.0e3) + aantal = len(df) if groupby != 'date': From c55be018d75a0d996366bb5d3acfd62133698469 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 4 Aug 2017 11:14:45 +0200 Subject: [PATCH 2/7] added efficiency metric --- rowers/dataprep.py | 15 +++++++++++++++ rowers/metrics.py | 1 + rowers/models.py | 1 + rowers/views.py | 2 +- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 5ce1a5d6..57f34316 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -210,6 +210,12 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True, datadf.loc[mask,'pace'] = np.nan except KeyError: pass + + try: + mask = datadf['efficiency'] < 0. + datadf.loc[mask,'efficiency'] = np.nan + except KeyError: + pass try: mask = datadf['pace']/1000. < 60. @@ -1423,6 +1429,14 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True, totalangle = savgol_filter(totalangle,windowsize,3) effectiveangle = savgol_filter(effectiveangle,windowsize,3) + velo = 500./p + + ergpw = 2.8*velo**3 + efficiency = 100.*ergpw/power + + efficiency = efficiency.replace([-np.inf,np.inf],np.nan) + efficiency.fillna(method='ffill') + data['wash'] = wash data['catch'] = catch data['slip'] = slip @@ -1432,6 +1446,7 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True, data['drivelength'] = drivelength data['totalangle'] = totalangle data['effectiveangle'] = effectiveangle + data['efficiency'] = efficiency if otwpower: try: diff --git a/rowers/metrics.py b/rowers/metrics.py index 4fb00b02..c65cbcc0 100644 --- a/rowers/metrics.py +++ b/rowers/metrics.py @@ -22,6 +22,7 @@ axes = ( ('totalangle', 'Drive Length (deg)',40,140,'pro'), ('effectiveangle', 'Effective Drive Length (deg)',40,140,'pro'), ('rhythm', 'Stroke Rhythm (%)',20,55,'pro'), + ('efficiency', 'OTW efficiency (%)',0,110,'pro'), ('None', 'None',0,1,'basic'), ) diff --git a/rowers/models.py b/rowers/models.py index 9bb87132..e880ca24 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -536,6 +536,7 @@ class StrokeData(models.Model): rhythm = models.FloatField(default=1.0,null=True,verbose_name='Rhythm') totalangle = models.FloatField(default=0.0,null=True,verbose_name='Total Stroke Length (deg)') effectiveangle = models.FloatField(default=0.0,null=True,verbose_name='Effective Stroke Length (deg)') + efficiency = models.FloatField(default=-1,null=True,verbose_name='OTW Efficiency') # A wrapper around the png files class GraphImage(models.Model): diff --git a/rowers/views.py b/rowers/views.py index fc671f05..cab19bb5 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -5618,7 +5618,7 @@ def workout_flexchart3_view(request,*args,**kwargs): axchoicespro.pop('totalangle') axchoicespro.pop('effectiveangle') axchoicespro.pop('peakforceangle') - + axchoicespro.pop('efficiency') return render(request, 'flexchart3otw.html', From 981075fd6834480eb118c3b6b90617a969908750 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 4 Aug 2017 13:07:59 +0200 Subject: [PATCH 3/7] added boat type selector to stats and flexall --- rowers/forms.py | 14 +++++++++ rowers/templates/cum_flex.html | 49 +++++++++++++++++++++++++++++ rowers/templates/cumstats.html | 56 ++++++++++++++++++++++++++++++---- rowers/views.py | 17 +++++++++-- 4 files changed, 128 insertions(+), 8 deletions(-) diff --git a/rowers/forms.py b/rowers/forms.py index 4e199518..e64014aa 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -275,10 +275,24 @@ class IntervalUpdateForm(forms.Form): self.fields['type_%s' % i].widget.attrs['style'] = 'width:156px; height: 22px;' self.fields['intervald_%s' % i].widget = forms.TimeInput(format='%H:%M:%S.%f') +boattypes = ( + ('1x', '1x (single)'), + ('2x', '2x (double)'), + ('2-', '2- (pair)'), + ('4x', '4x (quad)'), + ('4-', '4- (four)'), + ('8+', '8+ (eight)'), +) + + # This form sets options for the summary stats page class StatsOptionsForm(forms.Form): includereststrokes = forms.BooleanField(initial=False,label='Include Rest Strokes',required=False) water = forms.BooleanField(initial=False,required=False) + waterboattype = forms.MultipleChoiceField(choices=boattypes, + label='Water Boat Type', + widget=forms.CheckboxSelectMultiple(), + initial = ['1x','2x','2-','4x','4-','8+']) rower = forms.BooleanField(initial=True,required=False) dynamic = forms.BooleanField(initial=True,required=False) slides = forms.BooleanField(initial=True,required=False) diff --git a/rowers/templates/cum_flex.html b/rowers/templates/cum_flex.html index 4d712ba2..942e5992 100644 --- a/rowers/templates/cum_flex.html +++ b/rowers/templates/cum_flex.html @@ -9,6 +9,55 @@ {{ js_res | safe }} {{ css_res| safe }} + + + - + + + + + + + +{{ plotscript |safe }} + +