diff --git a/rowers/dataprep.py b/rowers/dataprep.py index b76ed1a2..08d3a202 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -44,6 +44,7 @@ import sqlalchemy as sa import sys from utils import lbstoN +from scipy.interpolate import griddata import django_rq queue = django_rq.get_queue('default') @@ -138,6 +139,71 @@ def filter_df(datadf,fieldname,value,largerthan=True): return datadf +def getcp(dfgrouped,logarr): + delta = [] + cpvalue = [] + avgpower = {} + #avgpower[0] = 0 + + for id,group in dfgrouped: + tt = group['time'].copy() + ww = group['power'].copy() + + tmax = tt.max() + newlen = int(tmax/2000.) + print newlen,len(ww) + newt = np.arange(newlen)*tmax/float(newlen) + neww = griddata(tt.values, + ww.values, + newt,method='linear', + rescale=True) + + #tt = pd.Series(newt) + #ww = pd.Series(neww) + + try: + avgpower[id] = int(ww.mean()) + except ValueError: + avgpower[id] = '---' + if not np.isnan(ww.mean()): + length = len(ww) + dt = [] + cpw = [] + for i in range(length-2): + w_roll = ww.rolling(i+2).mean().dropna() + if len(w_roll): + # now goes with # data points - should be fixed seconds + indexmax = w_roll.idxmax(axis=1) + try: + t_0 = tt.ix[indexmax] + t_1 = tt.ix[indexmax-i] + deltat = 1.0e-3*(t_0-t_1) + wmax = w_roll.ix[indexmax] + if not np.isnan(deltat) and not np.isnan(wmax): + dt.append(deltat) + cpw.append(wmax) + except KeyError: + pass + + + dt = pd.Series(dt) + cpw = pd.Series(cpw) + + + cpvalues = griddata(dt.values, + cpw.values, + logarr,method='linear', + rescale=True) + + for cpv in cpvalues: + cpvalue.append(cpv) + for d in logarr: + delta.append(d) + + delta = pd.Series(delta,name='Delta') + cpvalue = pd.Series(cpvalue,name='CP') + return delta,cpvalue,avgpower + def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True, ignoreadvanced=False): # clean data remove zeros and negative values diff --git a/rowers/models.py b/rowers/models.py index 05e27344..bdde5013 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -173,6 +173,12 @@ class Rower(models.Model): # Power Zone Data ftp = models.IntegerField(default=226,verbose_name="Functional Threshold Power") + + p0 = models.FloatField(default=1.0,verbose_name="CP p1") + p1 = models.FloatField(default=1.0,verbose_name="CP p2") + p2 = models.FloatField(default=1.0,verbose_name="CP p3") + p3 = models.FloatField(default=1.0,verbose_name="CP p4") + otwslack = models.IntegerField(default=0,verbose_name="OTW Power slack") pw_ut2 = models.IntegerField(default=124,verbose_name="UT2 Power") diff --git a/rowers/views.py b/rowers/views.py index 87fdf6f0..e200a596 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -2905,7 +2905,7 @@ def otwrankings_view(request,theuser=0, maxlog10 = np.log10(maxt) - logarr = np.arange(100)*maxlog10/100. + 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) @@ -2914,56 +2914,9 @@ def otwrankings_view(request,theuser=0, - delta = [] - cpvalue = [] - avgpower = {} - dfgrouped = df.groupby(['workoutid']) - for id,group in dfgrouped: - tt = group['time'].copy() - ww = group['power'].copy() - - try: - avgpower[id] = int(ww.mean()) - except ValueError: - avgpower[id] = '---' - if not np.isnan(ww.mean()): - length = len(ww) - dt = [] - cpw = [] - for i in range(length-2): - w_roll = ww.rolling(i+2).mean().dropna() - if len(w_roll): - # now goes with # data points - should be fixed seconds - indexmax = w_roll.idxmax(axis=1) - try: - t_0 = tt.ix[indexmax] - t_1 = tt.ix[indexmax-i] - deltat = 1.0e-3*(t_0-t_1) - wmax = w_roll.ix[indexmax] - if not np.isnan(deltat) and not np.isnan(wmax): - dt.append(deltat) - cpw.append(wmax) - except KeyError: - pass - - - dt = pd.Series(dt) - cpw = pd.Series(cpw) - - - cpvalues = griddata(dt.values, - cpw.values, - logarr,method='linear', - rescale=True) - - for cpv in cpvalues: - cpvalue.append(cpv) - for d in logarr: - delta.append(d) - - delta = pd.Series(delta,name='Delta') - cpvalue = pd.Series(cpvalue,name='CP') + delta,cpvalue,avgpower = dataprep.getcp(dfgrouped,logarr) + powerdf = pd.DataFrame({ 'Delta':delta, @@ -2983,6 +2936,11 @@ def otwrankings_view(request,theuser=0, script = res[0] div = res[1] p1 = res[2] + r.p0 = p1[0] + r.p1 = p1[1] + r.p2 = p1[2] + r.p3 = p1[3] + r.save() paulslope = 1 paulintercept = 1 message = res[3]