From 8d9a8b0d2b9e22e968966e3edb7e59e1878df0c5 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 11 Feb 2017 15:51:42 +0100 Subject: [PATCH] Web Import now uses dataprep --- rowers/dataprep.py | 213 ++++++++++++++++++++++++--------------------- rowers/views.py | 208 +++++++++++++------------------------------ 2 files changed, 176 insertions(+), 245 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 906b66fe..9b52d54c 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -217,6 +217,116 @@ def timedeltaconv(x): return dt +# Processes painsled CSV file to database +def save_workout_database(f2,r,dosmooth=True,workouttype='rower', + dosummary=True,title='Workout', + notes='',totaldist=0,totaltime=0): + message = None + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + # make workout and put in database + rr = rrower(hrmax=r.max,hrut2=r.ut2, + hrut1=r.ut1,hrat=r.at, + hrtr=r.tr,hran=r.an,ftp=r.ftp, + powerperc=powerperc,powerzones=r.powerzones) + row = rdata(f2,rower=rr) + if row == 0: + return (0,'Error: CSV data file not found') + + if dosmooth: + # auto smoothing + pace = row.df[' Stroke500mPace (sec/500m)'].values + velo = 500./pace + + f = row.df['TimeStamp (sec)'].diff().mean() + windowsize = 2*(int(10./(f)))+1 + if not 'originalvelo' in row.df: + row.df['originalvelo'] = velo + + if windowsize > 3 and windowsize23: + message = 'Warning: The workout duration was longer than 23 hours' + hours = 23 + + minutes = int((totaltime - 3600.*hours)/60.) + seconds = int(totaltime - 3600.*hours - 60.*minutes) + tenths = int(10*(totaltime - 3600.*hours - 60.*minutes - seconds)) + duration = "%s:%s:%s.%s" % (hours,minutes,seconds,tenths) + + if dosummary: + summary = row.summary() + summary += '\n' + summary += row.intervalstats() + + workoutdate = row.rowdatetime.strftime('%Y-%m-%d') + workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') + workoutstartdatetime = thetimezone.localize(row.rowdatetime).astimezone(utc) + + # check for duplicate start times + ws = Workout.objects.filter(starttime=workoutstarttime, + user=r) + if (len(ws) != 0): + message = "Warning: This workout probably already exists in the database" + + w = Workout(user=r,name=title,date=workoutdate, + workouttype=workouttype, + duration=duration,distance=totaldist, + weightcategory=r.weightcategory, + starttime=workoutstarttime, + csvfilename=f2,notes=notes,summary=summary, + maxhr=maxhr,averagehr=averagehr, + startdatetime=workoutstartdatetime) + + w.save() + # put stroke data in database + res = dataprep(row.df,id=w.id,bands=True, + barchart=True,otwpower=True,empower=True) + + return (w.id,message) + # Create new workout from file and store it in the database # This routine should be used everywhere in views.py and mailprocessing.py # Currently there is code duplication @@ -336,105 +446,14 @@ def new_workout_from_file(r,f2, except: os.remove(f_to_be_deleted+'.gz') - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - # make workout and put in database - rr = rrower(hrmax=r.max,hrut2=r.ut2, - hrut1=r.ut1,hrat=r.at, - hrtr=r.tr,hran=r.an,ftp=r.ftp, - powerperc=powerperc,powerzones=r.powerzones) - row = rdata(f2,rower=rr) - if row == 0: - return (0,'Error: CSV data file not found') + dosummary = (fileformat != 'fit') + id,message = save_workout_database(f2,r, + workouttype=workouttype, + dosummary=dosummary, + title=title) - # auto smoothing - pace = row.df[' Stroke500mPace (sec/500m)'].values - velo = 500./pace - - f = row.df['TimeStamp (sec)'].diff().mean() - windowsize = 2*(int(10./(f)))+1 - if not 'originalvelo' in row.df: - row.df['originalvelo'] = velo - - if windowsize > 3 and windowsize23: - message = 'Warning: The workout duration was longer than 23 hours' - hours = 23 - - minutes = int((totaltime - 3600.*hours)/60.) - seconds = int(totaltime - 3600.*hours - 60.*minutes) - tenths = int(10*(totaltime - 3600.*hours - 60.*minutes - seconds)) - duration = "%s:%s:%s.%s" % (hours,minutes,seconds,tenths) - - workoutdate = row.rowdatetime.strftime('%Y-%m-%d') - workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') - workoutstartdatetime = thetimezone.localize(row.rowdatetime).astimezone(utc) - - # check for duplicate start times - ws = Workout.objects.filter(starttime=workoutstarttime, - user=r) - if (len(ws) != 0): - message = "Warning: This workout probably already exists in the database" - - w = Workout(user=r,name=title,date=workoutdate, - workouttype=workouttype, - duration=duration,distance=totaldist, - weightcategory=r.weightcategory, - starttime=workoutstarttime, - csvfilename=f2,notes=notes,summary=summary, - maxhr=maxhr,averagehr=averagehr, - startdatetime=workoutstartdatetime) - - w.save() - # put stroke data in database - res = dataprep(row.df,id=w.id,bands=True, - barchart=True,otwpower=True,empower=True) - - return (w.id,message) + return (id,message) # Compare the data from the CSV file and the database # Currently only calculates number of strokes. To be expanded with diff --git a/rowers/views.py b/rowers/views.py index 89ad45d6..112cd2ce 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -67,13 +67,8 @@ from shutil import copyfile from rowingdata import rower as rrower from rowingdata import main as rmain from rowingdata import rowingdata as rrdata -from rowingdata import TCXParser,RowProParser,ErgDataParser,TCXParserNoHR -from rowingdata import BoatCoachParser,RowPerfectParser,BoatCoachAdvancedParser -from rowingdata import MysteryParser -from rowingdata import painsledDesktopParser,speedcoachParser,ErgStickParser -from rowingdata import SpeedCoach2Parser,FITParser,fitsummarydata from rowingdata import make_cumvalues -from rowingdata import summarydata,get_file_type +from rowingdata import summarydata import pandas as pd import numpy as np import matplotlib.pyplot as plt @@ -451,69 +446,27 @@ def add_workout_from_strokedata(user,importid,data,strokedata, compression='gzip') - # make workout - powerperc = 100*np.array([r.pw_ut2, - r.pw_ut1, - r.pw_at, - r.pw_tr,r.pw_an])/r.ftp - - rr = rrower(hrmax=r.max,hrut2=r.ut2, - hrut1=r.ut1,hrat=r.at, - hrtr=r.tr,hran=r.an,ftp=r.ftp, - powerperc=powerperc, - powerzones=r.powerzones, - ) - row = rdata(csvfilename,rower=rr) - - averagehr = row.df[' HRCur (bpm)'].mean() - maxhr = row.df[' HRCur (bpm)'].max() - totaldist = row.df['cum_dist'].max() - totaltime = row.df['TimeStamp (sec)'].max()-row.df['TimeStamp (sec)'].min() - totaltime = totaltime+row.df.ix[0,' ElapsedTime (sec)'] - # with Concept2 if source=='c2': try: totaldist = data['distance'] totaltime = data['time']/10. except KeyError: - pass + totaldist = 0 + totaltime = 0 + else: + totaldist = 0 + totaltime = 0 + + id,message = dataprep.save_workout_database(csvfilename,r, + workouttype=workouttype, + title=title,notes=comments, + totaldist=totaldist, + totaltime=totaltime) + - hours = int(totaltime/3600.) - minutes = int((totaltime - 3600.*hours)/60.) - seconds = int(totaltime - 3600.*hours - 60.*minutes) - tenths = int(10*(totaltime - 3600.*hours - 60.*minutes - seconds)) - - duration = "%s:%s:%s.%s" % (hours,minutes,seconds,tenths) - - - summary = row.summary() - summary += '\n' - summary += row.intervalstats() - - workoutdate = row.rowdatetime.strftime('%Y-%m-%d') - workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') - - # check for duplicate start times - ws = Workout.objects.filter(starttime=workoutstarttime, - user=r) - if (len(ws) != 0): - warnings.warn("Probably a duplicate workout",UserWarning) - - # Create the Workout object - w = Workout(user=r,name=title, - date=workoutdate,workouttype=workouttype, - duration=duration,distance=totaldist, - weightcategory=r.weightcategory, - starttime=workoutstarttime, - csvfilename=csvfilename,notes=comments, - uploadedtoc2=0,summary=summary, - averagehr=averagehr,maxhr=maxhr, - startdatetime=rowdatetime) - w.save() - - return w.id + return id,message # Create workout from SportTracks Data, which are slightly different # than Strava or Concept2 data @@ -582,7 +535,8 @@ def add_workout_from_stdata(user,importid,data): times_location = times_distance latcoord = np.zeros(len(times_distance)) loncoord = np.zeros(len(times_distance)) - + if workouttype == 'water': + workouttype = 'rower' try: res = splitstdata(data['cadence']) @@ -668,89 +622,17 @@ def add_workout_from_stdata(user,importid,data): timestr = strftime("%Y%m%d-%H%M%S") - # auto smoothing - pace = df[' Stroke500mPace (sec/500m)'].values - velo = 500./pace - - f = df['TimeStamp (sec)'].diff().mean() - windowsize = 2*(int(10./(f)))+1 - - df['originalvelo'] = velo - - if windowsize > 3 and windowsize