Private
Public Access
1
0

updating rolling spm data

This commit is contained in:
2025-02-05 18:51:13 +01:00
parent 529cb29dd8
commit 1cb9afba6f
5 changed files with 50 additions and 15 deletions

View File

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

View File

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

View File

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

View File

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

View File

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