adding trimp or rscore, time constants, test duration to form
This commit is contained in:
@@ -1528,22 +1528,24 @@ 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=42):
|
||||
enddate=None,kfitness=42,kfatigue=7,fitnesstest=20):
|
||||
|
||||
TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair'
|
||||
|
||||
dates = []
|
||||
fourminpower = []
|
||||
hourpower = []
|
||||
testpower = []
|
||||
|
||||
workouts = workouts.order_by('date')
|
||||
data = []
|
||||
|
||||
fitnesstestsecs = fitnesstest*60
|
||||
|
||||
for w in workouts:
|
||||
cpfile = 'media/cpdata_{id}.parquet.gz'.format(id=w.id)
|
||||
try:
|
||||
df = pd.read_parquet(cpfile)
|
||||
df['workout'] = w.id
|
||||
df['workoutdate'] = w.date.strftime('%d-%m-%Y')
|
||||
data.append(df)
|
||||
except:
|
||||
pass
|
||||
@@ -1557,7 +1559,7 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
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),
|
||||
ids = [w.id for w in workouts.filter(date__gte=w.date-datetime.timedelta(days=kfitness),
|
||||
date__lte=w.date)]
|
||||
|
||||
powerdf = df[df['workout'].isin(ids)]
|
||||
@@ -1577,46 +1579,39 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
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]
|
||||
if thesecs.min() < fitnesstestsecs and thesecs.max() > fitnesstestsecs:
|
||||
ww = griddata(thesecs,theavpower,np.array([fitnesstestsecs]),method='linear',rescale=True)
|
||||
powertest = ww[0]
|
||||
else:
|
||||
powerfourmin = np.nan
|
||||
powertest = 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)
|
||||
testpower.append(powertest)
|
||||
|
||||
|
||||
df = pd.DataFrame({
|
||||
'date':dates,
|
||||
'fourminpower':fourminpower,
|
||||
'hourpower':hourpower,
|
||||
'testpower':testpower,
|
||||
})
|
||||
|
||||
|
||||
df.sort_values(['date'],inplace=True)
|
||||
|
||||
df['hourdup'] = df['hourpower'].shift(1)
|
||||
df['fourmindup'] = df['fourminpower'].shift(1)
|
||||
df['hourpower'] = df.apply(lambda x: np.nan if abs(x['hourpower'] - x['hourdup']) < 4 \
|
||||
else x['hourpower'],axis=1)
|
||||
|
||||
df['fourminpower'] = df.apply(lambda x: np.nan if abs(x['fourminpower'] - x['fourmindup']) < 4 \
|
||||
else x['fourminpower'],axis=1)
|
||||
df['testdup'] = df['testpower'].shift(1)
|
||||
df['testpower'] = df.apply(lambda x: np.nan if abs(x['testpower'] - x['testdup']) < 4 \
|
||||
else x['testpower'],axis=1)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
source = ColumnDataSource(
|
||||
data = dict(
|
||||
fourminpower = df['fourminpower'],
|
||||
hourpower = df['hourpower'],
|
||||
testpower = df['testpower'],
|
||||
date = df['date'],
|
||||
fdate = df['date'].map(lambda x: x.strftime('%d-%m-%Y'))
|
||||
)
|
||||
@@ -1656,10 +1651,8 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
y_range_name = "watermark",
|
||||
)
|
||||
|
||||
plot.circle('date','fourminpower',source=source,fill_color='green',size=10,legend_label='4 min power')
|
||||
plot.circle('date','hourpower',source=source,fill_color='blue',size=10,legend_label='60 min power')
|
||||
|
||||
|
||||
plot.circle('date','testpower',source=source,fill_color='green',size=10,
|
||||
legend_label='{fitnesstest} min power'.format(fitnesstest=fitnesstest))
|
||||
|
||||
plot.xaxis.axis_label = 'Date'
|
||||
plot.yaxis.axis_label = 'Power (W)'
|
||||
@@ -1673,7 +1666,7 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
plot.xaxis.major_label_orientation = pi/4
|
||||
plot.sizing_mode = 'stretch_both'
|
||||
|
||||
plot.y_range = Range1d(0,1.5*max(fourminpower))
|
||||
plot.y_range = Range1d(0,1.5*max(testpower))
|
||||
startdate = datetime.datetime.combine(startdate,datetime.datetime.min.time())
|
||||
enddate = datetime.datetime.combine(enddate,datetime.datetime.min.time())
|
||||
|
||||
@@ -1685,8 +1678,7 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None,
|
||||
hover = plot.select(dict(type=HoverTool))
|
||||
|
||||
hover.tooltips = OrderedDict([
|
||||
('Power 4 minutes','@fourminpower'),
|
||||
('Power 1 hour','@hourpower'),
|
||||
('Power {fitnesstest} minutes'.format(fitnesstest=fitnesstest),'@testpower'),
|
||||
('Date','@fdate')
|
||||
])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user