diff --git a/rowers/dataprepnodjango.py b/rowers/dataprepnodjango.py index 3828afdb..788fbeac 100644 --- a/rowers/dataprepnodjango.py +++ b/rowers/dataprepnodjango.py @@ -1030,6 +1030,8 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True, p2 = p.fillna(method='ffill').apply(lambda x: timedeltaconv(x)) + print p + try: drivespeed = drivelength/rowdatadf[' DriveTime (ms)']*1.0e3 except KeyError: diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index 05e58427..ed410014 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -26,6 +26,12 @@ from django.contrib.auth import authenticate, login, logout from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required +import django_rq +queue = django_rq.get_queue('default') +queuelow = django_rq.get_queue('low') +queuehigh = django_rq.get_queue('low') + + # Project # from .models import Profile from rowingdata import rowingdata @@ -34,10 +40,17 @@ from rowers.models import Rower,Workout from rowers.models import checkworkoutuser import dataprep from dataprep import columndict -from utils import uniqify,isprorower +from utils import uniqify,isprorower,myqueue from uuid import uuid4 import stravalib from stravalib.exc import ActivityUploadFailed,TimeoutExceeded +import iso8601 +from iso8601 import ParseError + +import pytz +import arrow + +from rowers.tasks import handle_strava_import_stroke_data from rowsandall_app.settings import C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET, STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI, STRAVA_CLIENT_SECRET @@ -46,28 +59,8 @@ try: except ImportError: JSONDecodeError = ValueError -# Exponentially weighted moving average -# Used for data smoothing of the jagged data obtained by Strava -# See bitbucket issue 72 -def ewmovingaverage(interval,window_size): - # Experimental code using Exponential Weighted moving average - try: - intervaldf = pd.DataFrame({'v':interval}) - idf_ewma1 = intervaldf.ewm(span=window_size) - idf_ewma2 = intervaldf[::-1].ewm(span=window_size) - - i_ewma1 = idf_ewma1.mean().ix[:,'v'] - i_ewma2 = idf_ewma2.mean().ix[:,'v'] - - interval2 = np.vstack((i_ewma1,i_ewma2[::-1])) - interval2 = np.mean( interval2, axis=0) # average - except ValueError: - interval2 = interval - - return interval2 - -from utils import geo_distance +from utils import geo_distance,ewmovingaverage # Custom exception handler, returns a 401 HTTP message @@ -154,13 +147,17 @@ def get_strava_workout_list(user): def add_stroke_data(user,stravaid,workoutid,startdatetime,csvfilename): r = Rower.objects.get(user=user) + + print 'Queueing job for workout {workoutid} (strava {stravaid})'.format( + workoutid=workoutid, + stravaid=stravaid) starttimeunix = arrow.get(startdatetime).timestamp job = myqueue(queue, handle_strava_import_stroke_data, r.stravatoken, - stravid, + stravaid, workoutid, starttimeunix, csvfilename) @@ -187,16 +184,14 @@ def get_strava_workouts(rower): ]) newids = [stravaid for stravaid in stravaids if not stravaid in knownstravaids] - print newids,'aap' - - for stravaid in newids: + for stravaid in newids[:1]: workoutid = create_async_workout(alldata,rower.user,stravaid) return 1 def create_async_workout(alldata,user,stravaid): - data = alldata[stravid] - + data = alldata[stravaid] + r = Rower.objects.get(user=user) distance = data['distance'] stravaid = data['id'] try: @@ -240,6 +235,14 @@ def create_async_workout(alldata,user,stravaid): except: title = 'Imported' + workoutdate = rowdatetime.astimezone( + pytz.timezone(thetimezone) + ).strftime('%Y-%m-%d') + + starttime = rowdatetime.astimezone( + pytz.timezone(thetimezone) + ).strftime('%H:%m:%S') + totaltime = data['elapsed_time'] duration = dataprep.totaltime_sec_to_string(totaltime) diff --git a/rowers/tasks.py b/rowers/tasks.py index d4a7dae1..7ac1c34e 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -37,7 +37,7 @@ from django_rq import job from django.utils import timezone from django.utils.html import strip_tags -from utils import deserialize_list +from utils import deserialize_list,ewmovingaverage from rowers.dataprepnodjango import ( update_strokedata, new_workout_from_file, @@ -45,7 +45,7 @@ from rowers.dataprepnodjango import ( update_agegroup_db,fitnessmetric_to_sql, add_c2_stroke_data_db,totaltime_sec_to_string, create_c2_stroke_data_db,update_empower, - database_url_debug,database_url, + database_url_debug,database_url,dataprep ) @@ -85,7 +85,7 @@ def handle_strava_import_stroke_data(stravatoken, # ready to fetch. Hurray fetchresolution = 'high' series_type = 'time' - authorizationstring = str('Bearer ' + r.stravatoken) + authorizationstring = str('Bearer ' + stravatoken) headers = {'Authorization': authorizationstring, 'user-agent': 'sanderroosendaal', 'Content-Type': 'application/json', @@ -109,6 +109,7 @@ def handle_strava_import_stroke_data(stravatoken, url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/latlng?resolution="+fetchresolution+"&series_type="+series_type latlongjson = requests.get(url,headers=headers) + try: t = np.array(timejson.json()[0]['data']) nr_rows = len(t) @@ -161,19 +162,37 @@ def handle_strava_import_stroke_data(stravatoken, pace = 500./(1.0*velo2) pace[np.isinf(pace)] = 0.0 - df = pd.DataFrame({'t':10*t, - 'd':10*d, - 'p':10*pace, - 'spm':spm, - 'hr':hr, - 'lat':lat, - 'lon':lon, - 'strokelength':strokelength, + unixtime = starttimeunix+10*t + + nr_strokes = len(t) + + df = pd.DataFrame({'TimeStamp (sec)':unixtime, + ' ElapsedTime (sec)':10*t, + ' Horizontal (meters)':10*d, + ' Stroke500mPace (sec/500m)':10*pace, + ' Cadence (stokes/min)':spm, + ' HRCur (bpm)':hr, + ' latitude':lat, + ' longitude':lon, + ' StrokeDistance (meters)':strokelength, + 'cum_dist':10*d, + ' DragFactor':np.zeros(nr_strokes), + ' DriveLength (meters)':np.zeros(nr_strokes), + ' StrokeDistance (meters)':np.zeros(nr_strokes), + ' DriveTime (ms)':np.zeros(nr_strokes), + ' StrokeRecoveryTime (ms)':np.zeros(nr_strokes), + ' AverageDriveForce (lbs)':np.zeros(nr_strokes), + ' PeakDriveForce (lbs)':np.zeros(nr_strokes), + ' lapIdx':np.zeros(nr_strokes), + ' Power (watts)':0*d, }) + res = df.to_csv(csvfilename+'.gz',index_label='index',compression='gzip') + + data = dataprep(df,id=workoutid,bands=False,debug=debug) # startdatetime = datetime.datetime.strptime(startdatetime,"%Y-%m-%d-%H:%M:%S") - return [workoutsummary,df] + return 1 @app.task diff --git a/rowers/utils.py b/rowers/utils.py index 635d255a..b51948ef 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -378,3 +378,23 @@ def isprorower(r): return result +# Exponentially weighted moving average +# Used for data smoothing of the jagged data obtained by Strava +# See bitbucket issue 72 +def ewmovingaverage(interval,window_size): + # Experimental code using Exponential Weighted moving average + + try: + intervaldf = pd.DataFrame({'v':interval}) + idf_ewma1 = intervaldf.ewm(span=window_size) + idf_ewma2 = intervaldf[::-1].ewm(span=window_size) + + i_ewma1 = idf_ewma1.mean().ix[:,'v'] + i_ewma2 = idf_ewma2.mean().ix[:,'v'] + + interval2 = np.vstack((i_ewma1,i_ewma2[::-1])) + interval2 = np.mean( interval2, axis=0) # average + except ValueError: + interval2 = interval + + return interval2