first test on breakthrough workouts (only on upload)
This commit is contained in:
@@ -43,6 +43,7 @@ from sqlalchemy import create_engine
|
|||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
import utils
|
||||||
from utils import lbstoN
|
from utils import lbstoN
|
||||||
from scipy.interpolate import griddata
|
from scipy.interpolate import griddata
|
||||||
|
|
||||||
@@ -139,6 +140,34 @@ def filter_df(datadf,fieldname,value,largerthan=True):
|
|||||||
|
|
||||||
return datadf
|
return datadf
|
||||||
|
|
||||||
|
def getsinglecp(df):
|
||||||
|
thesecs = df['TimeStamp (sec)'].max()-df['TimeStamp (sec)'].min()
|
||||||
|
if thesecs != 0:
|
||||||
|
maxt = 2*thesecs
|
||||||
|
else:
|
||||||
|
maxt = 1000.
|
||||||
|
|
||||||
|
maxlog10 = np.log10(maxt)
|
||||||
|
logarr = np.arange(50)*maxlog10/50.
|
||||||
|
logarr = [int(10.**(la)) for la in logarr]
|
||||||
|
logarr = pd.Series(logarr)
|
||||||
|
logarr.drop_duplicates(keep='first',inplace=True)
|
||||||
|
|
||||||
|
logarr = logarr.values
|
||||||
|
|
||||||
|
|
||||||
|
dfnew = pd.DataFrame({
|
||||||
|
'time':df['TimeStamp (sec)']-df.ix[0,'TimeStamp (sec)'],
|
||||||
|
'power':df[' Power (watts)']
|
||||||
|
})
|
||||||
|
|
||||||
|
dfnew['workoutid'] = 0
|
||||||
|
|
||||||
|
dfgrouped = dfnew.groupby(['workoutid'])
|
||||||
|
delta,cpvalue,avgpower = getcp(dfgrouped,logarr)
|
||||||
|
|
||||||
|
return delta,cpvalue,avgpower
|
||||||
|
|
||||||
def getcp(dfgrouped,logarr):
|
def getcp(dfgrouped,logarr):
|
||||||
delta = []
|
delta = []
|
||||||
cpvalue = []
|
cpvalue = []
|
||||||
@@ -488,6 +517,12 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower',
|
|||||||
powerperc=powerperc,powerzones=r.powerzones)
|
powerperc=powerperc,powerzones=r.powerzones)
|
||||||
row = rdata(f2,rower=rr)
|
row = rdata(f2,rower=rr)
|
||||||
|
|
||||||
|
isbreakthrough = False
|
||||||
|
if workouttype == 'water':
|
||||||
|
delta,cpvalues,avgpower = getsinglecp(row.df)
|
||||||
|
if utils.isbreakthrough(delta,cpvalues,r.p0,r.p1,r.p2,r.p3):
|
||||||
|
isbreakthrough = True
|
||||||
|
|
||||||
dtavg = row.df['TimeStamp (sec)'].diff().mean()
|
dtavg = row.df['TimeStamp (sec)'].diff().mean()
|
||||||
|
|
||||||
if dtavg < 1:
|
if dtavg < 1:
|
||||||
@@ -643,6 +678,10 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower',
|
|||||||
|
|
||||||
w.save()
|
w.save()
|
||||||
|
|
||||||
|
# submit email task to send email about breakthrough workout
|
||||||
|
if isbreakthrough:
|
||||||
|
pass
|
||||||
|
|
||||||
if privacy == 'visible':
|
if privacy == 'visible':
|
||||||
ts = Team.objects.filter(rower=r)
|
ts = Team.objects.filter(rower=r)
|
||||||
for t in ts:
|
for t in ts:
|
||||||
|
|||||||
@@ -74,3 +74,12 @@ def geo_distance(lat1,lon1,lat2,lon2):
|
|||||||
bearing = math.degrees(tc1)
|
bearing = math.degrees(tc1)
|
||||||
|
|
||||||
return [distance,bearing]
|
return [distance,bearing]
|
||||||
|
|
||||||
|
|
||||||
|
def isbreakthrough(delta,cpvalues,p0,p1,p2,p3):
|
||||||
|
pwr = p0/(1+delta/p2)
|
||||||
|
pwr += p1/(1+delta/p3)
|
||||||
|
|
||||||
|
res = np.sum(cpvalues>pwr)
|
||||||
|
|
||||||
|
return res>1
|
||||||
|
|||||||
Reference in New Issue
Block a user