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