Private
Public Access
1
0
Files
rowsandall/rowers/c2stuff.py
Sander Roosendaal 2981c59a5d first attempt on c2
2023-02-10 16:55:47 +01:00

104 lines
3.0 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.)
from rowers.imports import *
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 numpy
import json
from scipy import optimize
from json.decoder import JSONDecodeError
from pytz.exceptions import UnknownTimeZoneError
from rowers.utils import dologging
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]
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