diff --git a/rowers/dataprep.py b/rowers/dataprep.py index f0468037..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] @@ -433,7 +443,7 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', privacy = 'visible' # check for duplicate start times - ws = Workout.objects.filter(starttime=workoutstarttime, + ws = Workout.objects.filter(startdatetime=workoutstartdatetime, user=r) if (len(ws) != 0): message = "Warning: This workout probably already exists in the database" diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index e1fc7f60..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,20 +914,21 @@ 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': yparamname2 = axlabels[yparam2] - datadf = datadf[datadf[yparam1] > 0] + #datadf = datadf[datadf[yparam1] > 0] - datadf = datadf[datadf[xparam] > 0] + #datadf = datadf[datadf[xparam] > 0] - if yparam2 != 'None': - datadf = datadf[datadf[yparam2] > 0] + #if yparam2 != 'None': + # datadf = datadf[datadf[yparam2] > 0] # check if dataframe not empty if datadf.empty: @@ -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] + } } } } @@ -1104,9 +1126,9 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, x1means.location = xm y1means.location = ym1 y2means.location = ym2 - y1label.text = yname1+': '+ym1.toFixed(2) - y2label.text = yname2+': '+ym2.toFixed(2) - xlabel.text = xname+': '+xm.toFixed(2) + y1label.text = yname1+': '+(ym1).toFixed(2) + y2label.text = yname2+': '+(ym2).toFixed(2) + xlabel.text = xname+': '+(xm).toFixed(2) source2.trigger('change'); """) @@ -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]) @@ -1162,11 +1195,13 @@ def interactive_flex_chart2(id=0,promember=0, #rowdata,row = dataprep.getrowdata_db(id=id) columns = [xparam,yparam1,yparam2, 'ftime','distance','fpace', - 'power','hr','spm', + 'power','hr','spm','driveenergy', '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: @@ -1405,6 +1440,7 @@ def interactive_flex_chart2(id=0,promember=0, var y1 = data['y1'] var y2 = data['y2'] var spm1 = data['spm'] + var driveenergy1 = data['driveenergy'] var time1 = data['time'] var pace1 = data['pace'] var hr1 = data['hr'] @@ -1419,6 +1455,8 @@ def interactive_flex_chart2(id=0,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 @@ -1443,21 +1481,22 @@ def interactive_flex_chart2(id=0,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['time'].push(time1[i]) - data2['fpace'].push(fpace1[i]) - data2['pace'].push(pace1[i]) - data2['hr'].push(hr1[i]) - data2['distance'].push(distance1[i]) - data2['power'].push(power1[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['time'].push(time1[i]) + data2['fpace'].push(fpace1[i]) + data2['pace'].push(pace1[i]) + data2['hr'].push(hr1[i]) + data2['distance'].push(distance1[i]) + data2['power'].push(power1[i]) + xm += x1[i] + ym1 += y1[i] + ym2 += y2[i] + } } } } @@ -1488,6 +1527,15 @@ 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=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(rowdata['distance'].max()/100.) slider_dist_min = Slider(start=0,end=distmax,value=0,step=1, @@ -1500,9 +1548,11 @@ def interactive_flex_chart2(id=0,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]) @@ -1517,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" @@ -1615,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] @@ -1777,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) @@ -1948,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"