Private
Public Access
1
0

adding cpoverlay (world class)

This commit is contained in:
Sander Roosendaal
2021-01-19 07:31:44 +01:00
parent d3985c139d
commit 0cda0255ce
4 changed files with 245 additions and 9 deletions

View File

@@ -3304,7 +3304,8 @@ def interactive_agegroupcpchart(age,normalized=False):
def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data',
title='',type='water'):
title='',type='water',
wcpower=[],wcdurations=[],cpoverlay=False):
powerdf = powerdf[~(powerdf == 0).any(axis=1)]
# plot tools
@@ -3356,6 +3357,34 @@ def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data',
workouts = powerdf['workout']
urls = powerdf['url']
# add world class
wcpower = pd.Series(wcpower)
wcdurations = pd.Series(wcdurations)
# fitting WC data to three parameter CP model
if len(wcdurations)>=4:
fitfunc = lambda pars,x: pars[0]/(1+(x/pars[2])) + pars[1]/(1+(x/pars[3]))
errfunc = lambda pars,x,y: fitfunc(pars,x)-y
p1wc, success = optimize.leastsq(errfunc, p0[:],
args = (wcdurations,wcpower))
else:
p1wc = None
if p1wc is not None and cpoverlay:
fitpowerwc = fitfunc(p1wc,fitt)
fitpowerexcellent = 0.7*fitfunc(p1wc,fitt)
fitpowergood = 0.6*fitfunc(p1wc,fitt)
fitpowerfair = 0.5*fitfunc(p1wc,fitt)
fitpoweraverage = 0.4*fitfunc(p1wc,fitt)
else:
fitpowerwc = 0*fitpower
fitpowerexcellent = 0*fitpower
fitpowergood = 0*fitpower
fitpowerfair = 0*fitpower
fitpoweraverage = 0*fitpower
sourcecomplex = ColumnDataSource(
data = dict(
@@ -3364,6 +3393,11 @@ def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data',
duration = fitt/60.,
ftime = ftime,
workout = workouts,
fitpowerwc = fitpowerwc,
fitpowerexcellent = fitpowerexcellent,
fitpowergood = fitpowergood,
fitpowerfair = fitpowerfair,
fitpoweraverage = fitpoweraverage,
url = urls,
)
)
@@ -3424,6 +3458,7 @@ def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data',
('Power (W)','@CP{int}'),
('Power (W) upper','@CPmax{int}'),
('Workout','@workout'),
('World Class','@fitpowerwc{int}')
])
hover.mode = 'mouse'
@@ -3437,6 +3472,27 @@ def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data',
plot.line('duration','CPmax',source=sourcecomplex,legend_label="CP Model",
color='red')
if p1wc is not None:
plot.line('duration','fitpowerwc',source=sourcecomplex,
legend_label="World Class",
color='darkgoldenrod',line_dash='dotted')
plot.line('duration','fitpowerexcellent',source=sourcecomplex,
legend_label="90% percentile",
color='goldenrod',line_dash='dotted')
plot.line('duration','fitpowergood',source=sourcecomplex,
legend_label="75% percentile",
color='sandybrown',line_dash='dotted')
plot.line('duration','fitpowerfair',source=sourcecomplex,
legend_label="50% percentile",
color='rosybrown',line_dash='dotted')
plot.line('duration','fitpoweraverage',source=sourcecomplex,
legend_label="25% percentile",
color='tan',line_dash='dotted')
script, div = components(plot)
return [script,div,p1,ratio,message]