diff --git a/rowers/dataprep.py b/rowers/dataprep.py index a68e288e..3b807d55 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -425,13 +425,6 @@ 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 = datautils.getsinglecp(row.df) - res,btvalues = utils.isbreakthrough(delta,cpvalues,r.p0,r.p1,r.p2,r.p3,r.cpratio) - if res: - isbreakthrough = True - res = datautils.updatecp(delta,cpvalues,r) dtavg = row.df['TimeStamp (sec)'].diff().mean() @@ -590,6 +583,21 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', w.save() + isbreakthrough = False + if workouttype == 'water': + df = getsmallrowdata_db(['power','workoutid','time'],ids=[w.id]) + # delta,cpvalues,avgpower = datautils.getsinglecp(row.df) + thesecs = totaltime + maxt = 1.05*thesecs + logarr = datautils.getlogarr(maxt) + dfgrouped = df.groupby(['workoutid']) + delta,cpvalues,avgpower = datautils.getcp(dfgrouped,logarr) + + res,btvalues = utils.isbreakthrough(delta,cpvalues,r.p0,r.p1,r.p2,r.p3,r.cpratio) + if res: + isbreakthrough = True + res = datautils.updatecp(delta,cpvalues,r) + # submit email task to send email about breakthrough workout if isbreakthrough: a_messages.info(r.user,'It looks like you have a new breakthrough workout') diff --git a/rowers/dataprepnodjango.py b/rowers/dataprepnodjango.py index 78d3903b..27cb5db7 100644 --- a/rowers/dataprepnodjango.py +++ b/rowers/dataprepnodjango.py @@ -463,35 +463,14 @@ def testdata(time,distance,pace,spm): def getsmallrowdata_db(columns,ids=[]): - prepmultipledata(ids) + data = read_cols_df_sql(ids,columns) return data -def prepmultipledata(ids,verbose=False,debug=True): - query = sa.text('SELECT DISTINCT workoutid FROM strokedata') - if debug: - engine = create_engine(database_url_debug, echo=False) - else: - engine = create_engine(database_url, echo=False) - with engine.connect() as conn, conn.begin(): - res = conn.execute(query) - res = list(itertools.chain.from_iterable(res.fetchall())) - conn.close() - engine.dispose() - - res = list(set(ids)-set(res)) - for id in res: - rowdata,row = getrowdata(id=id) - if verbose: - print id - if rowdata: - data = dataprep(rowdata.df,id=id,bands=True,barchart=True,otwpower=True) - return res - def read_cols_df_sql(ids,columns,debug=True): columns = list(columns)+['distance','spm'] columns = [x for x in columns if x != 'None'] diff --git a/rowers/datautils.py b/rowers/datautils.py index bdc5ac2f..f01aac3b 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -118,6 +118,8 @@ def getcp(dfgrouped,logarr): ww = group['power'].copy() tmax = tt.max() + + if tmax > 500000: newlen = int(tmax/2000.) else: @@ -143,6 +145,7 @@ def getcp(dfgrouped,logarr): cpw = [] for i in xrange(length-2): deltat,wmax = getmaxwattinterval(tt,ww,i) + if not np.isnan(deltat) and not np.isnan(wmax): dt.append(deltat) cpw.append(wmax) @@ -165,6 +168,7 @@ def getcp(dfgrouped,logarr): delta = pd.Series(delta,name='Delta') cpvalue = pd.Series(cpvalue,name='CP') + cpdf = pd.DataFrame({ 'delta':delta, 'cpvalue':cpvalue diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index b1c7bada..e8b5ec77 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -621,7 +621,7 @@ def interactive_otwcpchart(powerdf,promember=0): thesecs = powerdf['Delta'] theavpower = powerdf['CP'] - + p1,fitt,fitpower,ratio = datautils.cpfit(powerdf) message = "" diff --git a/rowers/tasks.py b/rowers/tasks.py index 9b98a4e8..8960a03b 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -26,6 +26,7 @@ from utils import serialize_list,deserialize_list from rowers.dataprepnodjango import update_strokedata from rowers.dataprepnodjango import new_workout_from_file +from rowers.dataprepnodjango import getsmallrowdata_db from django.core.mail import send_mail, BadHeaderError,EmailMessage @@ -245,7 +246,20 @@ def handle_otwsetpower(f1,boattype,weightvalue, rowdata.write_csv(f1,gzip=True) update_strokedata(workoutid,rowdata.df,debug=debug) - delta,cpvalues,avgpower = datautils.getsinglecp(rowdata.df) + totaltime = rowdata.df['TimeStamp (sec)'].max()-rowdata.df['TimeStamp (sec)'].min() + try: + totaltime = totaltime+rowdata.df.ix[0,' ElapsedTime (sec)'] + except KeyError: + pass + df = getsmallrowdata_db(['power','workoutid','time'],ids=[workoutid]) + thesecs = totaltime + maxt = 1.05*thesecs + logarr = datautils.getlogarr(maxt) + dfgrouped = df.groupby(['workoutid']) + delta,cpvalues,avgpower = datautils.getcp(dfgrouped,logarr) + + + #delta,cpvalues,avgpower = datautils.getsinglecp(rowdata.df) res,btvalues = utils.isbreakthrough(delta,cpvalues,ps[0],ps[1],ps[2],ps[3],ratio) if res: handle_sendemail_breakthrough(workoutid,email, diff --git a/rowers/views.py b/rowers/views.py index 61be6723..2fd23e94 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -2930,18 +2930,18 @@ def otwrankings_view(request,theuser=0, else: maxt = 1000. - + logarr = datautils.getlogarr(maxt) - + dfgrouped = df.groupby(['workoutid']) delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr) - powerdf = pd.DataFrame({ 'Delta':delta, 'CP':cpvalue, }) + powerdf = powerdf[powerdf['CP']>0] powerdf.dropna(axis=0,inplace=True) diff --git a/rowsanda_107501 b/rowsanda_107501 index 75fae41c..6ce7c3ea 100644 Binary files a/rowsanda_107501 and b/rowsanda_107501 differ