From b3eed722d65ea40eb5cba4c58cb5debd0b97bb19 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 9 Apr 2018 13:19:19 +0200 Subject: [PATCH] linear interpolation in fitnessmetric chart --- rowers/interactiveplots.py | 73 ++++++++++++++++++++++++++++++-------- rowers/tasks.py | 45 ++++++++++++----------- 2 files changed, 83 insertions(+), 35 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 80e329df..3e0ff059 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -57,6 +57,7 @@ thetimezone = get_current_timezone() from scipy.stats import linregress,percentileofscore from scipy import optimize from scipy.signal import savgol_filter +from scipy.interpolate import griddata import stravastuff @@ -646,6 +647,14 @@ def fitnessmetric_chart(fitnessmetrics,user,workoutmode='rower'): }) + delta = df['power4min'].astype('int').diff() + + mask = delta == 0 + + df.loc[mask,'power4min'] = np.nan + df.dropna(inplace=True,axis=0,how='any') + + df = df[df['power2k']>0] df = df[df['mode']==workoutmode] @@ -661,37 +670,70 @@ def fitnessmetric_chart(fitnessmetrics,user,workoutmode='rower'): power4min = power4min, power2k = power2k, date = date, - power1hr = power1hr - ) + power1hr = power1hr, + fdate=groups['dates'].map(lambda x: x.strftime('%d-%m-%Y')) ) ) + + # fit + + resampled = groups.set_index('dates') + resampled.index = pd.to_datetime(resampled.index) + resampled = resampled.resample('D').interpolate( + method='linear',order=2) + + power4min = resampled['power4min'] + date = resampled.index.values + power2k = resampled['power2k'] + power1hr = resampled['power1hr'] + + source2 = ColumnDataSource( + data = dict( + power4min = power4min, + power2k = power2k, + date = date, + power1hr = power1hr, + fdate=resampled.index.map(lambda x: x.strftime('%d-%m-%Y')) ) + ) + + + + TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,resize,crosshair' plot = Figure(tools=TOOLS,toolbar_location="above", toolbar_sticky=False,width=900, x_axis_type='datetime') -# plot.extra_y_ranges = {"watermark": watermarkrange} + # add watermark + plot.extra_y_ranges = {"watermark": watermarkrange} + plot.extra_x_ranges = {"watermark": watermarkrange} -# plot.image_url([watermarkurl],1.8*max(thesecs),watermarky, -# watermarkw,watermarkh, -# global_alpha=watermarkalpha, -# w_units='screen', -# h_units='screen', -# anchor=watermarkanchor, -# dilate=True, -# y_range_name = "watermark", -# ) + plot.image_url([watermarkurl],watermarkx,watermarky, + watermarkw,watermarkh, + global_alpha=watermarkalpha, + w_units='screen', + h_units='screen', + anchor=watermarkanchor, + dilate=True, + x_range_name = "watermark", + y_range_name = "watermark", + ) - plot.circle('date','power2k',source=source,fill_color='red',size=7, + plot.circle('date','power2k',source=source,fill_color='red',size=10, legend='2k power') - plot.circle('date','power1hr',source=source,fill_color='blue',size=7, + + plot.circle('date','power1hr',source=source,fill_color='blue',size=10, legend='1 hr power') - plot.circle('date','power4min',source=source,fill_color='green',size=7, + plot.circle('date','power4min',source=source,fill_color='green',size=10, legend='4 min power') + plot.line('date','power4min',source=source2,color='green') + plot.line('date','power2k',source=source2,color='red') + plot.line('date','power1hr',source=source2,color='blue') + plot.xaxis.axis_label = 'Date' plot.yaxis.axis_label = 'Power (W)' @@ -712,6 +754,7 @@ def fitnessmetric_chart(fitnessmetrics,user,workoutmode='rower'): ('Power 4 minutes','@power4min'), ('Power 2000 m','@power2k'), ('Power 1 hour','@power1hr'), + ('Date','@fdate'), ]) script,div = components(plot) diff --git a/rowers/tasks.py b/rowers/tasks.py index c5625658..08f48c49 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -743,26 +743,7 @@ def handle_updateergcp(rower_id,workoutfilenames,debug=False,**kwargs): return 1 -@app.task -def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False, - **kwargs): - - powerfourmin = -1 - power2k = -1 - powerhour = -1 - - mdict = { - 'user_id': user_id, - 'PowerFourMin': powerfourmin, - 'PowerTwoK': power2k, - 'PowerOneHour': powerhour, - 'workoutmode': mode, - 'last_workout': max(workoutids), - 'date': timezone.now().strftime('%Y-%m-%d'), - } - - result = fitnessmetric_to_sql(mdict,debug=debug,doclean=False) - +def cp_from_workoutids(workoutids,debug=False): columns = ['power','workoutid','time'] df = getsmallrowdata_db(columns,ids=workoutids,debug=debug) df.dropna(inplace=True,axis=0) @@ -821,6 +802,30 @@ def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False, power2k = fitfunc(p1,t3) + return powerfourmin,power2k,powerhour + + +@app.task +def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False, + **kwargs): + + powerfourmin = -1 + power2k = -1 + powerhour = -1 + + mdict = { + 'user_id': user_id, + 'PowerFourMin': powerfourmin, + 'PowerTwoK': power2k, + 'PowerOneHour': powerhour, + 'workoutmode': mode, + 'last_workout': max(workoutids), + 'date': timezone.now().strftime('%Y-%m-%d'), + } + + result = fitnessmetric_to_sql(mdict,debug=debug,doclean=False) + + powerfourmin,power2k,powerhour = cp_from_workoutids(workoutids,debug=debug) mdict = { 'user_id': user_id,