from rowers.models import Workout, User, Rower from rowingdata import rowingdata as rrdata from rowingdata import rower as rrower from rowingdata import main as rmain from pandas import DataFrame,Series import pandas as pd import numpy as np from scipy.signal import savgol_filter import datetime def niceformat(values): out = [] for v in values: formattedv = strfdelta(v) out.append(formattedv) return out def strfdelta(tdelta): try: minutes,seconds = divmod(tdelta.seconds,60) tenths = int(tdelta.microseconds/1e5) except AttributeError: minutes,seconds = divmod(tdelta.view(np.int64),60e9) seconds,rest = divmod(seconds,1e9) tenths = int(rest/1e8) res = "{minutes:0>2}:{seconds:0>2}.{tenths:0>1}".format( minutes=minutes, seconds=seconds, tenths=tenths, ) return res def nicepaceformat(values): out = [] for v in values: formattedv = strfdelta(v) out.append(formattedv) return out def timedeltaconv(x): dt = datetime.timedelta(seconds=x) return dt def rdata(file,rower=rrower()): try: res = rrdata(file,rower=rower) except IOError: res = 0 return res def getrowdata(id=0): # check if valid ID exists (workout exists) row = Workout.objects.get(id=id) f1 = row.csvfilename # get user r = row.user u = r.user rr = rrower(hrmax=r.max,hrut2=r.ut2, hrut1=r.ut1,hrat=r.at, hrtr=r.tr,hran=r.an) rowdata = rdata(f1,rower=rr) return rowdata,row def dataprep(rowdatadf): rowdatadf.set_index([range(len(rowdatadf))],inplace=True) t = rowdatadf.ix[:,'TimeStamp (sec)'] t = pd.Series(t-rowdatadf.ix[0,'TimeStamp (sec)']) row_index = rowdatadf.ix[:,' Stroke500mPace (sec/500m)'] > 3000 rowdatadf.loc[row_index,' Stroke500mPace (sec/500m)'] = 3000. p = rowdatadf.ix[:,' Stroke500mPace (sec/500m)'] hr = rowdatadf.ix[:,' HRCur (bpm)'] spm = rowdatadf.ix[:,' Cadence (stokes/min)'] cumdist = rowdatadf.ix[:,'cum_dist'] power = rowdatadf.ix[:,' Power (watts)'] averageforce = rowdatadf.ix[:,' AverageDriveForce (lbs)'] drivelength = rowdatadf.ix[:,' DriveLength (meters)'] peakforce = rowdatadf.ix[:,' PeakDriveForce (lbs)'] f = rowdatadf['TimeStamp (sec)'].diff().mean() windowsize = 2*(int(10./(f)))+1 if windowsize <= 3: windowsize = 5 if windowsize > 3: spm = savgol_filter(spm,windowsize,3) hr = savgol_filter(hr,windowsize,3) drivelength = savgol_filter(drivelength,windowsize,3) t2 = t.fillna(method='ffill').apply(lambda x: timedeltaconv(x)) p2 = p.fillna(method='ffill').apply(lambda x: timedeltaconv(x)) drivespeed = drivelength/rowdatadf[' DriveTime (ms)']*1.0e3 driveenergy = drivelength*averageforce*4.44822 distance = rowdatadf.ix[:,'cum_dist'] data = DataFrame( dict( time = t2, timesecs = t, hr = hr, pace = p2, pseconds=p, spm = spm, cumdist = cumdist, ftime = niceformat(t2), fpace = nicepaceformat(p2), driveenergy=driveenergy, power=power, averageforce=averageforce, drivelength=drivelength, peakforce=peakforce, distance=distance, drivespeed=drivespeed ) ) return data