diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 71f154b3..84a25803 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -272,7 +272,7 @@ def getstatsfields(): fielddict = {field.name:field.verbose_name for field in fields} - fielddict.pop('workoutid') + #fielddict.pop('workoutid') fielddict.pop('ergpace') fielddict.pop('hr_an') fielddict.pop('hr_tr') @@ -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 f79b9ce2..72607cbf 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -4,14 +4,14 @@ 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 import itertools from bokeh.plotting import figure, ColumnDataSource, Figure,curdoc from bokeh.models import CustomJS,Slider, TextInput -from bokeh.charts import Histogram,HeatMap +from bokeh.charts import Histogram,HeatMap,Area,BoxPlot from bokeh.resources import CDN,INLINE from bokeh.embed import components from bokeh.layouts import layout,widgetbox @@ -87,6 +87,34 @@ def tailwind(bearing,vwind,winddir): 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, + 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) + + + return script,div + def interactive_forcecurve(theworkouts,workstrokesonly=False): TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,resize,crosshair' diff --git a/rowers/templates/cumstats.html b/rowers/templates/cumstats.html index eb0b9654..7d814c62 100644 --- a/rowers/templates/cumstats.html +++ b/rowers/templates/cumstats.html @@ -5,6 +5,35 @@ {% block title %}Workout Statistics{% endblock %} {% block content %} + + + + + {{ plotscript |safe }} + + + + +
@@ -18,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 }}