diff --git a/rowers/dataprep.py b/rowers/dataprep.py index d116dbc0..5e9c6022 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -43,6 +43,7 @@ from sqlalchemy import create_engine import sqlalchemy as sa import sys +import utils from utils import lbstoN from scipy.interpolate import griddata @@ -139,6 +140,34 @@ def filter_df(datadf,fieldname,value,largerthan=True): 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): delta = [] cpvalue = [] @@ -488,6 +517,12 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', powerperc=powerperc,powerzones=r.powerzones) 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() if dtavg < 1: @@ -643,6 +678,10 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', w.save() + # submit email task to send email about breakthrough workout + if isbreakthrough: + pass + if privacy == 'visible': ts = Team.objects.filter(rower=r) for t in ts: diff --git a/rowers/utils.py b/rowers/utils.py index 17dfffe6..7cc6c401 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -74,3 +74,12 @@ def geo_distance(lat1,lon1,lat2,lon2): bearing = math.degrees(tc1) 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