Merge branch 'release/v14.50'
This commit is contained in:
@@ -1528,7 +1528,7 @@ def interactive_forcecurve(theworkouts,workstrokesonly=True,plottype='scatter'):
|
||||
return [script,div,js_resources,css_resources]
|
||||
|
||||
def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
enddate=None,nrdays=1):
|
||||
enddate=None,nrdays=20):
|
||||
|
||||
TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair'
|
||||
|
||||
@@ -1537,29 +1537,61 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
hourpower = []
|
||||
|
||||
workouts = workouts.order_by('date')
|
||||
data = []
|
||||
|
||||
for w in workouts:
|
||||
ws = workouts.filter(date__gte=w.date-datetime.timedelta(days=nrdays),
|
||||
date__lte=w.date)
|
||||
wws = [ww for ww in ws]
|
||||
delta,cpvalue,avgpower,workoutnames = dataprep.fetchcp_new(user.rower,wws)
|
||||
powerdf = pd.DataFrame({
|
||||
'Delta':delta,
|
||||
'CP':cpvalue,
|
||||
'workout':workoutnames,
|
||||
})
|
||||
powerdf = powerdf[powerdf['CP']>0]
|
||||
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)
|
||||
p1,fitt,fitpower,ratio = datautils.cpfit(powerdf)
|
||||
fitfunc = lambda pars,x: abs(pars[0])/(1+(x/abs(pars[2]))) + abs(pars[1])/(1+(x/abs(pars[3])))
|
||||
cpfile = 'media/cpdata_{id}.parquet.gz'.format(id=w.id)
|
||||
try:
|
||||
df = pd.read_parquet(cpfile)
|
||||
df['workout'] = w.id
|
||||
data.append(df)
|
||||
except:
|
||||
pass
|
||||
|
||||
powerfourmin = fitfunc(p1,240.)
|
||||
powerhour = fitfunc(p1,3600)
|
||||
dates.append(datetime.datetime.combine(w.date,datetime.datetime.min.time()))
|
||||
fourminpower.append(powerfourmin)
|
||||
hourpower.append(powerhour)
|
||||
if len(data) == 0:
|
||||
return pd.Series(),pd.Series(),0,pd.Series()
|
||||
if len(data)>1:
|
||||
df = pd.concat(data,axis=0)
|
||||
|
||||
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
|
||||
|
||||
for w in workouts:
|
||||
ids = [w.id for w in workouts.filter(date__gte=w.date-datetime.timedelta(days=nrdays),
|
||||
date__lte=w.date)]
|
||||
|
||||
powerdf = df[df['workout'].isin(ids)]
|
||||
|
||||
powerdf = powerdf[powerdf['cp'] == powerdf.groupby(['delta'])['cp'].transform('max')]
|
||||
powerdf = powerdf.sort_values(['delta']).reset_index()
|
||||
|
||||
|
||||
powerdf = powerdf[powerdf['cp']>0]
|
||||
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)
|
||||
|
||||
|
||||
# p1,fitt,fitpower,ratio = datautils.cpfit(powerdf)
|
||||
if len(powerdf['delta'])>= 4:
|
||||
thesecs = powerdf['delta'].values
|
||||
theavpower = powerdf['cp'].values
|
||||
|
||||
if thesecs.min() < 240 and thesecs.max() > 240:
|
||||
ww = griddata(thesecs,theavpower,np.arange(239,241,1),method='linear',rescale=True)
|
||||
powerfourmin = ww[1]
|
||||
else:
|
||||
powerfourmin = np.nan
|
||||
|
||||
if thesecs.min() < 3600 and thesecs.max() > 3600:
|
||||
ww = griddata(thesecs,theavpower,np.arange(3599,3601,1),method='linear',rescale=True)
|
||||
powerhour = ww[1]
|
||||
else:
|
||||
powerhour = np.nan
|
||||
|
||||
dates.append(datetime.datetime.combine(w.date,datetime.datetime.min.time()))
|
||||
fourminpower.append(powerfourmin)
|
||||
hourpower.append(powerhour)
|
||||
|
||||
df = pd.DataFrame({
|
||||
'date':dates,
|
||||
@@ -1567,6 +1599,7 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
'hourpower':hourpower,
|
||||
})
|
||||
|
||||
|
||||
df.sort_values(['date'],inplace=True)
|
||||
|
||||
df['hourdup'] = df['hourpower'].shift(1)
|
||||
@@ -1579,6 +1612,7 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
|
||||
|
||||
|
||||
|
||||
source = ColumnDataSource(
|
||||
data = dict(
|
||||
fourminpower = df['fourminpower'],
|
||||
@@ -1656,7 +1690,10 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
('Date','@fdate')
|
||||
])
|
||||
|
||||
script,div = components(plot)
|
||||
try:
|
||||
script,div = components(plot)
|
||||
except:
|
||||
return '','Insufficient Data'
|
||||
|
||||
return [script,div]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user