Private
Public Access
1
0

sort of gets CP data

This commit is contained in:
Sander Roosendaal
2020-10-11 17:27:39 +02:00
parent 88107530a5
commit e0f11a3c1f
4 changed files with 132 additions and 3 deletions

View File

@@ -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(

View File

@@ -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:

View File

@@ -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();

View File

@@ -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('','<p>No valid data found</p>')
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 = '<p>No ranking pieces found.</p>'
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']