using async job to calculate predicted age records and store in db
This commit is contained in:
@@ -6,6 +6,8 @@ import gzip
|
||||
import shutil
|
||||
import numpy as np
|
||||
|
||||
from scipy import optimize
|
||||
|
||||
import rowingdata
|
||||
|
||||
from rowingdata import rowingdata as rdata
|
||||
@@ -28,7 +30,8 @@ from utils import deserialize_list
|
||||
|
||||
from rowers.dataprepnodjango import (
|
||||
update_strokedata, new_workout_from_file,
|
||||
getsmallrowdata_db, updatecpdata_sql
|
||||
getsmallrowdata_db, updatecpdata_sql,
|
||||
update_agegroup_db,
|
||||
)
|
||||
|
||||
from django.core.mail import send_mail, EmailMessage
|
||||
@@ -46,6 +49,96 @@ import longtask
|
||||
def add(x, y):
|
||||
return x + y
|
||||
|
||||
def getagegrouprecord(age,sex='male',weightcategory='hwt',
|
||||
distance=2000,duration=None,indf=pd.DataFrame()):
|
||||
|
||||
if not duration:
|
||||
df = indf[indf['distance'] == distance]
|
||||
else:
|
||||
duration = 60*int(duration)
|
||||
df = indf[indf['duration'] == duration]
|
||||
|
||||
if not df.empty:
|
||||
ages = df['age']
|
||||
powers = df['power']
|
||||
|
||||
#poly_coefficients = np.polyfit(ages,powers,6)
|
||||
fitfunc = lambda pars, x: 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])))
|
||||
errfunc = lambda pars, x,y: fitfunc(pars,x)-y
|
||||
|
||||
p0 = [700,120,700,10,100,100]
|
||||
|
||||
p1, success = optimize.leastsq(errfunc,p0[:],
|
||||
args = (ages,powers))
|
||||
|
||||
if success:
|
||||
power = fitfunc(p1, float(age))
|
||||
|
||||
#power = np.polyval(poly_coefficients,age)
|
||||
|
||||
power = 0.5*(np.abs(power)+power)
|
||||
else:
|
||||
power = 0
|
||||
else:
|
||||
power = 0
|
||||
|
||||
return power
|
||||
|
||||
|
||||
@app.task(bind=True)
|
||||
def handle_getagegrouprecords(self,
|
||||
df,
|
||||
distances,durations,
|
||||
age,sex,weightcategory,
|
||||
**kwargs):
|
||||
wcdurations = []
|
||||
wcpower = []
|
||||
|
||||
if 'debug' in kwargs:
|
||||
debug = kwargs['debug']
|
||||
else:
|
||||
debug = False
|
||||
|
||||
|
||||
df = pd.read_json(df)
|
||||
|
||||
for distance in distances:
|
||||
worldclasspower = getagegrouprecord(
|
||||
age,
|
||||
sex=sex,
|
||||
distance=distance,
|
||||
weightcategory=weightcategory,indf=df,
|
||||
)
|
||||
velo = (worldclasspower/2.8)**(1./3.)
|
||||
try:
|
||||
duration = distance/velo
|
||||
wcdurations.append(duration)
|
||||
wcpower.append(worldclasspower)
|
||||
except ZeroDivisionError:
|
||||
pass
|
||||
|
||||
|
||||
|
||||
for duration in durations:
|
||||
worldclasspower = getagegrouprecord(
|
||||
age,
|
||||
sex=sex,
|
||||
duration=duration,
|
||||
weightcategory=weightcategory,indf=df
|
||||
)
|
||||
try:
|
||||
velo = (worldclasspower/2.8)**(1./3.)
|
||||
distance = int(60*duration*velo)
|
||||
wcdurations.append(60.*duration)
|
||||
wcpower.append(worldclasspower)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
update_agegroup_db(age,sex,weightcategory,wcdurations,wcpower,
|
||||
debug=debug)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@app.task(bind=True)
|
||||
def long_test_task(self,aantal,debug=False,job=None,session_key=None):
|
||||
|
||||
Reference in New Issue
Block a user