From 992224731f4c785e1b4fc8ebf88524f225bd1645 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 2 Mar 2017 14:53:18 +0100 Subject: [PATCH] flex chart work per stroke slider --- rowers/dataprep.py | 20 ++++++-- rowers/interactiveplots.py | 98 +++++++++++++++++++++++++++----------- 2 files changed, 86 insertions(+), 32 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index c8a75af0..6d9a5cf3 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -102,6 +102,11 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True, except KeyError: pass + try: + datadf['hr'] = datadf['hr']+10 + except KeyError: + pass + datadf=datadf.clip(lower=0) datadf.replace(to_replace=0,value=np.nan,inplace=True) @@ -116,6 +121,11 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True, except KeyError: pass + try: + datadf['hr'] = datadf['hr']-10 + except KeyError: + pass + # clean data for useful ranges per column if not ignorehr: try: @@ -222,11 +232,11 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True, pass - try: - mask = datadf['catch'] > -30. - datadf.loc[mask,'catch'] = np.nan - except KeyError: - pass + try: + mask = datadf['catch'] > -30. + datadf.loc[mask,'catch'] = np.nan + except KeyError: + pass workoutstateswork = [1,4,5,8,9,6,7] diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 89bc1cee..3dca55c2 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -139,9 +139,10 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False): columns = ['catch','slip','wash','finish','averageforce', 'peakforceangle','peakforce','spm','distance', - 'workoutstate'] + 'workoutstate','driveenergy'] rowdata = dataprep.getsmallrowdata_db(columns,ids=ids) + rowdata.dropna(axis=1,how='all',inplace=True) rowdata.dropna(axis=0,how='any',inplace=True) workoutstateswork = [1,4,5,8,9,6,7] @@ -278,6 +279,7 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False): var y = data['y'] var spm1 = data2['spm'] var distance1 = data2['distance'] + var driveenergy1 = data2['driveenergy'] var thresholdforce = y[1] @@ -293,6 +295,8 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False): var maxspm = maxspm.value var mindist = mindist.value var maxdist = maxdist.value + var minwork = minwork.value + var maxwork = maxwork.value var catchav = 0 var finishav = 0 @@ -307,14 +311,16 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False): for (i=0; i=minspm && spm1[i]<=maxspm) { if (distance1[i]>=mindist && distance1[i]<=maxdist) { - catchav += c[i] - finishav += finish[i] - slipav += slip[i] - washav += wash[i] - peakforceangleav += peakforceangle[i] - averageforceav += averageforce[i] - peakforceav += peakforce[i] - count += 1 + if (driveenergy1[i]>=minwork && driveenergy1[i]<=maxwork) { + catchav += c[i] + finishav += finish[i] + slipav += slip[i] + washav += wash[i] + peakforceangleav += peakforceangle[i] + averageforceav += averageforce[i] + peakforceav += peakforce[i] + count += 1 + } } } } @@ -351,6 +357,15 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False): title="Max SPM",callback=callback) callback.args["maxspm"] = slider_spm_max + slider_work_min = Slider(start=0, end=1500,value=0, step=10, + title="Min Work per Stroke",callback=callback) + callback.args["minwork"] = slider_work_min + + + slider_work_max = Slider(start=0, end=1500,value=1500, step=10, + title="Max Work per Stroke",callback=callback) + callback.args["maxwork"] = slider_work_max + distmax = 100+100*int(rowdata['distance'].max()/100.) slider_dist_min = Slider(start=0,end=distmax,value=0,step=1, @@ -363,9 +378,11 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False): callback.args["maxdist"] = slider_dist_max layout = layoutrow([layoutcolumn([slider_spm_min, - slider_spm_max, - slider_dist_min, - slider_dist_max, + slider_spm_max, + slider_dist_min, + slider_dist_max, + slider_work_min, + slider_work_max, ], ), plot]) @@ -897,7 +914,8 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, # datadf = dataprep.smalldataprep(theworkouts,xparam,yparam1,yparam2) ids = [int(w.id) for w in theworkouts] - datadf = dataprep.getsmallrowdata_db([xparam,yparam1,yparam2],ids=ids,doclean=False) + columns = [xparam,yparam1,yparam2,'spm','driveenergy','distance'] + datadf = dataprep.getsmallrowdata_db(columns,ids=ids,doclean=False) yparamname1 = axlabels[yparam1] if yparam2 != 'None': @@ -1053,6 +1071,7 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, var y2 = data['y2'] var spm1 = data['spm'] var distance1 = data['distance'] + var driveenergy1 = data['driveenergy'] var xname = data['xname'][0] var yname1 = data['yname1'][0] var yname2 = data['yname2'][0] @@ -1061,6 +1080,8 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, var maxspm = maxspm.value var mindist = mindist.value var maxdist = maxdist.value + var minwork = minwork.value + var maxwork = maxwork.value var xm = 0 var ym1 = 0 var ym2 = 0 @@ -1080,16 +1101,17 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, for (i=0; i=minspm && spm1[i]<=maxspm) { if (distance1[i]>=mindist && distance1[i]<=maxdist) { - data2['x1'].push(x1[i]) - data2['y1'].push(y1[i]) - data2['y2'].push(y2[i]) - data2['spm'].push(spm1[i]) - data2['distance'].push(distance1[i]) - - xm += x1[i] - ym1 += y1[i] - ym2 += y2[i] + if (driveenergy1[i]>=minwork && driveenergy1[i]<=maxwork) { + data2['x1'].push(x1[i]) + data2['y1'].push(y1[i]) + data2['y2'].push(y2[i]) + data2['spm'].push(spm1[i]) + data2['distance'].push(distance1[i]) + xm += x1[i] + ym1 += y1[i] + ym2 += y2[i] + } } } } @@ -1120,6 +1142,15 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, title="Max SPM",callback=callback) callback.args["maxspm"] = slider_spm_max + slider_work_min = Slider(start=0.0, end=1500,value=0.0, step=10, + title="Min Work per Stroke",callback=callback) + callback.args["minwork"] = slider_work_min + + + slider_work_max = Slider(start=0.0, end=1500,value=1500.0, step=10, + title="Max Work per Stroke",callback=callback) + callback.args["maxwork"] = slider_work_max + distmax = 100+100*int(datadf['distance'].max()/100.) slider_dist_min = Slider(start=0,end=distmax,value=0,step=1, @@ -1132,9 +1163,11 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, callback.args["maxdist"] = slider_dist_max layout = layoutrow([layoutcolumn([slider_spm_min, - slider_spm_max, - slider_dist_min, - slider_dist_max, + slider_spm_max, + slider_dist_min, + slider_dist_max, + slider_work_min, + slider_work_max, ], ), plot]) @@ -1166,7 +1199,9 @@ def interactive_flex_chart2(id=0,promember=0, 'time','pace','workoutstate'] rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True) + rowdata.dropna(axis=1,how='all',inplace=True) + rowdata.dropna(axis=0,how='any',inplace=True) row = Workout.objects.get(id=id) if rowdata.empty: @@ -1492,12 +1527,12 @@ def interactive_flex_chart2(id=0,promember=0, title="Max SPM",callback=callback) callback.args["maxspm"] = slider_spm_max - slider_work_min = Slider(start=0.0, end=1000,value=0.0, step=10, + slider_work_min = Slider(start=0.0, end=1500,value=0.0, step=10, title="Min Work per Stroke",callback=callback) callback.args["minwork"] = slider_work_min - slider_work_max = Slider(start=0.0, end=1000,value=1000.0, step=10, + slider_work_max = Slider(start=0.0, end=1500,value=1500.0, step=10, title="Max Work per Stroke",callback=callback) callback.args["maxwork"] = slider_work_max @@ -1532,7 +1567,9 @@ def interactive_flex_chart2(id=0,promember=0, def interactive_bar_chart(id=0,promember=0): # check if valid ID exists (workout exists) rowdata,row = dataprep.getrowdata_db(id=id) + rowdata.dropna(axis=1,how='all',inplace=True) rowdata.dropna(axis=0,how='any',inplace=True) + if rowdata.empty: return "","No Valid Data Available" @@ -1630,7 +1667,9 @@ def interactive_multiple_compare_chart(ids,xparam,yparam,plottype='line', 'workoutid'] datadf = dataprep.getsmallrowdata_db(columns,ids=ids) + datadf.dropna(axis=1,how='all',inplace=True) datadf.dropna(axis=0,how='any',inplace=True) + tseconds = datadf.ix[:,'time'] yparamname = axlabels[yparam] @@ -1792,8 +1831,11 @@ def interactive_comparison_chart(id1=0,id2=0,xparam='distance',yparam='spm', rowdata1[n].fillna(value=0,inplace=True) rowdata2[n].fillna(value=0,inplace=True) + rowdata1.dropna(axis=1,how='all',inplace=True) rowdata1.dropna(axis=0,how='any',inplace=True) + rowdata2.dropna(axis=1,how='all',inplace=True) rowdata2.dropna(axis=0,how='any',inplace=True) + row1 = Workout.objects.get(id=id1) row2 = Workout.objects.get(id=id2) @@ -1963,7 +2005,9 @@ def interactive_comparison_chart(id1=0,id2=0,xparam='distance',yparam='spm', def interactive_otw_advanced_pace_chart(id=0,promember=0): # check if valid ID exists (workout exists) rowdata,row = dataprep.getrowdata_db(id=id) + rowdata.dropna(axis=1,how='all',inplace=True) rowdata.dropna(axis=0,how='any',inplace=True) + if rowdata.empty: return "","No Valid Data Available"