From e21b72fa92dcdc99d963e7c692856c8ce0645a56 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 23 Nov 2020 21:22:56 +0100 Subject: [PATCH 1/2] fix --- rowers/interactiveplots.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 216a1f10..932a3fb6 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1539,10 +1539,7 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None, workouts = workouts.order_by('date') 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) + delta,cpvalue,avgpower,workoutnames = dataprep.fetchcp_new(user.rower,[w]) powerdf = pd.DataFrame({ 'Delta':delta, 'CP':cpvalue, From d4bda60359dc4ed9b5b96252ef8d98fe4cea3484 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 23 Nov 2020 22:01:25 +0100 Subject: [PATCH 2/2] fix --- rowers/interactiveplots.py | 78 ++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 19 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 932a3fb6..88f304ac 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -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,26 +1537,61 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None, hourpower = [] workouts = workouts.order_by('date') + data = [] for w in workouts: - delta,cpvalue,avgpower,workoutnames = dataprep.fetchcp_new(user.rower,[w]) - 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, @@ -1564,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) @@ -1576,6 +1612,7 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None, + source = ColumnDataSource( data = dict( fourminpower = df['fourminpower'], @@ -1653,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]