From d64114f6dc4fd42dfbbf799cce839bc7011c36c6 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 27 Oct 2020 08:12:40 +0100 Subject: [PATCH] refactoring around CP charts --- rowers/dataprep.py | 160 +++++++++++--------------------------- rowers/views/userviews.py | 56 +------------ 2 files changed, 47 insertions(+), 169 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 571ba4f2..45961b81 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1080,6 +1080,47 @@ def setcp(workout,background=False): return pd.DataFrame({'delta':[],'cp':[]}),pd.Series(),pd.Series() +def update_rolling_cp(r,types,mode='water'): + firstdate = datetime.date.today()-datetime.timedelta(days=r.cprange) + workouts = Workout.objects.filter( + date__gte=firstdate, + workouttype__in=types, + user = r + ) + + delta, cp, avgpower, workoutnames = fetchcp_new(r,workouts) + + powerdf = pd.DataFrame({ + 'Delta':delta, + 'CP':cp, + }) + + 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) + + res2 = datautils.cpfit(powerdf) + if len(powerdf) != 0: + if mode == 'water': + p1 = res2[0] + r.p0 = p1[0] + r.p1 = p1[1] + r.p2 = p1[2] + r.p3 = p1[3] + r.cpratio = res2[3] + r.save() + else: + p1 = res2[0] + r.ep0 = p1[0] + r.ep1 = p1[1] + r.ep2 = p1[2] + r.ep3 = p1[3] + r.ecpratio = res2[3] + r.save() + + return True + return False def fetchcp(rower,theworkouts,table='cpdata'): # get all power data from database (plus workoutid) @@ -1504,69 +1545,12 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', if workouttype in otwtypes: res, btvalues, res2 = utils.isbreakthrough( delta, cpvalues, r.p0, r.p1, r.p2, r.p3, r.cpratio) - cprange = r.cprange - firstdate = datetime.date.today()-datetime.timedelta(days=cprange) - - workouts = Workout.objects.filter( - date__gte=firstdate, - workouttype__in=otwtypes, - user = w.user, - ) - - dd,cpcp,avgpower,workoutnames = fetchcp_new(r,workouts) - - powerdf = pd.DataFrame({ - 'Delta':dd, - 'CP':cpcp, - }) - - - 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) - - res2 = datautils.cpfit(powerdf) - if len(powerdf) != 0: - p1 = res2[0] - r.p0 = p1[0] - r.p1 = p1[1] - r.p2 = p1[2] - r.p3 = p1[3] - r.cpratio = res2[3] - r.save() + success = update_rolling_cp(r,otwtypes,'water') elif workouttype in otetypes: res, btvalues, res2 = utils.isbreakthrough( delta, cpvalues, r.ep0, r.ep1, r.ep2, r.ep3, r.ecpratio) - cprange = r.cprange - firstdate = datetime.date.today()-datetime.timedelta(days=cprange) - workouts = Workout.objects.filter( - date__gte=firstdate, - workouttype__in=otetypes, - user = w.user, - ) - dd,cpcp,avgpower,workoutnames = fetchcp_new(r,workouts) - powerdf = pd.DataFrame({ - 'Delta':dd, - 'CP':cpcp, - }) - - - 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) - res2 = datautils.cpfit(powerdf) - if len(powerdf) != 0: - res = datautils.cpfit(powerdf) - p1 = res2[0] - r.ep0 = p1[0] - r.ep1 = p1[1] - r.ep2 = p1[2] - r.ep3 = p1[3] - r.ecpratio = res2[3] - r.save() + success = update_rolling_cp(r,otetypes,'erg') else: res = 0 res2 = 0 @@ -2506,62 +2490,8 @@ def read_cols_df_sql_old(ids, columns, convertnewtons=True): return df,extracols def initiate_cp(r): - firstdate = datetime.date.today()-datetime.timedelta(days=r.cprange) - workouts = Workout.objects.filter( - date__gte=firstdate, - workouttype__in = otwtypes, - user = r, - ) - dd,cpcp,avgpower,workoutnames = fetchcp_new(r,workouts) - - powerdf = pd.DataFrame({ - 'Delta':dd, - 'CP':cpcp, - }) - - - 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) - - res2 = datautils.cpfit(powerdf) - if len(powerdf) != 0: - p1 = res2[0] - r.p0 = p1[0] - r.p1 = p1[1] - r.p2 = p1[2] - r.p3 = p1[3] - r.cpratio = res2[3] - r.save() - - workouts = Workout.objects.filter( - date__gte = firstdate, - workouttype__in = otetypes, - user = r, - ) - - dd,cpcp,avgpower,workoutnames = fetchcp_new(r,workouts) - powerdf = pd.DataFrame({ - 'Delta':dd, - 'CP':cpcp, - }) - - - 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) - res2 = datautils.cpfit(powerdf) - if len(powerdf) != 0: - res = datautils.cpfit(powerdf) - p1 = res2[0] - r.ep0 = p1[0] - r.ep1 = p1[1] - r.ep2 = p1[2] - r.ep3 = p1[3] - r.ecpratio = res2[3] - r.save() + success = update_rolling_cp(r,otwtypes,'water') + success = update_rolling_cp(r,otetypes,'erg') # Read stroke data from the DB for a Workout ID. Returns a pandas dataframe def read_df_sql(id): diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index 3ab68c22..4b83113e 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -566,60 +566,8 @@ def rower_prefs_view(request,userid=0,message=""): r.cprange = cprange r.save() messages.info(request,'Updated CP range value') - firstdate = datetime.date.today()-datetime.timedelta(days=cprange) - workouts = Workout.objects.filter( - date__gte=datetime.date.today()-datetime.timedelta(days=cprange), - workouttype__in=mytypes.otwtypes, - user = r, - ) - dd,cpcp,avgpower,workoutnames = dataprep.fetchcp_new(r,workouts) - powerdf = pd.DataFrame({ - 'Delta':dd, - 'CP':cpcp, - }) - - - 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) - - res2 = datautils.cpfit(powerdf) - if len(powerdf) != 0: - p1 = res2[0] - r.p0 = p1[0] - r.p1 = p1[1] - r.p2 = p1[2] - r.p3 = p1[3] - r.cpratio = res2[3] - r.save() - - workouts = Workout.objects.filter( - date__gte=datetime.date.today()-datetime.timedelta(days=cprange), - workouttype__in=mytypes.otetypes, - user = r, - ) - dd,cpcp,avgpower,workoutnames = dataprep.fetchcp_new(r,workouts) - powerdf = pd.DataFrame({ - 'Delta':dd, - 'CP':cpcp, - }) - - - 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) - - res2 = datautils.cpfit(powerdf) - if len(powerdf) != 0: - p1 = res2[0] - r.ep0 = p1[0] - r.ep1 = p1[1] - r.ep2 = p1[2] - r.ep3 = p1[3] - r.ecpratio = res2[3] - r.save() + success = dataprep.update_rolling_cp(r,mytypes.otwtypes,'water') + success = dataprep.update_rolling_cp(r,mytypes.otetypes,'erg') return render(request, 'rower_preferences.html', {