diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 0cb791c5..84a25803 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -968,6 +968,12 @@ def read_cols_df_sql(ids,columns): connection = engine.raw_connection() df = pd.read_sql_query(query,engine) df = df.fillna(value=0) + try: + df['peakforce'] = df['peakforce']*lbstoN + df['averageforce'] = df['averageforce']*lbstoN + except KeyError: + pass + engine.dispose() return df @@ -980,6 +986,12 @@ def read_df_sql(id): engine.dispose() df = df.fillna(value=0) + try: + df['peakforce'] = df['peakforce']*lbstoN + df['averageforce'] = df['averageforce']*lbstoN + except KeyError: + pass + return df # Get the necessary data from the strokedata table in the DB. diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 14d42578..72607cbf 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -4,7 +4,7 @@ from rowingdata import main as rmain from rowingdata import cumcpdata,histodata from rowingdata import rowingdata as rrdata - +from math import pi from django.utils import timezone from bokeh.palettes import Dark2_8 as palette @@ -88,15 +88,27 @@ from rowers.dataprep import nicepaceformat,niceformat from rowers.dataprep import timedeltaconv def interactive_boxchart(datadf,fieldname): - + TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,resize' plot = BoxPlot(datadf, values=fieldname, label='date', legend=False, title=axlabels[fieldname], - outliers=False) + outliers=False, + tools=TOOLS, + x_mapper_type='datetime') yrange1 = Range1d(start=yaxminima[fieldname],end=yaxmaxima[fieldname]) plot.y_range = yrange1 + + plot.xaxis.axis_label = 'Date' + plot.yaxis.axis_label = axlabels[fieldname] + + plot.xaxis.formatter = DatetimeTickFormatter( + days=["%d %B %Y"], + months=["%d %B %Y"], + years=["%d %B %Y"], + ) + plot.xaxis.major_label_orientation = pi/4 script, div = components(plot) diff --git a/rowers/templates/cumstats.html b/rowers/templates/cumstats.html index 484e89ff..7d814c62 100644 --- a/rowers/templates/cumstats.html +++ b/rowers/templates/cumstats.html @@ -47,7 +47,7 @@ between {{ startdate|date }} and {{ enddate|date }}

Direct link for other Pro users: - https://rowsandall.com/rowers/{{ id }}/cumstats/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }} + https://rowsandall.com/rowers/{{ id }}/cumstats/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}/p/{{ plotfield }}

@@ -95,7 +95,13 @@
{% if stats %} {% for key, value in stats.items %} -

{{ value.verbosename }}

+

{{ value.verbosename }}

+
+

+ Plot +

+
+ diff --git a/rowers/urls.py b/rowers/urls.py index a7593b1a..952b6175 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -141,6 +141,8 @@ urlpatterns = [ url(r'^histo/(?P\w+.*)/(?P\w+.*)$',views.histo), url(r'^histo/(?P\d+)$',views.histo), url(r'^histo/$',views.histo), + url(r'^cumstats/(?P\w+.*)/(?P\w+.*)/p/(?P\w+.*)$',views.cumstats), + url(r'^(?P\d+)/cumstats/(?P\w+.*)/(?P\w+.*)/p/(?P\w+.*)$',views.cumstats), url(r'^(?P\d+)/cumstats/(?P\w+.*)/(?P\w+.*)$',views.cumstats), url(r'^(?P\d+)/cumstats/(?P\d+)$',views.cumstats), url(r'^cumstats/(?P\w+.*)/(?P\w+.*)$',views.cumstats), diff --git a/rowers/views.py b/rowers/views.py index b0cb9fcd..6746e7fe 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3839,6 +3839,7 @@ def cumstats(request,theuser=0, deltadays=-1, startdatestring="", enddatestring="", + plotfield='spm', options={ 'includereststrokes':False, 'workouttypes':['rower','dynamic','slides'] @@ -4010,7 +4011,8 @@ def cumstats(request,theuser=0, # interactive box plot datadf['workoutid'].replace(datemapping,inplace=True) datadf.rename(columns={"workoutid":"date"},inplace=True) - script,div = interactive_boxchart(datadf,'wash') + datadf = datadf.sort_values(['date']) + script,div = interactive_boxchart(datadf,plotfield) # set options form correctly initial = {} @@ -4041,6 +4043,7 @@ def cumstats(request,theuser=0, 'cordict':cordict, 'plotscript':script, 'plotdiv':div, + 'plotfield':plotfield, }) request.session['options'] = options