110 lines
2.9 KiB
Python
110 lines
2.9 KiB
Python
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
|