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