import pandas as pd import numpy as np from scipy.interpolate import griddata 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':1000*(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 = [] avgpower = {} #avgpower[0] = 0 for id,group in dfgrouped: tt = group['time'].copy() ww = group['power'].copy() tmax = tt.max() if tmax > 500000: newlen = int(tmax/5000.) else: newlen = len(tt) if newlen < len(tt): newt = np.arange(newlen)*tmax/float(newlen) ww = griddata(tt.values, ww.values, newt,method='linear', rescale=True) tt = pd.Series(newt) ww = pd.Series(ww) try: avgpower[id] = int(ww.mean()) except ValueError: avgpower[id] = '---' if not np.isnan(ww.mean()): length = len(ww) dt = [] 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) dt = pd.Series(dt) cpw = pd.Series(cpw) if len(dt): 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 getmaxwattinterval(tt,ww,i): 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] except KeyError: pass else: wmax = 0 deltat = 0 return deltat,wmax