Private
Public Access
1
0

Merge branch 'release/v14.50'

This commit is contained in:
Sander Roosendaal
2020-11-23 22:01:45 +01:00

View File

@@ -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]