restore
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user