updating rolling spm data
This commit is contained in:
@@ -810,7 +810,7 @@ def fetchcp_new(rower, workouts):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def update_rolling_cp(r, types, mode='water', dosend=False):
|
def update_rolling_cp(r, types, mode='water', metric='power', dosend=False):
|
||||||
firstdate = tz.now()-datetime.timedelta(days=r.cprange)
|
firstdate = tz.now()-datetime.timedelta(days=r.cprange)
|
||||||
workouts = Workout.objects.filter(
|
workouts = Workout.objects.filter(
|
||||||
date__gte=firstdate,
|
date__gte=firstdate,
|
||||||
@@ -820,10 +820,17 @@ def update_rolling_cp(r, types, mode='water', dosend=False):
|
|||||||
|
|
||||||
delta, cp, cr, avgpower, workoutnames, urls = fetchcp_new(r, workouts)
|
delta, cp, cr, avgpower, workoutnames, urls = fetchcp_new(r, workouts)
|
||||||
|
|
||||||
powerdf = pl.DataFrame({
|
if metric == 'power':
|
||||||
'Delta': delta,
|
powerdf = pl.DataFrame({
|
||||||
'CP': cp,
|
'Delta': delta,
|
||||||
})
|
'CP': cp,
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
powerdf = pl.DataFrame({
|
||||||
|
'Delta': delta,
|
||||||
|
'CP': cr,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
powerdf = powerdf.filter(pl.col("CP")>0)
|
powerdf = powerdf.filter(pl.col("CP")>0)
|
||||||
powerdf = powerdf.fill_nan(None).drop_nulls().sort(["Delta", "CP"])
|
powerdf = powerdf.fill_nan(None).drop_nulls().sort(["Delta", "CP"])
|
||||||
@@ -831,6 +838,8 @@ def update_rolling_cp(r, types, mode='water', dosend=False):
|
|||||||
|
|
||||||
if powerdf.is_empty():
|
if powerdf.is_empty():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
res2 = datautils.cpfit(powerdf)
|
res2 = datautils.cpfit(powerdf)
|
||||||
p1 = res2[0]
|
p1 = res2[0]
|
||||||
@@ -840,7 +849,7 @@ def update_rolling_cp(r, types, mode='water', dosend=False):
|
|||||||
pwr += p1[1]/(1+hourseconds/p1[3])
|
pwr += p1[1]/(1+hourseconds/p1[3])
|
||||||
|
|
||||||
if len(powerdf) != 0:
|
if len(powerdf) != 0:
|
||||||
if mode == 'water':
|
if mode == 'water' and metric == 'power':
|
||||||
r.p0 = p1[0]
|
r.p0 = p1[0]
|
||||||
r.p1 = p1[1]
|
r.p1 = p1[1]
|
||||||
r.p2 = p1[2]
|
r.p2 = p1[2]
|
||||||
@@ -849,8 +858,14 @@ def update_rolling_cp(r, types, mode='water', dosend=False):
|
|||||||
r.save()
|
r.save()
|
||||||
if dosend and pwr-5 > r.ftp*(100.-r.otwslack)/100. and r.getemailnotifications and not r.emailbounced:
|
if dosend and pwr-5 > r.ftp*(100.-r.otwslack)/100. and r.getemailnotifications and not r.emailbounced:
|
||||||
_ = myqueue(queuehigh, handle_sendemail_newftp,r,pwr,'water')
|
_ = myqueue(queuehigh, handle_sendemail_newftp,r,pwr,'water')
|
||||||
|
elif mode == 'water' and metric == 'spm':
|
||||||
else:
|
r.r0 = p1[0]
|
||||||
|
r.r1 = p1[1]
|
||||||
|
r.r2 = p1[2]
|
||||||
|
r.r3 = p1[3]
|
||||||
|
r.crratio = res2[3]
|
||||||
|
r.save()
|
||||||
|
elif mode == 'erg' and metric == 'power':
|
||||||
r.ep0 = p1[0]
|
r.ep0 = p1[0]
|
||||||
r.ep1 = p1[1]
|
r.ep1 = p1[1]
|
||||||
r.ep2 = p1[2]
|
r.ep2 = p1[2]
|
||||||
@@ -859,14 +874,23 @@ def update_rolling_cp(r, types, mode='water', dosend=False):
|
|||||||
r.save()
|
r.save()
|
||||||
if dosend and pwr-5 > r.ftp and r.getemailnotifications and not r.emailbounced:
|
if dosend and pwr-5 > r.ftp and r.getemailnotifications and not r.emailbounced:
|
||||||
_ = myqueue(queuehigh, handle_sendemail_newftp,r,pwr,'water')
|
_ = myqueue(queuehigh, handle_sendemail_newftp,r,pwr,'water')
|
||||||
|
elif mode == 'erg' and metric == 'spm':
|
||||||
|
r.er0 = p1[0]
|
||||||
|
r.er1 = p1[1]
|
||||||
|
r.er2 = p1[2]
|
||||||
|
r.er3 = p1[3]
|
||||||
|
r.ecrratio = res2[3]
|
||||||
|
r.save()
|
||||||
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def initiate_cp(r):
|
def initiate_cp(r):
|
||||||
_ = update_rolling_cp(r, otwtypes, 'water')
|
_ = update_rolling_cp(r, otwtypes, mode='water', metric='power')
|
||||||
_ = update_rolling_cp(r, otetypes, 'erg')
|
_ = update_rolling_cp(r, otetypes, mode='erg', metric='power')
|
||||||
|
_ = update_rolling_cp(r, otwtypes, mode='water', metric='spm')
|
||||||
|
_ = update_rolling_cp(r, otetypes, mode='erg', metric='spm')
|
||||||
|
|
||||||
def split_workout(r, parent, splitsecond, splitmode):
|
def split_workout(r, parent, splitsecond, splitmode):
|
||||||
data, row = getrowdata_db(id=parent.id)
|
data, row = getrowdata_db(id=parent.id)
|
||||||
@@ -1077,7 +1101,8 @@ def checkbreakthrough(w, r):
|
|||||||
try:
|
try:
|
||||||
res, btvalues, res2 = utils.isbreakthrough(
|
res, btvalues, res2 = utils.isbreakthrough(
|
||||||
delta, cpvalues, r.p0, r.p1, r.p2, r.p3, r.cpratio)
|
delta, cpvalues, r.p0, r.p1, r.p2, r.p3, r.cpratio)
|
||||||
_ = update_rolling_cp(r, otwtypes, 'water')
|
_ = update_rolling_cp(r, otwtypes, mode='water')
|
||||||
|
_ = update_rolling_cp(r, otwtypes, mode='water', metric='spm')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
res = 0
|
res = 0
|
||||||
res2 = 0
|
res2 = 0
|
||||||
@@ -1086,7 +1111,8 @@ def checkbreakthrough(w, r):
|
|||||||
try:
|
try:
|
||||||
res, btvalues, res2 = utils.isbreakthrough(
|
res, btvalues, res2 = utils.isbreakthrough(
|
||||||
delta, cpvalues, r.ep0, r.ep1, r.ep2, r.ep3, r.ecpratio)
|
delta, cpvalues, r.ep0, r.ep1, r.ep2, r.ep3, r.ecpratio)
|
||||||
_ = update_rolling_cp(r, otetypes, 'erg')
|
_ = update_rolling_cp(r, otetypes, mode='erg')
|
||||||
|
_ = update_rolling_cp(r, otetypes, mode='erg', metric='spm')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
res = 0
|
res = 0
|
||||||
res2 = 0
|
res2 = 0
|
||||||
|
|||||||
@@ -1371,9 +1371,17 @@ class AnalysisChoiceForm(forms.Form):
|
|||||||
('automatic', 'Critical Power Rolling Data')
|
('automatic', 'Critical Power Rolling Data')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
crfitchoices = (
|
||||||
|
('data', 'Fit to Selected Workouts'),
|
||||||
|
('automatic', 'Critical Stroke Rate Rolling Data')
|
||||||
|
)
|
||||||
|
|
||||||
cpfit = forms.ChoiceField(choices=cpfitchoices,
|
cpfit = forms.ChoiceField(choices=cpfitchoices,
|
||||||
label='Model Fit', initial='data', required=False)
|
label='Model Fit', initial='data', required=False)
|
||||||
|
|
||||||
|
crfit = forms.ChoiceField(choices=crfitchoices,
|
||||||
|
label='Model Fit', initial='data', required=False)
|
||||||
|
|
||||||
cpoverlay = forms.BooleanField(initial=False,
|
cpoverlay = forms.BooleanField(initial=False,
|
||||||
label='Overlay Gold Medal Performance',
|
label='Overlay Gold Medal Performance',
|
||||||
required=False)
|
required=False)
|
||||||
|
|||||||
@@ -1114,7 +1114,7 @@ class Rower(models.Model):
|
|||||||
er1 = models.FloatField(default=1.0, verbose_name="erg CR r2")
|
er1 = models.FloatField(default=1.0, verbose_name="erg CR r2")
|
||||||
er2 = models.FloatField(default=1.0, verbose_name="erg CR r3")
|
er2 = models.FloatField(default=1.0, verbose_name="erg CR r3")
|
||||||
er3 = models.FloatField(default=1.0, verbose_name="erg CR r4")
|
er3 = models.FloatField(default=1.0, verbose_name="erg CR r4")
|
||||||
ecpratio = models.FloatField(default=1.0, verbose_name="erg CP fit ratio")
|
ecrratio = models.FloatField(default=1.0, verbose_name="erg CR fit ratio")
|
||||||
|
|
||||||
cprange = models.IntegerField(default=42, verbose_name="Range for calculation of breakthrough workouts and fitness (CP)",
|
cprange = models.IntegerField(default=42, verbose_name="Range for calculation of breakthrough workouts and fitness (CP)",
|
||||||
choices=cppresets)
|
choices=cppresets)
|
||||||
|
|||||||
@@ -172,7 +172,8 @@
|
|||||||
workmax.hide();
|
workmax.hide();
|
||||||
spmmin.hide();
|
spmmin.hide();
|
||||||
spmmax.hide();
|
spmmax.hide();
|
||||||
cpfit.hide();
|
cpfit.hide();
|
||||||
|
crfit.hide();
|
||||||
cpoverlay.hide();
|
cpoverlay.hide();
|
||||||
piece.hide();
|
piece.hide();
|
||||||
trendline.hide();
|
trendline.hide();
|
||||||
|
|||||||
@@ -816,7 +816,7 @@ def cpdata(workouts, options):
|
|||||||
def crdata(workouts, options):
|
def crdata(workouts, options):
|
||||||
start = timezone.now()
|
start = timezone.now()
|
||||||
userid = options['userid']
|
userid = options['userid']
|
||||||
cpfit = options['cpfit']
|
cpfit = options['crfit']
|
||||||
cpoverlay = options['cpoverlay']
|
cpoverlay = options['cpoverlay']
|
||||||
|
|
||||||
u = User.objects.get(id=userid)
|
u = User.objects.get(id=userid)
|
||||||
|
|||||||
Reference in New Issue
Block a user