Private
Public Access
1
0
Files
rowsandall/rowers/c2stuff.py
2025-10-24 12:13:30 +02:00

106 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.)
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,
)
from rowers.tasks import (
handle_c2_import_stroke_data, handle_c2_sync,
)
from rowers.upload_tasks import 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