commit
This commit is contained in:
@@ -8,26 +8,27 @@ import numpy as np
|
||||
from scipy.interpolate import griddata
|
||||
from scipy import optimize
|
||||
|
||||
from rowers.mytypes import otwtypes,otetypes,rowtypes
|
||||
from rowers.mytypes import otwtypes, otetypes, rowtypes
|
||||
|
||||
#p0 = [500,350,10,8000]
|
||||
p0 = [190,200,33,16000]
|
||||
p0 = [190, 200, 33, 16000]
|
||||
|
||||
# RPE to TSS
|
||||
rpetotss = {
|
||||
1:20,
|
||||
2:30,
|
||||
3:40,
|
||||
4:50,
|
||||
5:60,
|
||||
6:70,
|
||||
7:80,
|
||||
8:100,
|
||||
9:120,
|
||||
10:140,
|
||||
1: 20,
|
||||
2: 30,
|
||||
3: 40,
|
||||
4: 50,
|
||||
5: 60,
|
||||
6: 70,
|
||||
7: 80,
|
||||
8: 100,
|
||||
9: 120,
|
||||
10: 140,
|
||||
}
|
||||
|
||||
def updatecp(delta,cpvalues,r,workouttype='water'): # pragma: no cover
|
||||
|
||||
def updatecp(delta, cpvalues, r, workouttype='water'): # pragma: no cover
|
||||
if workouttype in otwtypes:
|
||||
p0 = r.p0
|
||||
p1 = r.p1
|
||||
@@ -45,14 +46,13 @@ def updatecp(delta,cpvalues,r,workouttype='water'): # pragma: no cover
|
||||
cp = cpvalues.append(cp2)
|
||||
|
||||
powerdf = pd.DataFrame({
|
||||
'Delta':delta,
|
||||
'CP':cp,
|
||||
})
|
||||
|
||||
powerdf.dropna(axis=0,inplace=True)
|
||||
powerdf.sort_values(['Delta','CP'],ascending=[1,0],inplace=True)
|
||||
powerdf.drop_duplicates(subset='Delta',keep='first',inplace=True)
|
||||
'Delta': delta,
|
||||
'CP': cp,
|
||||
})
|
||||
|
||||
powerdf.dropna(axis=0, inplace=True)
|
||||
powerdf.sort_values(['Delta', 'CP'], ascending=[1, 0], inplace=True)
|
||||
powerdf.drop_duplicates(subset='Delta', keep='first', inplace=True)
|
||||
|
||||
res = cpfit(powerdf)
|
||||
p1 = res[0]
|
||||
@@ -74,35 +74,37 @@ def updatecp(delta,cpvalues,r,workouttype='water'): # pragma: no cover
|
||||
|
||||
return 1
|
||||
|
||||
def cpfit(powerdf,fraclimit=0.0001,nmax=1000):
|
||||
# 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
|
||||
|
||||
def cpfit(powerdf, fraclimit=0.0001, nmax=1000):
|
||||
# Fit the data to thee parameter CP model
|
||||
def fitfunc(pars, x): return abs(
|
||||
pars[0])/(1+(x/abs(pars[2]))) + abs(pars[1])/(1+(x/abs(pars[3])))
|
||||
|
||||
def errfunc(pars, x, y): return fitfunc(pars, x)-y
|
||||
|
||||
p1 = p0
|
||||
|
||||
thesecs = powerdf['Delta']
|
||||
theavpower = powerdf['CP']
|
||||
|
||||
if len(thesecs)>=4:
|
||||
if len(thesecs) >= 4:
|
||||
try:
|
||||
p1, success = optimize.leastsq(errfunc, p0[:], args = (thesecs,theavpower))
|
||||
except: # pragma: no cover
|
||||
factor = fitfunc(p0,thesecs.mean())/theavpower.mean()
|
||||
p1 = [p0[0]/factor,p0[1]/factor,p0[2],p0[3]]
|
||||
p1, success = optimize.leastsq(
|
||||
errfunc, p0[:], args=(thesecs, theavpower))
|
||||
except: # pragma: no cover
|
||||
factor = fitfunc(p0, thesecs.mean())/theavpower.mean()
|
||||
p1 = [p0[0]/factor, p0[1]/factor, p0[2], p0[3]]
|
||||
|
||||
else:
|
||||
factor = fitfunc(p0,thesecs.mean())/theavpower.mean()
|
||||
p1 = [p0[0]/factor,p0[1]/factor,p0[2],p0[3]]
|
||||
|
||||
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)
|
||||
fitpower = fitfunc(p1, fitt)
|
||||
|
||||
fitpoints = fitfunc(p1,thesecs)
|
||||
fitpoints = fitfunc(p1, thesecs)
|
||||
fitpoints0 = fitpoints.copy()
|
||||
dd = fitpoints-theavpower
|
||||
|
||||
@@ -111,7 +113,7 @@ def cpfit(powerdf,fraclimit=0.0001,nmax=1000):
|
||||
frac = abs(ddmin)/fitpoints.mean()
|
||||
|
||||
counter = 0
|
||||
while frac>fraclimit and counter<nmax:
|
||||
while frac > fraclimit and counter < nmax:
|
||||
fitpoints = fitpoints*(fitpoints.mean()-ddmin)/(fitpoints.mean())
|
||||
dd = fitpoints-theavpower
|
||||
ddmin = dd.min()
|
||||
@@ -120,11 +122,12 @@ def cpfit(powerdf,fraclimit=0.0001,nmax=1000):
|
||||
|
||||
ratio = fitpoints.mean()/fitpoints0.mean()
|
||||
|
||||
return p1,fitt,fitpower,ratio
|
||||
return p1, fitt, fitpower, ratio
|
||||
|
||||
|
||||
def getlogarr(maxt):
|
||||
maxlog10 = np.log10(maxt-5)
|
||||
#print(maxlog10,round(maxlog10))
|
||||
# print(maxlog10,round(maxlog10))
|
||||
aantal = 10*round(maxlog10)
|
||||
logarr = np.arange(aantal+1)/10.
|
||||
|
||||
@@ -132,17 +135,18 @@ def getlogarr(maxt):
|
||||
for la in logarr:
|
||||
try:
|
||||
v = 5+int(10.**(la))
|
||||
except ValueError: # pragma: no cover
|
||||
except ValueError: # pragma: no cover
|
||||
v = 0
|
||||
res.append(v)
|
||||
|
||||
logarr = pd.Series(res,dtype='float')
|
||||
logarr.drop_duplicates(keep='first',inplace=True)
|
||||
logarr = pd.Series(res, dtype='float')
|
||||
logarr.drop_duplicates(keep='first', inplace=True)
|
||||
|
||||
logarr = logarr.values
|
||||
return logarr
|
||||
|
||||
def getsinglecp(df): # pragma: no cover
|
||||
|
||||
def getsinglecp(df): # pragma: no cover
|
||||
thesecs = df['TimeStamp (sec)'].max()-df['TimeStamp (sec)'].min()
|
||||
if thesecs != 0:
|
||||
maxt = 1.05*thesecs
|
||||
@@ -151,26 +155,25 @@ def getsinglecp(df): # pragma: no cover
|
||||
|
||||
logarr = getlogarr(maxt)
|
||||
|
||||
|
||||
dfnew = pd.DataFrame({
|
||||
'time':1000*(df['TimeStamp (sec)']-df.loc[:,'TimeStamp (sec)'].iloc[0]),
|
||||
'power':df[' Power (watts)']
|
||||
'time': 1000*(df['TimeStamp (sec)']-df.loc[:, 'TimeStamp (sec)'].iloc[0]),
|
||||
'power': df[' Power (watts)']
|
||||
})
|
||||
|
||||
dfnew['workoutid'] = 0
|
||||
|
||||
dfgrouped = dfnew.groupby(['workoutid'])
|
||||
delta,cpvalue,avgpower = getcp(dfgrouped,logarr)
|
||||
delta, cpvalue, avgpower = getcp(dfgrouped, logarr)
|
||||
|
||||
return delta,cpvalue,avgpower
|
||||
return delta, cpvalue, avgpower
|
||||
|
||||
def getcp_new(dfgrouped,logarr): # pragma: no cover
|
||||
|
||||
def getcp_new(dfgrouped, logarr): # pragma: no cover
|
||||
delta = []
|
||||
cpvalue = []
|
||||
avgpower = {}
|
||||
|
||||
#print(dfgrouped)
|
||||
|
||||
# print(dfgrouped)
|
||||
|
||||
for id, group in dfgrouped:
|
||||
tt = group['time'].copy()
|
||||
@@ -189,28 +192,28 @@ def getcp_new(dfgrouped,logarr): # pragma: no cover
|
||||
newt = np.arange(newlen)*tmax/float(newlen)
|
||||
deltat = newt[1]-newt[0]
|
||||
else:
|
||||
newt = np.arange(0,tmax,10.)
|
||||
newt = np.arange(0, tmax, 10.)
|
||||
deltat = 10.
|
||||
|
||||
ww = griddata(tt.values,
|
||||
ww.values,
|
||||
newt,method='linear',
|
||||
newt, method='linear',
|
||||
rescale=True)
|
||||
|
||||
tt = pd.Series(newt,dtype='float')
|
||||
ww = pd.Series(ww,dtype='float')
|
||||
tt = pd.Series(newt, dtype='float')
|
||||
ww = pd.Series(ww, dtype='float')
|
||||
|
||||
G = pd.Series(ww.cumsum(),dtype='float')
|
||||
G = pd.concat([pd.Series([0],dtype='float'),G])
|
||||
G = pd.Series(ww.cumsum(), dtype='float')
|
||||
G = pd.concat([pd.Series([0], dtype='float'), G])
|
||||
|
||||
h = np.mgrid[0:len(tt)+1:1,0:len(tt)+1:1]
|
||||
h = np.mgrid[0:len(tt)+1:1, 0:len(tt)+1:1]
|
||||
|
||||
distances = pd.DataFrame(h[1]-h[0])
|
||||
|
||||
ones = 1+np.zeros(len(G))
|
||||
|
||||
Ghor = np.outer(ones,G)
|
||||
Gver = np.outer(G,ones)
|
||||
Ghor = np.outer(ones, G)
|
||||
Gver = np.outer(G, ones)
|
||||
|
||||
Gdif = Ghor - Gver
|
||||
|
||||
@@ -220,15 +223,15 @@ def getcp_new(dfgrouped,logarr): # pragma: no cover
|
||||
|
||||
F = Gdif/distances
|
||||
|
||||
F.fillna(inplace=True,method='ffill',axis=1)
|
||||
F.fillna(inplace=True,value=0)
|
||||
F.fillna(inplace=True, method='ffill', axis=1)
|
||||
F.fillna(inplace=True, value=0)
|
||||
|
||||
restime = []
|
||||
power = []
|
||||
|
||||
for i in np.arange(0,len(tt)+1,1):
|
||||
for i in np.arange(0, len(tt)+1, 1):
|
||||
restime.append(deltat*i)
|
||||
cp = np.diag(F,i).max()
|
||||
cp = np.diag(F, i).max()
|
||||
power.append(cp)
|
||||
|
||||
power[0] = power[1]
|
||||
@@ -236,13 +239,10 @@ def getcp_new(dfgrouped,logarr): # pragma: no cover
|
||||
restime = np.array(restime)
|
||||
power = np.array(power)
|
||||
|
||||
|
||||
#power[0] = power[1]
|
||||
|
||||
cpvalues = griddata(restime,power,
|
||||
logarr,method='linear', fill_value=0)
|
||||
|
||||
|
||||
cpvalues = griddata(restime, power,
|
||||
logarr, method='linear', fill_value=0)
|
||||
|
||||
for cpv in cpvalues:
|
||||
cpvalue.append(cpv)
|
||||
@@ -250,27 +250,27 @@ def getcp_new(dfgrouped,logarr): # pragma: no cover
|
||||
delta.append(d)
|
||||
|
||||
df = pd.DataFrame({
|
||||
'delta':delta,
|
||||
'cpvalue':cpvalue
|
||||
})
|
||||
'delta': delta,
|
||||
'cpvalue': cpvalue
|
||||
})
|
||||
|
||||
df.dropna(axis=0, how='any',inplace=True)
|
||||
df = df.sort_values(['delta','cp'], ascending=[1, 0])
|
||||
df.dropna(axis=0, how='any', inplace=True)
|
||||
df = df.sort_values(['delta', 'cp'], ascending=[1, 0])
|
||||
df = df.drop_duplicates(subset='Delta', keep='first')
|
||||
|
||||
delta = df['delta']
|
||||
cpvalue = df['cpvalue']
|
||||
|
||||
return delta,cpvalue,avgpower
|
||||
return delta, cpvalue, avgpower
|
||||
|
||||
|
||||
def getcp(dfgrouped,logarr):
|
||||
def getcp(dfgrouped, logarr):
|
||||
delta = []
|
||||
cpvalue = []
|
||||
avgpower = {}
|
||||
#avgpower[0] = 0
|
||||
|
||||
for id,group in dfgrouped:
|
||||
for id, group in dfgrouped:
|
||||
tt = group['time'].copy()
|
||||
ww = group['power'].copy()
|
||||
|
||||
@@ -289,26 +289,25 @@ def getcp(dfgrouped,logarr):
|
||||
|
||||
try:
|
||||
avgpower[id] = int(ww.mean())
|
||||
except ValueError: # pragma: no cover
|
||||
except ValueError: # pragma: no cover
|
||||
avgpower[id] = '---'
|
||||
if not np.isnan(ww.mean()):
|
||||
length = len(ww)
|
||||
dt = []
|
||||
cpw = []
|
||||
for i in range(length-2):
|
||||
deltat,wmax = getmaxwattinterval(tt,ww,i)
|
||||
deltat, wmax = getmaxwattinterval(tt, ww, i)
|
||||
|
||||
if not np.isnan(deltat) and not np.isnan(wmax):
|
||||
dt.append(deltat)
|
||||
cpw.append(wmax)
|
||||
|
||||
|
||||
dt = pd.Series(dt,dtype='float')
|
||||
cpw = pd.Series(cpw,dtype='float')
|
||||
if len(dt)>2:
|
||||
dt = pd.Series(dt, dtype='float')
|
||||
cpw = pd.Series(cpw, dtype='float')
|
||||
if len(dt) > 2:
|
||||
cpvalues = griddata(dt.values,
|
||||
cpw.values,
|
||||
logarr,method='linear',
|
||||
logarr, method='linear',
|
||||
rescale=True)
|
||||
|
||||
for cpv in cpvalues:
|
||||
@@ -316,25 +315,23 @@ def getcp(dfgrouped,logarr):
|
||||
for d in logarr:
|
||||
delta.append(d)
|
||||
|
||||
|
||||
|
||||
delta = pd.Series(delta,name='Delta',dtype='float')
|
||||
cpvalue = pd.Series(cpvalue,name='CP',dtype='float')
|
||||
|
||||
delta = pd.Series(delta, name='Delta', dtype='float')
|
||||
cpvalue = pd.Series(cpvalue, name='CP', dtype='float')
|
||||
|
||||
cpdf = pd.DataFrame({
|
||||
'delta':delta,
|
||||
'cpvalue':cpvalue
|
||||
})
|
||||
'delta': delta,
|
||||
'cpvalue': cpvalue
|
||||
})
|
||||
|
||||
cpdf.dropna(axis=0, how='any',inplace=True)
|
||||
cpdf.dropna(axis=0, how='any', inplace=True)
|
||||
|
||||
delta = cpdf['delta']
|
||||
cpvalue = cpdf['cpvalue']
|
||||
|
||||
return delta,cpvalue,avgpower
|
||||
return delta, cpvalue, avgpower
|
||||
|
||||
def getmaxwattinterval(tt,ww,i):
|
||||
|
||||
def getmaxwattinterval(tt, ww, i):
|
||||
w_roll = ww.rolling(i+2).mean().dropna()
|
||||
if len(w_roll):
|
||||
# now goes with # data points - should be fixed seconds
|
||||
@@ -349,7 +346,7 @@ def getmaxwattinterval(tt,ww,i):
|
||||
if testres:
|
||||
deltat = 1.0e-3*(t_0-t_1)
|
||||
wmax = w_roll.loc[indexmaxpos]
|
||||
#if wmax > 800 or wmax*5.0e-4*deltat > 800.0:
|
||||
# if wmax > 800 or wmax*5.0e-4*deltat > 800.0:
|
||||
# wmax = 0
|
||||
else:
|
||||
wmax = 0
|
||||
@@ -357,21 +354,22 @@ def getmaxwattinterval(tt,ww,i):
|
||||
except KeyError:
|
||||
wmax = 0
|
||||
deltat = 0
|
||||
else: # pragma: no cover
|
||||
else: # pragma: no cover
|
||||
wmax = 0
|
||||
deltat = 0
|
||||
|
||||
return deltat,wmax
|
||||
return deltat, wmax
|
||||
|
||||
def getfastest(df,thevalue,mode='distance'):
|
||||
|
||||
def getfastest(df, thevalue, mode='distance'):
|
||||
tt = df['time'].copy()
|
||||
dd = df['cumdist'].copy()
|
||||
|
||||
tmax = tt.max()
|
||||
if mode == 'distance': # pragma: no cover
|
||||
if mode == 'distance': # pragma: no cover
|
||||
if dd.max() < thevalue:
|
||||
return 0
|
||||
else: # pragma: no cover
|
||||
else: # pragma: no cover
|
||||
if tt.max() < thevalue:
|
||||
return 0
|
||||
|
||||
@@ -388,68 +386,72 @@ def getfastest(df,thevalue,mode='distance'):
|
||||
newt = np.arange(newlen)*tmax/float(newlen)
|
||||
deltat = newt[1]-newt[0]
|
||||
|
||||
|
||||
dd = griddata(tt.values,
|
||||
dd.values,newt,method='linear',rescale=True)
|
||||
dd.values, newt, method='linear', rescale=True)
|
||||
|
||||
tt = pd.Series(newt,dtype='float')
|
||||
dd = pd.Series(dd,dtype='float')
|
||||
tt = pd.Series(newt, dtype='float')
|
||||
dd = pd.Series(dd, dtype='float')
|
||||
|
||||
G = pd.concat([pd.Series([0]),dd])
|
||||
T = pd.concat([pd.Series([0]),dd])
|
||||
h = np.mgrid[0:len(tt)+1:1,0:len(tt)+1:1]
|
||||
G = pd.concat([pd.Series([0]), dd])
|
||||
T = pd.concat([pd.Series([0]), dd])
|
||||
h = np.mgrid[0:len(tt)+1:1, 0:len(tt)+1:1]
|
||||
distances = pd.DataFrame(h[1]-h[0])
|
||||
ones = 1+np.zeros(len(G))
|
||||
Ghor = np.outer(ones,G)
|
||||
Thor = np.outer(ones,T)
|
||||
Tver = np.outer(T,ones)
|
||||
Gver = np.outer(G,ones)
|
||||
Ghor = np.outer(ones, G)
|
||||
Thor = np.outer(ones, T)
|
||||
Tver = np.outer(T, ones)
|
||||
Gver = np.outer(G, ones)
|
||||
Gdif = Ghor-Gver
|
||||
Gdif = np.tril(Gdif.T).T
|
||||
Gdif = pd.DataFrame(Gdif)
|
||||
F = Gdif
|
||||
|
||||
F.fillna(inplace=True,method='ffill',axis=1)
|
||||
F.fillna(inplace=True,value=0)
|
||||
F.fillna(inplace=True, method='ffill', axis=1)
|
||||
F.fillna(inplace=True, value=0)
|
||||
|
||||
restime = []
|
||||
distance = []
|
||||
starttimes = []
|
||||
endtime = []
|
||||
|
||||
for i in np.arange(0,len(tt)+1,1):
|
||||
for i in np.arange(0, len(tt)+1, 1):
|
||||
restime.append(deltat*i)
|
||||
cp = np.diag(F,i).max()
|
||||
loc = np.argmax(np.diag(F,i))
|
||||
cp = np.diag(F, i).max()
|
||||
loc = np.argmax(np.diag(F, i))
|
||||
thestarttime = tt[loc]
|
||||
starttimes.append(thestarttime)
|
||||
distance.append(cp)
|
||||
|
||||
|
||||
distance[0] = distance[1]
|
||||
|
||||
restime = np.array(restime)
|
||||
distance = np.array(distance)
|
||||
starttimes = np.array(starttimes)
|
||||
|
||||
#for i in range(len(restime)):
|
||||
# for i in range(len(restime)):
|
||||
# if restime[i]<thevalue*60*1000:
|
||||
# print(i,restime[i],distance[i],60*1000*thevalue)
|
||||
|
||||
d2 = 0
|
||||
|
||||
if mode == 'distance':
|
||||
duration = griddata(distance,restime,[thevalue],method='linear',rescale=True)
|
||||
starttime = griddata(distance,starttimes,[thevalue],method='linear',rescale=True)
|
||||
distance = griddata(distance,distance,[thevalue],method='linear',rescale=True)
|
||||
duration = griddata(distance, restime, [
|
||||
thevalue], method='linear', rescale=True)
|
||||
starttime = griddata(distance, starttimes, [
|
||||
thevalue], method='linear', rescale=True)
|
||||
distance = griddata(distance, distance, [
|
||||
thevalue], method='linear', rescale=True)
|
||||
endtime = starttime+duration
|
||||
#print(duration,starttime,endtime,'aa')
|
||||
return duration[0]/1000.,starttime[0]/1000.,endtime[0]/1000.
|
||||
else: # pragma: no cover
|
||||
distance = griddata(restime,distance,[thevalue*60*1000],method='linear',rescale=True)
|
||||
starttime = griddata(restime,starttimes,[thevalue*60*1000],method='linear',rescale=True)
|
||||
duration = griddata(restime,restime,[thevalue*60*1000],method='linear',rescale=True)
|
||||
# print(duration,starttime,endtime,'aa')
|
||||
return duration[0]/1000., starttime[0]/1000., endtime[0]/1000.
|
||||
else: # pragma: no cover
|
||||
distance = griddata(restime, distance, [
|
||||
thevalue*60*1000], method='linear', rescale=True)
|
||||
starttime = griddata(restime, starttimes, [
|
||||
thevalue*60*1000], method='linear', rescale=True)
|
||||
duration = griddata(restime, restime, [
|
||||
thevalue*60*1000], method='linear', rescale=True)
|
||||
endtime = starttime+duration
|
||||
return distance[0],starttime[0]/1000.,endtime[0]/1000.
|
||||
return distance[0], starttime[0]/1000., endtime[0]/1000.
|
||||
|
||||
return 0 # pragma: no cover
|
||||
return 0 # pragma: no cover
|
||||
|
||||
Reference in New Issue
Block a user