diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 67a82fab..d18c0707 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]) @@ -1501,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, @@ -1533,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, diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 3f78a6f4..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): @@ -2921,13 +2922,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, ) ) @@ -2970,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)) @@ -2978,6 +2983,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..a450e83d 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,workoutnames = dataprep.fetchcp_new(r,workouts) powerdf = pd.DataFrame({ 'Delta':delta, 'CP':cpvalue, + 'workout':workoutnames, }) @@ -539,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] @@ -2426,6 +2434,7 @@ def otwrankings_view(request,userid=0, powerdf = pd.DataFrame({ 'Delta':delta, 'CP':cpvalue, + 'workout':pd.Series(), }) if powerdf.empty: