Merge branch 'bugfix/mikesbreakthrough' into develop
This commit is contained in:
@@ -425,13 +425,6 @@ 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 = 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()
|
dtavg = row.df['TimeStamp (sec)'].diff().mean()
|
||||||
|
|
||||||
@@ -590,6 +583,21 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower',
|
|||||||
|
|
||||||
w.save()
|
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
|
# submit email task to send email about breakthrough workout
|
||||||
if isbreakthrough:
|
if isbreakthrough:
|
||||||
a_messages.info(r.user,'It looks like you have a new breakthrough workout')
|
a_messages.info(r.user,'It looks like you have a new breakthrough workout')
|
||||||
|
|||||||
@@ -463,35 +463,14 @@ def testdata(time,distance,pace,spm):
|
|||||||
|
|
||||||
|
|
||||||
def getsmallrowdata_db(columns,ids=[]):
|
def getsmallrowdata_db(columns,ids=[]):
|
||||||
prepmultipledata(ids)
|
|
||||||
data = read_cols_df_sql(ids,columns)
|
data = read_cols_df_sql(ids,columns)
|
||||||
|
|
||||||
return data
|
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):
|
def read_cols_df_sql(ids,columns,debug=True):
|
||||||
columns = list(columns)+['distance','spm']
|
columns = list(columns)+['distance','spm']
|
||||||
columns = [x for x in columns if x != 'None']
|
columns = [x for x in columns if x != 'None']
|
||||||
|
|||||||
@@ -118,6 +118,8 @@ def getcp(dfgrouped,logarr):
|
|||||||
ww = group['power'].copy()
|
ww = group['power'].copy()
|
||||||
|
|
||||||
tmax = tt.max()
|
tmax = tt.max()
|
||||||
|
|
||||||
|
|
||||||
if tmax > 500000:
|
if tmax > 500000:
|
||||||
newlen = int(tmax/2000.)
|
newlen = int(tmax/2000.)
|
||||||
else:
|
else:
|
||||||
@@ -143,6 +145,7 @@ def getcp(dfgrouped,logarr):
|
|||||||
cpw = []
|
cpw = []
|
||||||
for i in xrange(length-2):
|
for i in xrange(length-2):
|
||||||
deltat,wmax = getmaxwattinterval(tt,ww,i)
|
deltat,wmax = getmaxwattinterval(tt,ww,i)
|
||||||
|
|
||||||
if not np.isnan(deltat) and not np.isnan(wmax):
|
if not np.isnan(deltat) and not np.isnan(wmax):
|
||||||
dt.append(deltat)
|
dt.append(deltat)
|
||||||
cpw.append(wmax)
|
cpw.append(wmax)
|
||||||
@@ -164,6 +167,18 @@ def getcp(dfgrouped,logarr):
|
|||||||
|
|
||||||
delta = pd.Series(delta,name='Delta')
|
delta = pd.Series(delta,name='Delta')
|
||||||
cpvalue = pd.Series(cpvalue,name='CP')
|
cpvalue = pd.Series(cpvalue,name='CP')
|
||||||
|
|
||||||
|
|
||||||
|
cpdf = pd.DataFrame({
|
||||||
|
'delta':delta,
|
||||||
|
'cpvalue':cpvalue
|
||||||
|
})
|
||||||
|
|
||||||
|
cpdf.dropna(axis=0, how='any',inplace=True)
|
||||||
|
|
||||||
|
delta = cpdf['delta']
|
||||||
|
cpvalue = cpdf['cpvalue']
|
||||||
|
|
||||||
return delta,cpvalue,avgpower
|
return delta,cpvalue,avgpower
|
||||||
|
|
||||||
def getmaxwattinterval(tt,ww,i):
|
def getmaxwattinterval(tt,ww,i):
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ from utils import serialize_list,deserialize_list
|
|||||||
|
|
||||||
from rowers.dataprepnodjango import update_strokedata
|
from rowers.dataprepnodjango import update_strokedata
|
||||||
from rowers.dataprepnodjango import new_workout_from_file
|
from rowers.dataprepnodjango import new_workout_from_file
|
||||||
|
from rowers.dataprepnodjango import getsmallrowdata_db
|
||||||
|
|
||||||
from django.core.mail import send_mail, BadHeaderError,EmailMessage
|
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)
|
rowdata.write_csv(f1,gzip=True)
|
||||||
update_strokedata(workoutid,rowdata.df,debug=debug)
|
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)
|
res,btvalues = utils.isbreakthrough(delta,cpvalues,ps[0],ps[1],ps[2],ps[3],ratio)
|
||||||
if res:
|
if res:
|
||||||
handle_sendemail_breakthrough(workoutid,email,
|
handle_sendemail_breakthrough(workoutid,email,
|
||||||
|
|||||||
@@ -100,6 +100,7 @@
|
|||||||
{% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %}
|
{% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %}
|
||||||
<a class="button blue small" href="/rowers/team-compare-select/team/0/">Multi Compare</a>
|
<a class="button blue small" href="/rowers/team-compare-select/team/0/">Multi Compare</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
<a class="button blue small" href="/rowers/promembership">Multi Compare</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
@@ -77,11 +77,14 @@ def geo_distance(lat1,lon1,lat2,lon2):
|
|||||||
|
|
||||||
|
|
||||||
def isbreakthrough(delta,cpvalues,p0,p1,p2,p3,ratio):
|
def isbreakthrough(delta,cpvalues,p0,p1,p2,p3,ratio):
|
||||||
pwr = p0/(1+delta/p2)
|
pwr = abs(p0)/(1+(delta/abs(p2)))
|
||||||
pwr += p1/(1+delta/p3)
|
pwr += abs(p1)/(1+(delta/abs(p3)))
|
||||||
|
|
||||||
pwr *= ratio
|
pwr *= ratio
|
||||||
|
|
||||||
|
delta = delta.values
|
||||||
|
cpvalues = cpvalues.values
|
||||||
|
|
||||||
res = np.sum(cpvalues>pwr)
|
res = np.sum(cpvalues>pwr)
|
||||||
|
|
||||||
btdf = pd.DataFrame(
|
btdf = pd.DataFrame(
|
||||||
@@ -92,6 +95,7 @@ def isbreakthrough(delta,cpvalues,p0,p1,p2,p3,ratio):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
btdf.sort_values('delta',axis=0,inplace=True)
|
btdf.sort_values('delta',axis=0,inplace=True)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2926,7 +2926,7 @@ def otwrankings_view(request,theuser=0,
|
|||||||
|
|
||||||
|
|
||||||
if len(thesecs) != 0:
|
if len(thesecs) != 0:
|
||||||
maxt = 2*pd.Series(thesecs).max()
|
maxt = 1.05*pd.Series(thesecs).max()
|
||||||
else:
|
else:
|
||||||
maxt = 1000.
|
maxt = 1000.
|
||||||
|
|
||||||
@@ -2936,13 +2936,13 @@ def otwrankings_view(request,theuser=0,
|
|||||||
dfgrouped = df.groupby(['workoutid'])
|
dfgrouped = df.groupby(['workoutid'])
|
||||||
delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr)
|
delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr)
|
||||||
|
|
||||||
|
|
||||||
powerdf = pd.DataFrame({
|
powerdf = pd.DataFrame({
|
||||||
'Delta':delta,
|
'Delta':delta,
|
||||||
'CP':cpvalue,
|
'CP':cpvalue,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
powerdf = powerdf[powerdf['CP']>0]
|
powerdf = powerdf[powerdf['CP']>0]
|
||||||
powerdf.dropna(axis=0,inplace=True)
|
powerdf.dropna(axis=0,inplace=True)
|
||||||
powerdf.sort_values(['Delta','CP'],ascending=[1,0],inplace=True)
|
powerdf.sort_values(['Delta','CP'],ascending=[1,0],inplace=True)
|
||||||
|
|||||||
BIN
rowsanda_107501
BIN
rowsanda_107501
Binary file not shown.
Reference in New Issue
Block a user