From e0f11a3c1f65171478989720f7bae49a48bedcc9 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 11 Oct 2020 17:27:39 +0200 Subject: [PATCH] sort of gets CP data --- rowers/dataprep.py | 69 +++++++++++++++++++++- rowers/models.py | 7 +++ rowers/templates/user_analysis_select.html | 6 +- rowers/views/analysisviews.py | 53 ++++++++++++++++- 4 files changed, 132 insertions(+), 3 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 7218d06a..f6d40497 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1016,6 +1016,68 @@ def fetchcperg(rower,theworkouts): return cpdf +def fetchcp_new(rower,workouts): + + data = [] + for workout in workouts: + cpfile = 'media/cpdata_{id}.parquet.gz'.format(id=workout.id) + try: + df = pd.read_parquet(cpfile) + data.append(df) + except OSError: + # CP data file doesn't exist yet. has to be created + strokesdf = getsmallrowdata_db(['power','workoutid','time'],ids = [workout.id]) + if not strokesdf.empty: + totaltime = strokesdf['time'].max() + try: + powermean = strokesdf['power'].mean() + except KeyError: + powermean = 0 + + + if powermean != 0: + thesecs = totaltime + maxt = 1.05 * thesecs + if maxt > 0: + logarr = datautils.getlogarr(maxt) + dfgrouped = strokesdf.groupby(['workoutid']) + delta, cpvalues, avgpower = datautils.getcp(dfgrouped, logarr) + filename = 'media/cpdata_{id}.parquet.gz'.format(id=workout.id) + df = pd.DataFrame({ + 'delta':delta, + 'cp':cpvalues, + 'id':workout.id, + }) + df.to_parquet(filename,engine='fastparquet',compression='GZIP') + data.append(df) + + + if len(data)>1: + df = pd.concat(data,axis=0) + + df = df.groupby(['delta']).max() + + + df = df.sort_values(['delta']).reset_index() + dindex = df['id'].shift(1)-df['id'] + dpowerplus = df['cp'].shift(1)-df['cp'] + dpowermin = df['cp'].shift(-1)-df['cp'] + badrows = [] + badid = 0 + for index,row in df.iterrows(): + if dindex[index] != 0 and dpowermin[index] > 0: + badrows.append(index) + badid = row['id'] + elif row['id'] == badid: + badrows.append(index) + else: + badid = 0 + + + df = df.drop(index = badrows) + + + return df['delta'],df['cp'],0 def fetchcp(rower,theworkouts,table='cpdata'): # get all power data from database (plus workoutid) @@ -1449,7 +1511,12 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', dfgrouped = df.groupby(['workoutid']) delta, cpvalues, avgpower = datautils.getcp(dfgrouped, logarr) filename = 'media/cpdata_{id}.parquet.gz'.format(id=w.id) - df.to_parquet(filename,engine='fastparquet',compression='GZIP') + cpdf = pd.DataFrame({ + 'delta':delta, + 'cp':cpvalues, + 'id':w.id, + }) + cpdf.to_parquet(filename,engine='fastparquet',compression='GZIP') if workouttype in otwtypes: res, btvalues, res2 = utils.isbreakthrough( diff --git a/rowers/models.py b/rowers/models.py index c302b3ad..2ec434b7 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2985,6 +2985,13 @@ def auto_delete_file_on_delete(sender, instance, **kwargs): except FileNotFoundError: pass + # remove parquet file + try: + dirname = 'media/cpdata_{id}.parquet.gz'.format(id=instance.id) + shutil.rmtree(dirname) + except FileNotFoundError: + pass + @receiver(models.signals.post_delete,sender=Workout) def update_duplicates_on_delete(sender, instance, **kwargs): if instance.id: diff --git a/rowers/templates/user_analysis_select.html b/rowers/templates/user_analysis_select.html index 799df584..bfd6f13c 100644 --- a/rowers/templates/user_analysis_select.html +++ b/rowers/templates/user_analysis_select.html @@ -104,7 +104,11 @@ yaxis1.hide(); yaxis2.hide(); plottype.hide(); - reststrokes.show(); + reststrokes.hide(); + workmin.hide(); + workmax.hide(); + spmmin.hide(); + spmmax.hide(); if (functionfield.val() == 'boxplot') { plotfield.show(); diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index fed7795e..43b2563b 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -501,7 +501,58 @@ def histodata(workouts, options): return(script,div) def cpdata(workouts, options): - return ('','Not Yet Implemented') + userid = options['userid'] + + + u = User.objects.get(id=userid) + r = u.rower + + + ids = [w.id for w in workouts] + delta, cpvalue, avgpower = dataprep.fetchcp_new(r,workouts) + powerdf = pd.DataFrame({ + 'Delta':delta, + 'CP':cpvalue, + }) + + + if powerdf.empty: + return('','

No valid data found

') + + 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) + + rowername = r.user.first_name+" "+r.user.last_name + + if len(powerdf) !=0 : + res = interactive_otwcpchart(powerdf,promember=True,rowername=rowername) + script = res[0] + div = res[1] + p1 = res[2] + ratio = res[3] + r.p0 = p1[0] + r.p1 = p1[1] + r.p2 = p1[2] + r.p3 = p1[3] + r.cpratio = ratio + r.save() + paulslope = 1 + paulintercept = 1 + message = res[4] + else: + script = '' + div = '

No ranking pieces found.

' + paulslope = 1 + paulintercept = 1 + p1 = [1,1,1,1] + message = "" + + scripta = script.split('\n')[2:-1] + script = ''.join(scripta) + + return (script,div) def statsdata(workouts, options): includereststrokes = options['includereststrokes']