diff --git a/rowers/dataprep.py b/rowers/dataprep.py index f233bf13..67a82fab 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1026,30 +1026,7 @@ def fetchcp_new(rower,workouts): 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) + data.append(setcp(workout)[0]) if len(data) == 0: @@ -1064,6 +1041,35 @@ def fetchcp_new(rower,workouts): return df['delta'],df['cp'],0 +def setcp(workout): + 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') + return df,delta,cpvalues + + return pd.DataFrame(),pd.Series(),pd.Series() + + def fetchcp(rower,theworkouts,table='cpdata'): # get all power data from database (plus workoutid) theids = [int(w.id) for w in theworkouts] @@ -1482,91 +1488,72 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', isbreakthrough = False ishard = False if workouttype in rowtypes: - df = getsmallrowdata_db(['power', 'workoutid', 'time'], ids=[w.id]) - try: - powermean = df['power'].mean() - except KeyError: - powermean = 0 + cpdf,delta,cpvalues = setcp(w) + if not cpdf.empty: + 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) - if powermean != 0: - thesecs = totaltime - maxt = 1.05 * thesecs - if maxt > 0: - logarr = datautils.getlogarr(maxt) - dfgrouped = df.groupby(['workoutid']) - delta, cpvalues, avgpower = datautils.getcp(dfgrouped, logarr) - filename = 'media/cpdata_{id}.parquet.gz'.format(id=w.id) - cpdf = pd.DataFrame({ - 'delta':delta, - 'cp':cpvalues, - 'id':w.id, + workouts = Workout.objects.filter( + date__gte=firstdate, + workouttype__in=otwtypes, + ) + + dd,cpcp,avgpower = fetchcp_new(r,workouts) + + powerdf = pd.DataFrame({ + 'Delta':dd, + 'CP':cpcp, }) - cpdf.to_parquet(filename,engine='fastparquet',compression='GZIP') - - 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, - ) - - dd,cpcp,avgpower = 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) + 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() + 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() - 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, - ) - dd,cpcp,avgpower = fetchcp_new(r,workouts) - powerdf = pd.DataFrame({ - 'Delta':dd, - 'CP':cpcp, - }) + 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, + ) + dd,cpcp,avgpower = 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() + 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() else: res = 0 res2 = 0