Private
Public Access
1
0
This commit is contained in:
Sander Roosendaal
2017-06-17 20:27:18 +02:00
parent 87222b88c4
commit b03d88ba64
3 changed files with 66 additions and 38 deletions

View File

@@ -1,6 +1,60 @@
import pandas as pd import pandas as pd
import numpy as np import numpy as np
from scipy.interpolate import griddata from scipy.interpolate import griddata
from scipy import optimize
def cpfit(powerdf):
# Fit the data to thee parameter CP model
fitfunc = lambda pars,x: abs(pars[0])/(1+(x/abs(pars[2]))) + abs(pars[1])/(1+(x/abs(pars[3])))
errfunc = lambda pars,x,y: fitfunc(pars,x)-y
p0 = [500,350,10,8000]
p1 = p0
thesecs = powerdf['Delta']
theavpower = powerdf['CP']
if len(thesecs)>=4:
p1, success = optimize.leastsq(errfunc, p0[:], args = (thesecs,theavpower))
else:
factor = fitfunc(p0,thesecs.mean())/theavpower.mean()
p1 = [p0[0]/factor,p0[1]/factor,p0[2],p0[3]]
p1 = [abs(p) for p in p1]
fitt = pd.Series(10**(4*np.arange(100)/100.))
fitpower = fitfunc(p1,fitt)
fitpoints = fitfunc(p1,thesecs)
fitpoints0 = fitpoints.copy()
dd = fitpoints-theavpower
ddmin = dd.min()
frac = abs(ddmin)/fitpoints.mean()
while frac>0.0001:
fitpoints = fitpoints*(fitpoints.mean()-ddmin)/(fitpoints.mean())
dd = fitpoints-theavpower
ddmin = dd.min()
frac = abs(ddmin)/fitpoints.mean()
print ddmin,frac
ratio = fitpoints.mean()/fitpoints0.mean()
return p1,fitt,fitpower,ratio
def getlogarr(maxt):
maxlog10 = np.log10(maxt-5)
logarr = np.log10(5.)+np.arange(50)*maxlog10/50.
logarr = [int(10.**(la)) for la in logarr]
logarr = pd.Series(logarr)
logarr.drop_duplicates(keep='first',inplace=True)
logarr = logarr.values
return logarr
def getsinglecp(df): def getsinglecp(df):
thesecs = df['TimeStamp (sec)'].max()-df['TimeStamp (sec)'].min() thesecs = df['TimeStamp (sec)'].max()-df['TimeStamp (sec)'].min()
@@ -9,13 +63,7 @@ def getsinglecp(df):
else: else:
maxt = 1000. maxt = 1000.
maxlog10 = np.log10(maxt) logarr = getlogarr(maxt)
logarr = np.arange(50)*maxlog10/50.
logarr = [int(10.**(la)) for la in logarr]
logarr = pd.Series(logarr)
logarr.drop_duplicates(keep='first',inplace=True)
logarr = logarr.values
dfnew = pd.DataFrame({ dfnew = pd.DataFrame({
@@ -42,7 +90,7 @@ def getcp(dfgrouped,logarr):
tmax = tt.max() tmax = tt.max()
if tmax > 500000: if tmax > 500000:
newlen = int(tmax/5000.) newlen = int(tmax/2000.)
else: else:
newlen = len(tt) newlen = len(tt)
if newlen < len(tt): if newlen < len(tt):

View File

@@ -55,6 +55,7 @@ import rowers.dataprep as dataprep
from rowers.metrics import axes,axlabels,yaxminima,yaxmaxima from rowers.metrics import axes,axlabels,yaxminima,yaxmaxima
from utils import lbstoN from utils import lbstoN
import datautils
watermarkurl = "/static/img/logo7.png" watermarkurl = "/static/img/logo7.png"
watermarksource = ColumnDataSource(dict( watermarksource = ColumnDataSource(dict(
@@ -618,29 +619,11 @@ def interactive_otwcpchart(powerdf,promember=0):
# there is no Paul's law for OTW # there is no Paul's law for OTW
# Fit the data to thee parameter CP model
fitfunc = lambda pars,x: abs(pars[0])/(1+(x/abs(pars[2]))) + abs(pars[1])/(1+(x/abs(pars[3])))
errfunc = lambda pars,x,y: fitfunc(pars,x)-y
p0 = [500,350,10,8000]
p1 = p0
thesecs = powerdf['Delta'] thesecs = powerdf['Delta']
theavpower = powerdf['CP'] theavpower = powerdf['CP']
if len(thesecs)>=4: p1,fitt,fitpower,ratio = datautils.cpfit(powerdf)
p1, success = optimize.leastsq(errfunc, p0[:], args = (thesecs,theavpower))
else:
factor = fitfunc(p0,thesecs.mean())/theavpower.mean()
p1 = [p0[0]/factor,p0[1]/factor,p0[2],p0[3]]
p1 = [abs(p) for p in p1]
fitt = pd.Series(10**(4*np.arange(100)/100.))
fitpower = fitfunc(p1,fitt)
message = "" message = ""
#if len(fitpower[fitpower<0]) > 0: #if len(fitpower[fitpower<0]) > 0:
# message = "CP model fit didn't give correct results" # message = "CP model fit didn't give correct results"
@@ -652,6 +635,7 @@ def interactive_otwcpchart(powerdf,promember=0):
sourcecomplex = ColumnDataSource( sourcecomplex = ColumnDataSource(
data = dict( data = dict(
CP = fitpower, CP = fitpower,
CPmax = ratio*fitpower,
duration = fitt, duration = fitt,
ftime = ftime ftime = ftime
) )
@@ -690,6 +674,7 @@ def interactive_otwcpchart(powerdf,promember=0):
hover.tooltips = OrderedDict([ hover.tooltips = OrderedDict([
('Duration ','@ftime'), ('Duration ','@ftime'),
('Power (W)','@CP{int}'), ('Power (W)','@CP{int}'),
('Power (W) upper','@CPmax{int}'),
]) ])
hover.mode = 'mouse' hover.mode = 'mouse'
@@ -697,6 +682,9 @@ def interactive_otwcpchart(powerdf,promember=0):
plot.line('duration','CP',source=sourcecomplex,legend="CP Model", plot.line('duration','CP',source=sourcecomplex,legend="CP Model",
color='green') color='green')
plot.line('duration','CPmax',source=sourcecomplex,legend="CP Model",
color='red')
script, div = components(plot) script, div = components(plot)
return [script,div,p1,message] return [script,div,p1,message]

View File

@@ -2931,15 +2931,7 @@ def otwrankings_view(request,theuser=0,
maxt = 1000. maxt = 1000.
maxlog10 = np.log10(maxt) logarr = datautils.getlogarr(maxt)
logarr = np.arange(50)*maxlog10/50.
logarr = [int(10.**(la)) for la in logarr]
logarr = pd.Series(logarr)
logarr.drop_duplicates(keep='first',inplace=True)
logarr = logarr.values
dfgrouped = df.groupby(['workoutid']) dfgrouped = df.groupby(['workoutid'])
delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr) delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr)