Private
Public Access
1
0

first attempt

This commit is contained in:
Sander Roosendaal
2018-01-16 17:04:30 +01:00
parent ed8c532884
commit dd48d66c3a
4 changed files with 87 additions and 2 deletions

View File

@@ -300,7 +300,8 @@ def getmaxwattinterval(tt,ww,i):
wmax = 0
deltat = 0
except KeyError:
pass
wmax = 0
deltat = 0
else:
wmax = 0
deltat = 0

View File

@@ -248,13 +248,15 @@ class PowerTimeFitnessMetric(models.Model):
('water','On the water')
)
data = models.DateField(default=timezone.now)
date = models.DateField(default=timezone.now)
user = models.ForeignKey(User)
PowerFourMin = models.FloatField(default=0)
PowerTwoK = models.FloatField(default=0)
PowerOneHour = models.FloatField(default=0)
workoutmode = models.CharField(default='rower',choices=modechoices,
max_length=40)
class Meta:
db_table = 'powertimefitnessmetric'
class C2WorldClassAgePerformance(models.Model):
weightcategories = (

View File

@@ -125,6 +125,8 @@ urlpatterns = [
url(r'^agegroupcp/(?P<age>\d+)/(?P<normalize>\d+)$',views.agegroupcpview),
url(r'^ajax_agegroup/(?P<age>\d+)/(?P<weightcategory>\w+.*)/(?P<sex>\w+.*)/(?P<userid>\d+)$',
views.ajax_agegrouprecords),
url(r'^updatefitness/(?P<mode>\w+.*)/(?P<days>\d+)$',views.fitness_metric_view),
url(r'^updatefitness$',views.fitness_metric_view),
url(r'^agegrouprecords/(?P<sex>\w+.*)/(?P<weightcategory>\w+.*)/(?P<distance>\d+)m$',
views.agegrouprecordview),
url(r'^agegrouprecords/(?P<sex>\w+.*)/(?P<weightcategory>\w+.*)/(?P<duration>\d+)min$',

View File

@@ -238,6 +238,7 @@ from io import BytesIO
from scipy.special import lambertw
from dataprep import timedeltaconv
from dataprep import getsmallrowdata_db
from scipy.interpolate import griddata
@@ -3206,6 +3207,85 @@ def addmanual_view(request):
{'form':form,
})
@login_required()
def fitness_metric_view(request,mode='rower',days=42):
r = getrower(request.user)
startdate = timezone.now()-datetime.timedelta(days=days)
if mode == 'rower':
workouts = Workout.objects.filter(
user=r,
workouttype__in=['rower','dynamic','slides'],
startdatetime__gte=startdate)
else:
workouts = Workout.objects.filter(
user=r,
workouttype__in=['water','coastal'],
startdatetime__gte=startdate)
theids = [int(w.id) for w in workouts]
columns = ['power','workoutid','time']
df = getsmallrowdata_db(columns,ids=theids)
df.dropna(inplace=True,axis=0)
if df.empty:
# change this
return 'aap'
# df is not empty. We continue
dfgrouped = df.groupby(['workoutid'])
maxt = 1.05*df['time'].max()/1000.
logarr = datautils.getlogarr(maxt)
delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr)
powerdf = pd.DataFrame({
'Delta':delta,
'CP':cpvalue,
})
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)
p1,fitt,fitpower,ratio = datautils.cpfit(powerdf)
# This is code duplication from datautils -- correct asap
fitfunc = lambda pars,x: abs(pars[0])/(1+(x/abs(pars[2]))) + abs(pars[1])/(1+(x/abs(pars[3])))
powerfourmin = fitfunc(p1,240.)
powerhour = fitfunc(p1,3600.)
# 2k power
velofourmin = (powerfourmin/2.8)**(1./3.)
dfourmin = 240.*velofourmin
dratio = 2000./dfourmin
pacefourmin = 500./velofourmin
# assume 5 sec per doubling drop
pace2k = pacefourmin + 5.*np.log10(dratio)/np.log10(2.)
velo2k = 500./pace2k
t2k = 2000./velo2k
pwr2k = fitfunc(p1,t2k)
velo2 = (pwr2k/2.8)**(1./3.)
if np.isnan(velo2) or velo2 <= 0:
velo2 = 1.0
t2 = 2000./velo2
pwr2k = fitfunc(p1,t2)
velo3 = (pwr2k/2.8)**(1./3.)
t3 = 2000./velo3
power2k = fitfunc(p1,t3)
print powerfourmin,power2k,powerhour
return HttpResponse("success")
# Show ranking distances including predicted paces
@login_required()
def rankings_view(request,theuser=0,