From 6ec0f669bd40f5e61d3d2fb1ca6a52a61a265de7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Oct 2020 12:12:21 +0200 Subject: [PATCH 1/5] adding workout name to cp chart hover --- rowers/dataprep.py | 9 ++++++--- rowers/interactiveplots.py | 5 ++++- rowers/views/analysisviews.py | 3 ++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 67a82fab..098902c0 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1023,14 +1023,17 @@ def fetchcp_new(rower,workouts): cpfile = 'media/cpdata_{id}.parquet.gz'.format(id=workout.id) try: df = pd.read_parquet(cpfile) + df['workout'] = str(workout) data.append(df) except OSError: # CP data file doesn't exist yet. has to be created - data.append(setcp(workout)[0]) + df, delta, cpvalues = setcp(workout) + df['workout'] = str(workout) + data.append(df) if len(data) == 0: - return pd.Series(),pd.Series(),0 + return pd.Series(),pd.Series(),0,pd.Series() if len(data)>1: df = pd.concat(data,axis=0) @@ -1039,7 +1042,7 @@ def fetchcp_new(rower,workouts): df = df.sort_values(['delta']).reset_index() - return df['delta'],df['cp'],0 + return df['delta'],df['cp'],0,df['workout'] def setcp(workout): strokesdf = getsmallrowdata_db(['power','workoutid','time'],ids = [workout.id]) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 3f78a6f4..a3ed138e 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2921,13 +2921,15 @@ def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data') deltas = fitt.apply(lambda x: timedeltaconv(x)) ftime = niceformat(deltas) + workouts = powerdf['workout'] sourcecomplex = ColumnDataSource( data = dict( CP = fitpower, CPmax = ratio*fitpower, duration = fitt, - ftime = ftime + ftime = ftime, + workout = workouts, ) ) @@ -2978,6 +2980,7 @@ def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data') ('Duration ','@ftime'), ('Power (W)','@CP{int}'), ('Power (W) upper','@CPmax{int}'), + ('Workout','@workout'), ]) hover.mode = 'mouse' diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 891f548f..95615913 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -521,10 +521,11 @@ def cpdata(workouts, options): ids = [w.id for w in workouts] - delta, cpvalue, avgpower = dataprep.fetchcp_new(r,workouts) + delta, cpvalue, avgpower,workouts = dataprep.fetchcp_new(r,workouts) powerdf = pd.DataFrame({ 'Delta':delta, 'CP':cpvalue, + 'workout':workouts, }) From d195d45a373eb8669ba08e0b97aafed87e31a451 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Oct 2020 12:17:30 +0200 Subject: [PATCH 2/5] adding title option to CP chart --- rowers/interactiveplots.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index a3ed138e..46fa5e78 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2881,7 +2881,8 @@ def interactive_agegroupcpchart(age,normalized=False): return script,div -def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data'): +def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data', + title=''): powerdf = powerdf[~(powerdf == 0).any(axis=1)] # plot tools if (promember==1): @@ -2972,7 +2973,9 @@ def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data') plot.y_range = Range1d(0,1.5*max(theavpower)) plot.x_range = Range1d(1,2*max(thesecs)) plot.legend.orientation = "vertical" - plot.title.text = "Critical Power for "+rowername + if not title: + title = "Critical Power for "+rowername + plot.title.text = title hover = plot.select(dict(type=HoverTool)) From 722bfe7f835ecd4b29ce4a5e98899d30af6526ac Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Oct 2020 12:21:49 +0200 Subject: [PATCH 3/5] adding dates to cp chart title --- rowers/views/analysisviews.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 95615913..e4915eea 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -521,11 +521,11 @@ def cpdata(workouts, options): ids = [w.id for w in workouts] - delta, cpvalue, avgpower,workouts = dataprep.fetchcp_new(r,workouts) + delta, cpvalue, avgpower,workoutnames = dataprep.fetchcp_new(r,workouts) powerdf = pd.DataFrame({ 'Delta':delta, 'CP':cpvalue, - 'workout':workouts, + 'workout':workoutnames, }) @@ -540,8 +540,15 @@ def cpdata(workouts, options): rowername = r.user.first_name+" "+r.user.last_name if len(powerdf) !=0 : + datefirst = pd.Series(w.date for w in workouts).min() + datelast = pd.Series(w.date for w in workouts).max() + title = 'CP chart for {name}, from {d1} to {d2}'.format( + name = rowername, + d1 = datefirst, + d2 = datelast, + ) res = interactive_otwcpchart(powerdf,promember=True,rowername=rowername,r=r, - cpfit=cpfit) + cpfit=cpfit,title=title) script = res[0] div = res[1] p1 = res[2] From aec817b01d883710a7da8436687bc8b5ca2ea738 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Oct 2020 12:24:31 +0200 Subject: [PATCH 4/5] bug fix --- rowers/dataprep.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 098902c0..caf28d87 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1536,7 +1536,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', date__gte=firstdate, workouttype__in=otetypes, ) - dd,cpcp,avgpower = fetchcp_new(r,workouts) + dd,cpcp,avgpower,workoutnames = fetchcp_new(r,workouts) powerdf = pd.DataFrame({ 'Delta':dd, 'CP':cpcp, From 567d450d967563e99cbcb5f5b166c7d2f59dd2cd Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Oct 2020 13:01:47 +0200 Subject: [PATCH 5/5] bug fixes --- rowers/dataprep.py | 2 +- rowers/views/analysisviews.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index caf28d87..d18c0707 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1504,7 +1504,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', workouttype__in=otwtypes, ) - dd,cpcp,avgpower = fetchcp_new(r,workouts) + dd,cpcp,avgpower,workoutnames = fetchcp_new(r,workouts) powerdf = pd.DataFrame({ 'Delta':dd, diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index e4915eea..a450e83d 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -2434,6 +2434,7 @@ def otwrankings_view(request,userid=0, powerdf = pd.DataFrame({ 'Delta':delta, 'CP':cpvalue, + 'workout':pd.Series(), }) if powerdf.empty: