Private
Public Access
1
0
This commit is contained in:
Sander Roosendaal
2022-02-18 18:49:33 +01:00
parent e999a73d68
commit f984d25f6a
2 changed files with 5 additions and 110 deletions

View File

@@ -9,7 +9,6 @@ from rowers.models import course_spline, VirtualRaceResult
from bokeh.palettes import Category20c, Category10 from bokeh.palettes import Category20c, Category10
from bokeh.layouts import layout, widgetbox from bokeh.layouts import layout, widgetbox
from bokeh.resources import CDN, INLINE from bokeh.resources import CDN, INLINE
from math import pi
from rowers.dataprep import timedeltaconv from rowers.dataprep import timedeltaconv
from pandas.core.groupby.groupby import DataError from pandas.core.groupby.groupby import DataError
import rowers.datautils as datautils import rowers.datautils as datautils
@@ -41,8 +40,7 @@ from bokeh.core.properties import value
from rowers.opaque import encoder from rowers.opaque import encoder
from bokeh.models import ( from bokeh.models import (
OpenURL, TapTool, CrosshairTool, Span, Label, SaveTool, OpenURL, TapTool, CrosshairTool, Span, Label, SaveTool,
PanTool, BoxZoomTool, WheelZoomTool, ResetTool, PanTool, BoxZoomTool, WheelZoomTool, ResetTool,)
)
from bokeh.models.glyphs import ImageURL from bokeh.models.glyphs import ImageURL
from bokeh.transform import cumsum from bokeh.transform import cumsum
from bokeh.models import ( from bokeh.models import (
@@ -82,9 +80,6 @@ queue = django_rq.get_queue('default')
queuelow = django_rq.get_queue('low') queuelow = django_rq.get_queue('low')
queuehigh = django_rq.get_queue('low') queuehigh = django_rq.get_queue('low')
#from bokeh.io import output_file, show, vplot
#from bokeh.models.widgets import Slider, Select, TextInput
activate(settings.TIME_ZONE) activate(settings.TIME_ZONE)
thetimezone = get_current_timezone() thetimezone = get_current_timezone()
@@ -132,7 +127,6 @@ def errorbar(fig, x, y, source=ColumnDataSource(),
colorvalues = ["#%02x%02x%02x" % (255, 0, 0) for x in xvalues] colorvalues = ["#%02x%02x%02x" % (255, 0, 0) for x in xvalues]
try: try:
a = xvalues[0]+1
if xerr: if xerr:
x_err_x = [] x_err_x = []
x_err_y = [] x_err_y = []
@@ -155,7 +149,6 @@ def errorbar(fig, x, y, source=ColumnDataSource(),
pass pass
try: try:
a = yvalues[0]+1
if yerr: if yerr:
y_err_x = [] y_err_x = []
y_err_y = [] y_err_y = []
@@ -254,7 +247,6 @@ def interactive_hr_piechart(df, rower, title, totalseconds=0):
data['totaltime'] = pd.Series([pretty_timedelta(v) for v in data['value']]) data['totaltime'] = pd.Series([pretty_timedelta(v) for v in data['value']])
size = 350
TOOLS = 'save,hover' TOOLS = 'save,hover'
z = figure(title="HR "+title, x_range=(-0.5, 1), plot_height=375, z = figure(title="HR "+title, x_range=(-0.5, 1), plot_height=375,
@@ -345,10 +337,10 @@ def interactive_boxchart(datadf, fieldname, extratitle='',
columns = datadf.columns columns = datadf.columns
if not fieldname in columns: # pragma: no cover if fieldname not in columns: # pragma: no cover
return '', 'It looks like there are no data matching your filter' return '', 'It looks like there are no data matching your filter'
if not 'date' in columns: # pragma: no cover if 'date' not in columns: # pragma: no cover
return '', 'Not enough data' return '', 'Not enough data'
tooltips = [ tooltips = [
@@ -411,8 +403,6 @@ def interactive_boxchart(datadf, fieldname, extratitle='',
def interactive_planchart(data, startdate, enddate): def interactive_planchart(data, startdate, enddate):
source = ColumnDataSource(data)
hv.extension('bokeh') hv.extension('bokeh')
yaxmaximum = data['executed'].max() yaxmaximum = data['executed'].max()
@@ -565,14 +555,9 @@ def interactive_activitychart(workouts, startdate, enddate, stack='type', toolba
'link': links, 'link': links,
} }
dim_expr = hv.dim('type').categorize(mytypes.color_map)
df = pd.DataFrame(thedict) df = pd.DataFrame(thedict)
source = ColumnDataSource(df)
df.sort_values('date_sorting', inplace=True) df.sort_values('date_sorting', inplace=True)
#clrs = hv.Cycle(df['colors'].values)
hv.extension('bokeh') hv.extension('bokeh')
@@ -608,7 +593,6 @@ def interactive_activitychart(workouts, startdate, enddate, stack='type', toolba
p.toolbar_location = toolbar_location p.toolbar_location = toolbar_location
p.y_range.start = 0 p.y_range.start = 0
p.sizing_mode = 'stretch_both' p.sizing_mode = 'stretch_both'
url = "http://rowsandall.com/rowers/workout/@duration/"
taptool = p.select(type=TapTool) taptool = p.select(type=TapTool)
callback = CustomJS(args={'links': df.link}, code=""" callback = CustomJS(args={'links': df.link}, code="""
@@ -749,8 +733,6 @@ def interactive_activitychart2(workouts, startdate, enddate, stack='type', toolb
'link': links, 'link': links,
} }
dim_expr = hv.dim('type').categorize(mytypes.color_map)
df = pd.DataFrame(thedict) df = pd.DataFrame(thedict)
if totaldays > 30 and yaxis == 'duration': # pragma: no cover if totaldays > 30 and yaxis == 'duration': # pragma: no cover
@@ -772,9 +754,6 @@ def interactive_activitychart2(workouts, startdate, enddate, stack='type', toolb
df.sort_values('date_sorting', inplace=True) df.sort_values('date_sorting', inplace=True)
#clrs = hv.Cycle(df['colors'].values)
source = ColumnDataSource(df)
hv.extension('bokeh') hv.extension('bokeh')
# table = hv.Table(df,[('date','Date'),('type','Workout Type')], # table = hv.Table(df,[('date','Date'),('type','Workout Type')],
@@ -815,7 +794,6 @@ def interactive_activitychart2(workouts, startdate, enddate, stack='type', toolb
p.toolbar_location = toolbar_location p.toolbar_location = toolbar_location
p.sizing_mode = 'stretch_both' p.sizing_mode = 'stretch_both'
p.y_range.start = 0 p.y_range.start = 0
url = "http://rowsandall.com/rowers/workout/@duration/"
taptool = p.select(type=TapTool) taptool = p.select(type=TapTool)
callback = CustomJS(args={'links': df['link']}, code=""" callback = CustomJS(args={'links': df['link']}, code="""
@@ -849,9 +827,7 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
rowdata.dropna(axis=1, how='all', inplace=True) rowdata.dropna(axis=1, how='all', inplace=True)
rowdata.dropna(axis=0, how='any', inplace=True) rowdata.dropna(axis=0, how='any', inplace=True)
workoutstateswork = [1, 4, 5, 8, 9, 6, 7]
workoutstatesrest = [3] workoutstatesrest = [3]
workoutstatetransition = [0, 2, 10, 11, 12, 13]
if workstrokesonly: if workstrokesonly:
try: try:
@@ -862,15 +838,6 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
if rowdata.empty: if rowdata.empty:
return "", "No Valid Data Available", "", "" return "", "No Valid Data Available", "", ""
# quick linear regression
# peakforce = slope*peakforceangle + intercept
try:
slope, intercept, r, p, stderr = linregress(
rowdata['peakforceangle'], rowdata['peakforce'])
except KeyError: # pragma: no cover
slope = 0
intercept = 0
try: try:
covariancematrix = np.cov( covariancematrix = np.cov(
rowdata['peakforceangle'], y=rowdata['peakforce']) rowdata['peakforceangle'], y=rowdata['peakforce'])
@@ -997,16 +964,8 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
try: try:
peakforceav = rowdata['peakforce'].median() peakforceav = rowdata['peakforce'].median()
peakforce25 = rowdata['peakforce'].quantile(q=0.25)
peakforce75 = rowdata['peakforce'].quantile(q=0.75)
peakforce05 = rowdata['peakforce'].quantile(q=0.05)
peakforce95 = rowdata['peakforce'].quantile(q=0.95)
except KeyError: # pragma: no cover except KeyError: # pragma: no cover
peakforceav = 0 peakforceav = 0
peakforce25 = 0
peakforce75 = 0
peakforce05 = 0
peakforce95 = 0
try: try:
averageforceav = rowdata['averageforce'].median() averageforceav = rowdata['averageforce'].median()
@@ -1015,16 +974,8 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
try: try:
peakforceangleav = rowdata['peakforceangle'].median() peakforceangleav = rowdata['peakforceangle'].median()
peakforceangle05 = rowdata['peakforceangle'].quantile(q=0.05)
peakforceangle25 = rowdata['peakforceangle'].quantile(q=0.25)
peakforceangle75 = rowdata['peakforceangle'].quantile(q=0.75)
peakforceangle95 = rowdata['peakforceangle'].quantile(q=0.95)
except KeyError: # pragma: no cover except KeyError: # pragma: no cover
peakforceangleav = 0 peakforceangleav = 0
peakforceangle25 = 0
peakforceangle75 = 0
peakforceangle05 = 0
peakforceangle95 = 0
# thresholdforce /= 4.45 # N to lbs # thresholdforce /= 4.45 # N to lbs
thresholdforce = 100 if 'x' in boattype else 200 thresholdforce = 100 if 'x' in boattype else 200
@@ -1095,20 +1046,6 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
) )
) )
sourcetrend = ColumnDataSource(
data=dict(
x=[peakforceangle25, peakforceangle75],
y=[peakforce25, peakforce75]
)
)
sourcefit = ColumnDataSource(
data=dict(
x=np.array([peakforceangle25, peakforceangle75]),
y=slope*np.array([peakforceangle25, peakforceangle75])+intercept
)
)
source2 = ColumnDataSource( source2 = ColumnDataSource(
rowdata rowdata
) )
@@ -1150,8 +1087,6 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
# add watermark # add watermark
watermarkurl = "/static/img/logo7.png" watermarkurl = "/static/img/logo7.png"
watermarksource = ColumnDataSource(dict(
url=[watermarkurl],))
watermarkrange = Range1d(start=0, end=1) watermarkrange = Range1d(start=0, end=1)
watermarkalpha = 0.6 watermarkalpha = 0.6
@@ -1524,14 +1459,6 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
slider_dist_max.js_on_change('value', callback) slider_dist_max.js_on_change('value', callback)
callback.args["maxdist"] = slider_dist_max callback.args["maxdist"] = slider_dist_max
#annotation.sizing_mode = 'fixed'
#slider_spm_min.sizing_mode = 'fixed'
#slider_spm_max.sizing_mode = 'fixed'
#slider_work_min.sizing_mode = 'fixed'
#slider_work_max.sizing_mode = 'fixed'
#slider_dist_min.sizing_mode = 'fixed'
#slider_dist_max.sizing_mode = 'fixed'
thesliders = layoutcolumn([annotation, thesliders = layoutcolumn([annotation,
slider_spm_min, slider_spm_min,
slider_spm_max, slider_spm_max,
@@ -1541,10 +1468,8 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
slider_work_max, slider_work_max,
] ]
) )
#thesliders.sizing_mode = 'fixed'
mylayout = layoutrow([thesliders, mylayout = layoutrow([thesliders, plot])
plot])
mylayout.sizing_mode = 'stretch_both' mylayout.sizing_mode = 'stretch_both'
@@ -1658,12 +1583,9 @@ def goldmedalscorechart(user, startdate=None, enddate=None):
duration = [] duration = []
workoutid = [] workoutid = []
previous = 0
for i in range(len(dates)): for i in range(len(dates)):
id = ids[i] id = ids[i]
w = Workout.objects.get(id=id) w = Workout.objects.get(id=id)
dd = str(dates[i])
# td.append(arrow.get(dd).datetime) # td.append(arrow.get(dd).datetime)
td.append(arrow.get(w.date).datetime) td.append(arrow.get(w.date).datetime)
markerscore.append(testpower[i]) markerscore.append(testpower[i])
@@ -1729,9 +1651,6 @@ def goldmedalscorechart(user, startdate=None, enddate=None):
# add watermark # add watermark
watermarkurl = "/static/img/logo7.png" watermarkurl = "/static/img/logo7.png"
watermarksource = ColumnDataSource(dict(
url=[watermarkurl],))
watermarkrange = Range1d(start=0, end=1) watermarkrange = Range1d(start=0, end=1)
watermarkalpha = 0.6 watermarkalpha = 0.6
watermarkx = 0.99 watermarkx = 0.99
@@ -1892,9 +1811,6 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
# add watermark # add watermark
watermarkurl = "/static/img/logo7.png" watermarkurl = "/static/img/logo7.png"
watermarksource = ColumnDataSource(dict(
url=[watermarkurl],))
watermarkrange = Range1d(start=0, end=1) watermarkrange = Range1d(start=0, end=1)
watermarkalpha = 0.6 watermarkalpha = 0.6
watermarkx = 0.99 watermarkx = 0.99
@@ -1951,10 +1867,8 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
# y1rangemin = df.loc[:,['testpower','fitness']].min().min() # y1rangemin = df.loc[:,['testpower','fitness']].min().min()
# y1rangemax = df.loc[:,['testpower','fitness']].max().max()*1.02 # y1rangemax = df.loc[:,['testpower','fitness']].max().max()*1.02
if dofatigue: # pragma: no cover if dofatigue: # pragma: no cover
y1rangemin = df.loc[:, ['fitness', 'fatigue']].min().min()
y1rangemax = df.loc[:, ['fitness', 'fatigue']].max().max()*1.02 y1rangemax = df.loc[:, ['fitness', 'fatigue']].max().max()*1.02
else: else:
y1rangemin = df.loc[:, ['fitness']].min().min()
y1rangemax = df.loc[:, ['fitness']].max().max()*1.02 y1rangemax = df.loc[:, ['fitness']].max().max()*1.02
if doform: # pragma: no cover if doform: # pragma: no cover
@@ -1979,7 +1893,6 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
plot.sizing_mode = 'scale_both' plot.sizing_mode = 'scale_both'
#plot.y_range = Range1d(0,1.5*max(df['testpower']))
startdate = datetime.datetime.combine( startdate = datetime.datetime.combine(
startdate, datetime.datetime.min.time()) startdate, datetime.datetime.min.time())
enddate = datetime.datetime.combine(enddate, datetime.datetime.min.time()) enddate = datetime.datetime.combine(enddate, datetime.datetime.min.time())
@@ -2102,9 +2015,6 @@ def interactive_histoall(theworkouts, histoparam, includereststrokes,
# add watermark # add watermark
watermarkurl = "/static/img/logo7.png" watermarkurl = "/static/img/logo7.png"
watermarksource = ColumnDataSource(dict(
url=[watermarkurl],))
watermarkrange = Range1d(start=0, end=1) watermarkrange = Range1d(start=0, end=1)
watermarkalpha = 0.6 watermarkalpha = 0.6
watermarkx = 0.99 watermarkx = 0.99
@@ -2514,10 +2424,6 @@ def get_map_script_course(
""".format( """.format(
latmean=latmean, latmean=latmean,
lonmean=lonmean, lonmean=lonmean,
latbegin=latbegin,
latend=latend,
longbegin=longbegin,
longend=longend,
scoordinates=scoordinates, scoordinates=scoordinates,
pcoordinates=pcoordinates, pcoordinates=pcoordinates,
plabels=plabels plabels=plabels
@@ -2778,11 +2684,6 @@ def leaflet_chart_compare(course, workoutids, labeldict={}, startenddict={}):
if lat.empty or lon.empty: # pragma: no cover if lat.empty or lon.empty: # pragma: no cover
return [0, "invalid coordinate data"] return [0, "invalid coordinate data"]
latbegin = lat.values[0]
longbegin = lon.values[0]
latend = lat.values[-1]
longend = lon.values[-1]
colors = itertools.cycle(palette) colors = itertools.cycle(palette)
try: try:
items = itertools.izip(workoutids, colors) items = itertools.izip(workoutids, colors)
@@ -2869,10 +2770,6 @@ var navionics = new JNC.Leaflet.NavionicsOverlay({{
""".format( """.format(
latmean=latmean, latmean=latmean,
lonmean=lonmean, lonmean=lonmean,
latbegin=latbegin,
latend=latend,
longbegin=longbegin,
longend=longend,
pcoordinates=pcoordinates, pcoordinates=pcoordinates,
plabels=plabels, plabels=plabels,
) )
@@ -2926,7 +2823,6 @@ var navionics = new JNC.Leaflet.NavionicsOverlay({{
scoordinates=scoordinates, scoordinates=scoordinates,
color=color, color=color,
label=label, label=label,
id=id,
) )
script += """ script += """

View File

@@ -3736,8 +3736,7 @@ def workout_flexchart3_view(request, *args, **kwargs):
'yaxis1': yparam1, 'yaxis1': yparam1,
'yaxis2': yparam2, 'yaxis2': yparam2,
} }
flexaxesform = FlexAxesForm(request, initial=initial, flexaxesform = FlexAxesForm(request, initial=initial)
extrametrics=extrametrics)
initial = { initial = {
'includereststrokes': not workstrokesonly, 'includereststrokes': not workstrokesonly,