Merge branch 'feature/workperstrokeslider' into develop
This commit is contained in:
@@ -102,6 +102,11 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True,
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
datadf['hr'] = datadf['hr']+10
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
datadf=datadf.clip(lower=0)
|
datadf=datadf.clip(lower=0)
|
||||||
datadf.replace(to_replace=0,value=np.nan,inplace=True)
|
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:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
datadf['hr'] = datadf['hr']-10
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
# clean data for useful ranges per column
|
# clean data for useful ranges per column
|
||||||
if not ignorehr:
|
if not ignorehr:
|
||||||
try:
|
try:
|
||||||
@@ -222,11 +232,11 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True,
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
mask = datadf['catch'] > -30.
|
mask = datadf['catch'] > -30.
|
||||||
datadf.loc[mask,'catch'] = np.nan
|
datadf.loc[mask,'catch'] = np.nan
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
workoutstateswork = [1,4,5,8,9,6,7]
|
workoutstateswork = [1,4,5,8,9,6,7]
|
||||||
@@ -433,7 +443,7 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower',
|
|||||||
privacy = 'visible'
|
privacy = 'visible'
|
||||||
|
|
||||||
# check for duplicate start times
|
# check for duplicate start times
|
||||||
ws = Workout.objects.filter(starttime=workoutstarttime,
|
ws = Workout.objects.filter(startdatetime=workoutstartdatetime,
|
||||||
user=r)
|
user=r)
|
||||||
if (len(ws) != 0):
|
if (len(ws) != 0):
|
||||||
message = "Warning: This workout probably already exists in the database"
|
message = "Warning: This workout probably already exists in the database"
|
||||||
|
|||||||
@@ -139,9 +139,10 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False):
|
|||||||
|
|
||||||
columns = ['catch','slip','wash','finish','averageforce',
|
columns = ['catch','slip','wash','finish','averageforce',
|
||||||
'peakforceangle','peakforce','spm','distance',
|
'peakforceangle','peakforce','spm','distance',
|
||||||
'workoutstate']
|
'workoutstate','driveenergy']
|
||||||
|
|
||||||
rowdata = dataprep.getsmallrowdata_db(columns,ids=ids)
|
rowdata = dataprep.getsmallrowdata_db(columns,ids=ids)
|
||||||
|
rowdata.dropna(axis=1,how='all',inplace=True)
|
||||||
rowdata.dropna(axis=0,how='any',inplace=True)
|
rowdata.dropna(axis=0,how='any',inplace=True)
|
||||||
|
|
||||||
workoutstateswork = [1,4,5,8,9,6,7]
|
workoutstateswork = [1,4,5,8,9,6,7]
|
||||||
@@ -278,6 +279,7 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False):
|
|||||||
var y = data['y']
|
var y = data['y']
|
||||||
var spm1 = data2['spm']
|
var spm1 = data2['spm']
|
||||||
var distance1 = data2['distance']
|
var distance1 = data2['distance']
|
||||||
|
var driveenergy1 = data2['driveenergy']
|
||||||
|
|
||||||
var thresholdforce = y[1]
|
var thresholdforce = y[1]
|
||||||
|
|
||||||
@@ -293,6 +295,8 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False):
|
|||||||
var maxspm = maxspm.value
|
var maxspm = maxspm.value
|
||||||
var mindist = mindist.value
|
var mindist = mindist.value
|
||||||
var maxdist = maxdist.value
|
var maxdist = maxdist.value
|
||||||
|
var minwork = minwork.value
|
||||||
|
var maxwork = maxwork.value
|
||||||
|
|
||||||
var catchav = 0
|
var catchav = 0
|
||||||
var finishav = 0
|
var finishav = 0
|
||||||
@@ -307,14 +311,16 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False):
|
|||||||
for (i=0; i<c.length; i++) {
|
for (i=0; i<c.length; i++) {
|
||||||
if (spm1[i]>=minspm && spm1[i]<=maxspm) {
|
if (spm1[i]>=minspm && spm1[i]<=maxspm) {
|
||||||
if (distance1[i]>=mindist && distance1[i]<=maxdist) {
|
if (distance1[i]>=mindist && distance1[i]<=maxdist) {
|
||||||
catchav += c[i]
|
if (driveenergy1[i]>=minwork && driveenergy1[i]<=maxwork) {
|
||||||
finishav += finish[i]
|
catchav += c[i]
|
||||||
slipav += slip[i]
|
finishav += finish[i]
|
||||||
washav += wash[i]
|
slipav += slip[i]
|
||||||
peakforceangleav += peakforceangle[i]
|
washav += wash[i]
|
||||||
averageforceav += averageforce[i]
|
peakforceangleav += peakforceangle[i]
|
||||||
peakforceav += peakforce[i]
|
averageforceav += averageforce[i]
|
||||||
count += 1
|
peakforceav += peakforce[i]
|
||||||
|
count += 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -351,6 +357,15 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False):
|
|||||||
title="Max SPM",callback=callback)
|
title="Max SPM",callback=callback)
|
||||||
callback.args["maxspm"] = slider_spm_max
|
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.)
|
distmax = 100+100*int(rowdata['distance'].max()/100.)
|
||||||
|
|
||||||
slider_dist_min = Slider(start=0,end=distmax,value=0,step=1,
|
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
|
callback.args["maxdist"] = slider_dist_max
|
||||||
|
|
||||||
layout = layoutrow([layoutcolumn([slider_spm_min,
|
layout = layoutrow([layoutcolumn([slider_spm_min,
|
||||||
slider_spm_max,
|
slider_spm_max,
|
||||||
slider_dist_min,
|
slider_dist_min,
|
||||||
slider_dist_max,
|
slider_dist_max,
|
||||||
|
slider_work_min,
|
||||||
|
slider_work_max,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
plot])
|
plot])
|
||||||
@@ -897,20 +914,21 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
|||||||
|
|
||||||
# datadf = dataprep.smalldataprep(theworkouts,xparam,yparam1,yparam2)
|
# datadf = dataprep.smalldataprep(theworkouts,xparam,yparam1,yparam2)
|
||||||
ids = [int(w.id) for w in theworkouts]
|
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]
|
yparamname1 = axlabels[yparam1]
|
||||||
if yparam2 != 'None':
|
if yparam2 != 'None':
|
||||||
yparamname2 = axlabels[yparam2]
|
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':
|
#if yparam2 != 'None':
|
||||||
datadf = datadf[datadf[yparam2] > 0]
|
# datadf = datadf[datadf[yparam2] > 0]
|
||||||
|
|
||||||
# check if dataframe not empty
|
# check if dataframe not empty
|
||||||
if datadf.empty:
|
if datadf.empty:
|
||||||
@@ -1053,6 +1071,7 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
|||||||
var y2 = data['y2']
|
var y2 = data['y2']
|
||||||
var spm1 = data['spm']
|
var spm1 = data['spm']
|
||||||
var distance1 = data['distance']
|
var distance1 = data['distance']
|
||||||
|
var driveenergy1 = data['driveenergy']
|
||||||
var xname = data['xname'][0]
|
var xname = data['xname'][0]
|
||||||
var yname1 = data['yname1'][0]
|
var yname1 = data['yname1'][0]
|
||||||
var yname2 = data['yname2'][0]
|
var yname2 = data['yname2'][0]
|
||||||
@@ -1061,6 +1080,8 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
|||||||
var maxspm = maxspm.value
|
var maxspm = maxspm.value
|
||||||
var mindist = mindist.value
|
var mindist = mindist.value
|
||||||
var maxdist = maxdist.value
|
var maxdist = maxdist.value
|
||||||
|
var minwork = minwork.value
|
||||||
|
var maxwork = maxwork.value
|
||||||
var xm = 0
|
var xm = 0
|
||||||
var ym1 = 0
|
var ym1 = 0
|
||||||
var ym2 = 0
|
var ym2 = 0
|
||||||
@@ -1080,16 +1101,17 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
|||||||
for (i=0; i<x1.length; i++) {
|
for (i=0; i<x1.length; i++) {
|
||||||
if (spm1[i]>=minspm && spm1[i]<=maxspm) {
|
if (spm1[i]>=minspm && spm1[i]<=maxspm) {
|
||||||
if (distance1[i]>=mindist && distance1[i]<=maxdist) {
|
if (distance1[i]>=mindist && distance1[i]<=maxdist) {
|
||||||
data2['x1'].push(x1[i])
|
if (driveenergy1[i]>=minwork && driveenergy1[i]<=maxwork) {
|
||||||
data2['y1'].push(y1[i])
|
data2['x1'].push(x1[i])
|
||||||
data2['y2'].push(y2[i])
|
data2['y1'].push(y1[i])
|
||||||
data2['spm'].push(spm1[i])
|
data2['y2'].push(y2[i])
|
||||||
data2['distance'].push(distance1[i])
|
data2['spm'].push(spm1[i])
|
||||||
|
data2['distance'].push(distance1[i])
|
||||||
xm += x1[i]
|
|
||||||
ym1 += y1[i]
|
|
||||||
ym2 += y2[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
|
x1means.location = xm
|
||||||
y1means.location = ym1
|
y1means.location = ym1
|
||||||
y2means.location = ym2
|
y2means.location = ym2
|
||||||
y1label.text = yname1+': '+ym1.toFixed(2)
|
y1label.text = yname1+': '+(ym1).toFixed(2)
|
||||||
y2label.text = yname2+': '+ym2.toFixed(2)
|
y2label.text = yname2+': '+(ym2).toFixed(2)
|
||||||
xlabel.text = xname+': '+xm.toFixed(2)
|
xlabel.text = xname+': '+(xm).toFixed(2)
|
||||||
|
|
||||||
source2.trigger('change');
|
source2.trigger('change');
|
||||||
""")
|
""")
|
||||||
@@ -1120,6 +1142,15 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
|||||||
title="Max SPM",callback=callback)
|
title="Max SPM",callback=callback)
|
||||||
callback.args["maxspm"] = slider_spm_max
|
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.)
|
distmax = 100+100*int(datadf['distance'].max()/100.)
|
||||||
|
|
||||||
slider_dist_min = Slider(start=0,end=distmax,value=0,step=1,
|
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
|
callback.args["maxdist"] = slider_dist_max
|
||||||
|
|
||||||
layout = layoutrow([layoutcolumn([slider_spm_min,
|
layout = layoutrow([layoutcolumn([slider_spm_min,
|
||||||
slider_spm_max,
|
slider_spm_max,
|
||||||
slider_dist_min,
|
slider_dist_min,
|
||||||
slider_dist_max,
|
slider_dist_max,
|
||||||
|
slider_work_min,
|
||||||
|
slider_work_max,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
plot])
|
plot])
|
||||||
@@ -1162,11 +1195,13 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
#rowdata,row = dataprep.getrowdata_db(id=id)
|
#rowdata,row = dataprep.getrowdata_db(id=id)
|
||||||
columns = [xparam,yparam1,yparam2,
|
columns = [xparam,yparam1,yparam2,
|
||||||
'ftime','distance','fpace',
|
'ftime','distance','fpace',
|
||||||
'power','hr','spm',
|
'power','hr','spm','driveenergy',
|
||||||
'time','pace','workoutstate']
|
'time','pace','workoutstate']
|
||||||
|
|
||||||
rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True)
|
rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True)
|
||||||
|
|
||||||
rowdata.dropna(axis=1,how='all',inplace=True)
|
rowdata.dropna(axis=1,how='all',inplace=True)
|
||||||
|
rowdata.dropna(axis=0,how='any',inplace=True)
|
||||||
|
|
||||||
row = Workout.objects.get(id=id)
|
row = Workout.objects.get(id=id)
|
||||||
if rowdata.empty:
|
if rowdata.empty:
|
||||||
@@ -1405,6 +1440,7 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
var y1 = data['y1']
|
var y1 = data['y1']
|
||||||
var y2 = data['y2']
|
var y2 = data['y2']
|
||||||
var spm1 = data['spm']
|
var spm1 = data['spm']
|
||||||
|
var driveenergy1 = data['driveenergy']
|
||||||
var time1 = data['time']
|
var time1 = data['time']
|
||||||
var pace1 = data['pace']
|
var pace1 = data['pace']
|
||||||
var hr1 = data['hr']
|
var hr1 = data['hr']
|
||||||
@@ -1419,6 +1455,8 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
var maxspm = maxspm.value
|
var maxspm = maxspm.value
|
||||||
var mindist = mindist.value
|
var mindist = mindist.value
|
||||||
var maxdist = maxdist.value
|
var maxdist = maxdist.value
|
||||||
|
var minwork = minwork.value
|
||||||
|
var maxwork = maxwork.value
|
||||||
var xm = 0
|
var xm = 0
|
||||||
var ym1 = 0
|
var ym1 = 0
|
||||||
var ym2 = 0
|
var ym2 = 0
|
||||||
@@ -1443,21 +1481,22 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
for (i=0; i<x1.length; i++) {
|
for (i=0; i<x1.length; i++) {
|
||||||
if (spm1[i]>=minspm && spm1[i]<=maxspm) {
|
if (spm1[i]>=minspm && spm1[i]<=maxspm) {
|
||||||
if (distance1[i]>=mindist && distance1[i]<=maxdist) {
|
if (distance1[i]>=mindist && distance1[i]<=maxdist) {
|
||||||
data2['x1'].push(x1[i])
|
if (driveenergy1[i]>=minwork && driveenergy1[i]<=maxwork) {
|
||||||
data2['y1'].push(y1[i])
|
data2['x1'].push(x1[i])
|
||||||
data2['y2'].push(y2[i])
|
data2['y1'].push(y1[i])
|
||||||
data2['spm'].push(spm1[i])
|
data2['y2'].push(y2[i])
|
||||||
data2['time'].push(time1[i])
|
data2['spm'].push(spm1[i])
|
||||||
data2['fpace'].push(fpace1[i])
|
data2['time'].push(time1[i])
|
||||||
data2['pace'].push(pace1[i])
|
data2['fpace'].push(fpace1[i])
|
||||||
data2['hr'].push(hr1[i])
|
data2['pace'].push(pace1[i])
|
||||||
data2['distance'].push(distance1[i])
|
data2['hr'].push(hr1[i])
|
||||||
data2['power'].push(power1[i])
|
data2['distance'].push(distance1[i])
|
||||||
|
data2['power'].push(power1[i])
|
||||||
xm += x1[i]
|
|
||||||
ym1 += y1[i]
|
|
||||||
ym2 += y2[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)
|
title="Max SPM",callback=callback)
|
||||||
callback.args["maxspm"] = slider_spm_max
|
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.)
|
distmax = 100+100*int(rowdata['distance'].max()/100.)
|
||||||
|
|
||||||
slider_dist_min = Slider(start=0,end=distmax,value=0,step=1,
|
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
|
callback.args["maxdist"] = slider_dist_max
|
||||||
|
|
||||||
layout = layoutrow([layoutcolumn([slider_spm_min,
|
layout = layoutrow([layoutcolumn([slider_spm_min,
|
||||||
slider_spm_max,
|
slider_spm_max,
|
||||||
slider_dist_min,
|
slider_dist_min,
|
||||||
slider_dist_max,
|
slider_dist_max,
|
||||||
|
slider_work_min,
|
||||||
|
slider_work_max,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
plot])
|
plot])
|
||||||
@@ -1517,7 +1567,9 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
def interactive_bar_chart(id=0,promember=0):
|
def interactive_bar_chart(id=0,promember=0):
|
||||||
# check if valid ID exists (workout exists)
|
# check if valid ID exists (workout exists)
|
||||||
rowdata,row = dataprep.getrowdata_db(id=id)
|
rowdata,row = dataprep.getrowdata_db(id=id)
|
||||||
|
rowdata.dropna(axis=1,how='all',inplace=True)
|
||||||
rowdata.dropna(axis=0,how='any',inplace=True)
|
rowdata.dropna(axis=0,how='any',inplace=True)
|
||||||
|
|
||||||
if rowdata.empty:
|
if rowdata.empty:
|
||||||
return "","No Valid Data Available"
|
return "","No Valid Data Available"
|
||||||
|
|
||||||
@@ -1615,7 +1667,9 @@ def interactive_multiple_compare_chart(ids,xparam,yparam,plottype='line',
|
|||||||
'workoutid']
|
'workoutid']
|
||||||
|
|
||||||
datadf = dataprep.getsmallrowdata_db(columns,ids=ids)
|
datadf = dataprep.getsmallrowdata_db(columns,ids=ids)
|
||||||
|
datadf.dropna(axis=1,how='all',inplace=True)
|
||||||
datadf.dropna(axis=0,how='any',inplace=True)
|
datadf.dropna(axis=0,how='any',inplace=True)
|
||||||
|
|
||||||
tseconds = datadf.ix[:,'time']
|
tseconds = datadf.ix[:,'time']
|
||||||
|
|
||||||
yparamname = axlabels[yparam]
|
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)
|
rowdata1[n].fillna(value=0,inplace=True)
|
||||||
rowdata2[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)
|
rowdata1.dropna(axis=0,how='any',inplace=True)
|
||||||
|
rowdata2.dropna(axis=1,how='all',inplace=True)
|
||||||
rowdata2.dropna(axis=0,how='any',inplace=True)
|
rowdata2.dropna(axis=0,how='any',inplace=True)
|
||||||
|
|
||||||
row1 = Workout.objects.get(id=id1)
|
row1 = Workout.objects.get(id=id1)
|
||||||
row2 = Workout.objects.get(id=id2)
|
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):
|
def interactive_otw_advanced_pace_chart(id=0,promember=0):
|
||||||
# check if valid ID exists (workout exists)
|
# check if valid ID exists (workout exists)
|
||||||
rowdata,row = dataprep.getrowdata_db(id=id)
|
rowdata,row = dataprep.getrowdata_db(id=id)
|
||||||
|
rowdata.dropna(axis=1,how='all',inplace=True)
|
||||||
rowdata.dropna(axis=0,how='any',inplace=True)
|
rowdata.dropna(axis=0,how='any',inplace=True)
|
||||||
|
|
||||||
if rowdata.empty:
|
if rowdata.empty:
|
||||||
return "","No Valid Data Available"
|
return "","No Valid Data Available"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user