From 0e9944044d499de696e934c5bddaff55f729bb2f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 1 Jan 2021 16:24:42 +0100 Subject: [PATCH] fitness-fit has now right algo --- rowers/interactiveplots.py | 66 +++++++++++++++++++++++++++++------ rowers/views/analysisviews.py | 8 ++--- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 4bc6cfd6..b7a9f4ac 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -25,6 +25,8 @@ import itertools from bokeh.plotting import figure, ColumnDataSource, Figure,curdoc from bokeh.models import CustomJS,Slider, TextInput,BoxAnnotation, Band +import arrow + from rowers.utils import myqueue, totaltime_sec_to_string import django_rq queue = django_rq.get_queue('default') @@ -102,6 +104,16 @@ import rowers.datautils as datautils from pandas.core.groupby.groupby import DataError +def newtestpower(x): + try: + if abs(x['testpower'] - x['testdup']) < 1: + return np.nan + except (AttributeError,TypeError): + return np.nan + + + return x['testpower'] + def build_goldmedalstandards(workouts,kfitness): dates = [] testpower = [] @@ -113,20 +125,48 @@ def build_goldmedalstandards(workouts,kfitness): goldmedalstandards = [] goldmedaldurations = [] ids = [] + workoutdt = [] for w in workouts: goldmedalstandard,goldmedalseconds = dataprep.workout_goldmedalstandard(w) ids.append(w.id) - goldmedalstandards.append(goldmedalstandard) - goldmedaldurations.append(goldmedalseconds) + if w.workouttype in mytypes.otwtypes: + goldmedalstandard = goldmedalstandard / (1.-w.user.otwslack/100.) + if goldmedalseconds > 60: + goldmedalstandards.append(goldmedalstandard) + goldmedaldurations.append(goldmedalseconds) + else: + goldmedalstandards.append(0) + goldmedaldurations.append(0) + workoutdt.append(arrow.get(w.startdatetime).datetime) df = pd.DataFrame({ 'workout':ids, + 'workoutdt': workoutdt, 'goldmedalstandard':goldmedalstandards, 'goldmedalduration':goldmedaldurations, }) + + + df.sort_values(['workoutdt'],inplace=True) + + #for id, row in df.iterrows(): + # d = row['workoutdt'] + # dd = d-datetime.timedelta(days=90) + # mask = df['workoutdt']>dd + # mask2 = df['workoutdt']<=d + # df2 = df.where(mask & mask2) + # powertest = df2['goldmedalstandard'].max() + # idx = df2['goldmedalstandard'].argmax() + # durationtest = df2['goldmedalduration'].values[idx] + # dates.append(d) + # testpower.append(powertest) + # testduration.append(durationtest) + # fatigues.append(np.nan) + # fitnesses.append(np.nan) + for w in workouts: - ids = [w.id for w in workouts.filter(date__gte=w.date-datetime.timedelta(days=kfitness), + ids = [w.id for w in workouts.filter(date__gte=w.date-datetime.timedelta(days=90), date__lte=w.date)] powerdf = df[df['workout'].isin(ids)] @@ -134,9 +174,14 @@ def build_goldmedalstandards(workouts,kfitness): powertest = powerdf['goldmedalstandard'].max() durationtest = powerdf.loc[indexmax,'goldmedalduration'] - dates.append(datetime.datetime.combine(w.date,datetime.datetime.min.time())) - testpower.append(powertest) - testduration.append(durationtest) + + dates.append(arrow.get(w.date).datetime) + if powertest > 0: + testpower.append(powertest) + testduration.append(durationtest) + else: + testpower.append(np.nan) + testduration.append(np.nan) fatigues.append(np.nan) fitnesses.append(np.nan) @@ -156,7 +201,7 @@ def get_testpower(workouts,fitnesstestsecs,kfitness): try: df = pd.read_parquet(cpfile) df['workout'] = w.id - df['workoutdate'] = w.date.strftime('%d-%m-%Y') + df['workoutdate'] = arrow.get(w.date.strftime('%d-%m-%Y')).datetime data.append(df) except: strokesdf = dataprep.getsmallrowdata_db(['power','workoutid','time'],ids=[w.id]) @@ -203,7 +248,7 @@ def get_testpower(workouts,fitnesstestsecs,kfitness): - dates.append(datetime.datetime.combine(w.date,datetime.datetime.min.time())) + dates.append(arrow.get(w.date).datetime) testpower.append(powertest) testduration.append(fitnesstestsecs) fatigues.append(np.nan) @@ -1710,7 +1755,7 @@ def getfatigues( fatigues.append(fatigue) fitnesses.append(fitness) - dates.append(datetime.datetime.combine(date,datetime.datetime.min.time())) + dates.append(arrow.get(date).datetime) testpower.append(np.nan) testduration.append(np.nan) @@ -1978,8 +2023,7 @@ def fitnessfit_chart(workouts,user,workoutmode='water',startdate=None, df['testdup'] = df['testpower'].shift(1) - df['testpower'] = df.apply(lambda x: np.nan if abs(x['testpower'] - x['testdup']) < 1 \ - else x['testpower'],axis=1) + df['testpower'] = df.apply(lambda x: newtestpower(x),axis=1) try: df['testpower'].iloc[-1] = df['testdup'].iloc[-1] diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 07e5e71c..e601d3fe 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -1678,13 +1678,9 @@ def fitness_from_cp_view(request,userid=0,mode='rower', workouts = Workout.objects.filter(user=therower,date__gte=startdate, date__lte=enddate, - workouttype__in=mytypes.otwtypes, + workouttype__in=mytypes.rowtypes, duplicate=False) - if mode == 'rower': - workouts = Workout.objects.filter(user=therower,date__gte=startdate, - date__lte=enddate,workouttype__in=mytypes.otetypes, - duplicate=False) - + script,thediv = fitnessfit_chart(