diff --git a/rowers/dataprep.py b/rowers/dataprep.py index d935e5c7..46fe140e 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1508,6 +1508,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', workouts = Workout.objects.filter( date__gte=firstdate, workouttype__in=otwtypes, + user = w.user, ) dd,cpcp,avgpower,workoutnames = fetchcp_new(r,workouts) @@ -1541,6 +1542,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', workouts = Workout.objects.filter( date__gte=firstdate, workouttype__in=otetypes, + user = w.user, ) dd,cpcp,avgpower,workoutnames = fetchcp_new(r,workouts) powerdf = pd.DataFrame({ @@ -2501,8 +2503,65 @@ def read_cols_df_sql_old(ids, columns, convertnewtons=True): engine.dispose() return df,extracols -# Read stroke data from the DB for a Workout ID. Returns a pandas dataframe +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() + +# Read stroke data from the DB for a Workout ID. Returns a pandas dataframe def read_df_sql(id): try: f = 'media/strokedata_{id}.parquet.gz'.format(id=id) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 46fa5e78..f58e5601 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2882,7 +2882,7 @@ def interactive_agegroupcpchart(age,normalized=False): def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data', - title=''): + title='',type='water'): powerdf = powerdf[~(powerdf == 0).any(axis=1)] # plot tools if (promember==1): @@ -2910,8 +2910,12 @@ def interactive_otwcpchart(powerdf,promember=0,rowername="",r=None,cpfit='data', p1,fitt,fitpower,ratio = datautils.cpfit(powerdf) if cpfit == 'automatic' and r is not None: - p1 = [r.p0,r.p1,r.p2,r.p3] - ratio = r.cpratio + if type == 'water': + p1 = [r.p0,r.p1,r.p2,r.p3] + ratio = r.cpratio + else: + p1 = [r.ep0,r.ep1,r.ep2,r.ep3] + ratio = r.ecpratio fitfunc = lambda pars,x: abs(pars[0])/(1+(x/abs(pars[2]))) + abs(pars[1])/(1+(x/abs(pars[3]))) fitpower = fitfunc(p1,fitt) diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index ad3a1125..b29ff093 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -547,8 +547,11 @@ def cpdata(workouts, options): d1 = datefirst, d2 = datelast, ) + wtype = 'water' + if workouts[0].workouttype in otetypes: + wtype = 'erg' res = interactive_otwcpchart(powerdf,promember=True,rowername=rowername,r=r, - cpfit=cpfit,title=title) + cpfit=cpfit,title=title,type=wtype) script = res[0] div = res[1] p1 = res[2]