107 lines
3.1 KiB
Python
107 lines
3.1 KiB
Python
from django.core.exceptions import PermissionDenied
|
|
from rowers.models import C2WorldClassAgePerformance
|
|
from rowers.utils import myqueue
|
|
|
|
# The interactions with the Concept2 logbook API
|
|
# All C2 related functions should be defined here
|
|
# (There is still some stuff defined directly in views.py. Need to
|
|
# move that here.)
|
|
|
|
import datetime
|
|
from requests import Request, Session
|
|
import rowers.mytypes as mytypes
|
|
from rowers.mytypes import otwtypes
|
|
from rowers.rower_rules import is_workout_user, ispromember
|
|
from iso8601 import ParseError
|
|
import pandas as pd
|
|
import numpy
|
|
import json
|
|
from scipy import optimize
|
|
from json.decoder import JSONDecodeError
|
|
|
|
from pytz.exceptions import UnknownTimeZoneError
|
|
from rowers.utils import dologging
|
|
import numpy as np
|
|
|
|
from rowsandall_app.settings import (
|
|
C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET,
|
|
UPLOAD_SERVICE_URL, UPLOAD_SERVICE_SECRET
|
|
)
|
|
|
|
from rowers.tasks import (
|
|
handle_c2_import_stroke_data, handle_c2_sync, handle_c2_async_workout,
|
|
handle_c2_getworkout
|
|
)
|
|
import django_rq
|
|
queue = django_rq.get_queue('default')
|
|
queuelow = django_rq.get_queue('low')
|
|
queuehigh = django_rq.get_queue('high')
|
|
|
|
|
|
def getagegrouprecord(age, sex='male', weightcategory='hwt',
|
|
distance=2000, duration=None, indf=pd.DataFrame()):
|
|
|
|
if not indf.empty: # pragma: no cover
|
|
if not duration:
|
|
df = indf[indf['distance'] == distance]
|
|
else:
|
|
duration = 60*int(duration)
|
|
df = indf[indf['duration'] == duration]
|
|
else:
|
|
if not duration:
|
|
df = pd.DataFrame(
|
|
list(
|
|
C2WorldClassAgePerformance.objects.filter(
|
|
distance=distance,
|
|
sex=sex,
|
|
weightcategory=weightcategory
|
|
).values()
|
|
)
|
|
)
|
|
else:
|
|
duration = 60*int(duration)
|
|
df = pd.DataFrame(
|
|
list(
|
|
C2WorldClassAgePerformance.objects.filter(
|
|
duration=duration,
|
|
sex=sex,
|
|
weightcategory=weightcategory
|
|
).values()
|
|
)
|
|
)
|
|
|
|
if not df.empty:
|
|
ages = df['age']
|
|
powers = df['power']
|
|
|
|
def fitfunc(pars, x):
|
|
return np.abs(pars[0])*(1-x/max(120, pars[1]))-np.abs(
|
|
pars[2])*np.exp(-x/np.abs(pars[3]))+np.abs(pars[4])*(np.sin(np.pi*x/max(50, pars[5])))
|
|
|
|
def errfunc(pars, x, y):
|
|
return fitfunc(pars, x)-y
|
|
|
|
p0 = [700, 120, 700, 10, 100, 100]
|
|
|
|
p1, success = optimize.leastsq(errfunc, p0[:],
|
|
args=(ages, powers))
|
|
try:
|
|
p1, success = optimize.leastsq(errfunc, p0[:],
|
|
args=(ages, powers))
|
|
except: # pragma: no cover
|
|
p1 = p0
|
|
success = 0
|
|
|
|
if success:
|
|
power = fitfunc(p1, float(age))
|
|
|
|
power = 0.5*(np.abs(power)+power)
|
|
else: # pragma: no cover
|
|
power = 0
|
|
else:
|
|
power = 0
|
|
|
|
|
|
return power
|
|
|