v1 chart stack
This commit is contained in:
@@ -18,7 +18,8 @@ import rowers.metrics as metrics
|
|||||||
import rowers.dataprep as dataprep
|
import rowers.dataprep as dataprep
|
||||||
from rowers.dataprep import rdata
|
from rowers.dataprep import rdata
|
||||||
import rowers.utils as utils
|
import rowers.utils as utils
|
||||||
from jsmin import jsmin
|
|
||||||
|
from rowers.rower_rules import ispromember
|
||||||
|
|
||||||
from scipy.interpolate import griddata
|
from scipy.interpolate import griddata
|
||||||
from scipy.signal import savgol_filter
|
from scipy.signal import savgol_filter
|
||||||
@@ -3907,15 +3908,20 @@ def interactive_flexchart_stacked(id, r, xparam='time',
|
|||||||
yparam4='spm',
|
yparam4='spm',
|
||||||
mode='erg'):
|
mode='erg'):
|
||||||
|
|
||||||
columns = [xparam, yparam1, yparam2, yparam3, yparam4,
|
columns = [name for name, d in metrics.rowingmetrics]
|
||||||
'ftime', 'distance', 'fpace',
|
columns_basic = [name for name, d in metrics.rowingmetrics if d['group'] == 'basic']
|
||||||
'power', 'hr', 'spm', 'driveenergy',
|
columns = columns + ['spm', 'driveenergy', 'distance']
|
||||||
'time', 'pace', 'workoutstate']
|
columns_basic = columns_basic + ['spm', 'driveenergy', 'distance']
|
||||||
|
|
||||||
comment = None
|
rowdata = pd.DataFrame()
|
||||||
|
row = Workout.objects.get(id=id)
|
||||||
rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], doclean=True,
|
|
||||||
workstrokesonly=False)
|
if ispromember(r.user):
|
||||||
|
rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], doclean=True,
|
||||||
|
workstrokesonly=False, for_chart=True)
|
||||||
|
else:
|
||||||
|
rowdata = dataprep.getsmallrowdata_db(columns_basic, ids=[id], doclean=True,
|
||||||
|
workstrokesonly=False, for_chart=True)
|
||||||
|
|
||||||
if r.usersmooth > 1: # pragma: no cover
|
if r.usersmooth > 1: # pragma: no cover
|
||||||
for column in columns:
|
for column in columns:
|
||||||
@@ -3929,9 +3935,17 @@ def interactive_flexchart_stacked(id, r, xparam='time',
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
if len(rowdata) < 2:
|
if len(rowdata) < 2:
|
||||||
rowdata = dataprep.getsmallrowdata_db(columns, ids=[id],
|
if ispromember(r.user):
|
||||||
doclean=False,
|
rowdata = dataprep.getsmallrowdata_db(columns, ids=[id],
|
||||||
workstrokesonly=False)
|
doclean=False,
|
||||||
|
workstrokesonly=False,
|
||||||
|
for_chart=True)
|
||||||
|
else:
|
||||||
|
rowdata = dataprep.getsmallrowdata_db(columns_basic, ids=[id],
|
||||||
|
doclean=False,
|
||||||
|
workstrokesonly=False,
|
||||||
|
for_chart=True)
|
||||||
|
|
||||||
|
|
||||||
if rowdata.empty:
|
if rowdata.empty:
|
||||||
return "", "No valid data", '', '', comment
|
return "", "No valid data", '', '', comment
|
||||||
@@ -3969,6 +3983,28 @@ def interactive_flexchart_stacked(id, r, xparam='time',
|
|||||||
except KeyError: # pragma: no cover
|
except KeyError: # pragma: no cover
|
||||||
rowdata['y4'] = 0*rowdata.loc[:, 'time']
|
rowdata['y4'] = 0*rowdata.loc[:, 'time']
|
||||||
rowdata[yparam4] = rowdata['y4']
|
rowdata[yparam4] = rowdata['y4']
|
||||||
|
|
||||||
|
# replace nans
|
||||||
|
rowdata.fillna(value=0, inplace=True)
|
||||||
|
|
||||||
|
data_dict = rowdata.to_dict("records")
|
||||||
|
|
||||||
|
metrics_list = [{'name': name, 'rowingmetrics':d } for name, d in metrics.rowingmetrics]
|
||||||
|
|
||||||
|
chart_data = {
|
||||||
|
'title': row.name,
|
||||||
|
'x': xparam,
|
||||||
|
'y1': yparam1,
|
||||||
|
'y2': yparam2,
|
||||||
|
'y3': yparam3,
|
||||||
|
'y4': yparam4,
|
||||||
|
'data': data_dict,
|
||||||
|
'metrics': metrics_list,
|
||||||
|
}
|
||||||
|
|
||||||
|
script, div = get_chart("/stacked", chart_data)
|
||||||
|
|
||||||
|
return script, div
|
||||||
|
|
||||||
if xparam == 'time':
|
if xparam == 'time':
|
||||||
xaxmax = tseconds.max()
|
xaxmax = tseconds.max()
|
||||||
|
|||||||
@@ -8,16 +8,8 @@
|
|||||||
{% localtime on %}
|
{% localtime on %}
|
||||||
{% block main %}
|
{% block main %}
|
||||||
|
|
||||||
{{ js_res | safe }}
|
<script src="https://d3js.org/d3.v6.js"></script>
|
||||||
{{ css_res| safe }}
|
|
||||||
|
|
||||||
<script src="https://cdn.pydata.org/bokeh/release/bokeh-3.1.1.min.js"></script>
|
|
||||||
<script src="https://cdn.pydata.org/bokeh/release/bokeh-widgets-3.1.1.min.js"></script>
|
|
||||||
<script async="true" type="text/javascript">
|
|
||||||
Bokeh.set_log_level("info");
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{{ the_script |safe }}
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
{% if workout|previousworkout:rower.user %}
|
{% if workout|previousworkout:rower.user %}
|
||||||
@@ -34,6 +26,7 @@
|
|||||||
<h1>Chart Stack</h1>
|
<h1>Chart Stack</h1>
|
||||||
|
|
||||||
<ul class="main-content">
|
<ul class="main-content">
|
||||||
|
<canvas hidden id="canvas"></canvas>
|
||||||
<li class="grid_4">
|
<li class="grid_4">
|
||||||
<div id="theplot">
|
<div id="theplot">
|
||||||
{{ the_div|safe }}
|
{{ the_div|safe }}
|
||||||
@@ -57,6 +50,7 @@
|
|||||||
</form>
|
</form>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
{{ the_script |safe }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% endlocaltime %}
|
{% endlocaltime %}
|
||||||
|
|||||||
@@ -4500,7 +4500,7 @@ def workout_flexchart_stacked_view(request, *args, **kwargs):
|
|||||||
yparam4 = cd['yaxis4']
|
yparam4 = cd['yaxis4']
|
||||||
|
|
||||||
(
|
(
|
||||||
script, div, js_resources, css_resources, comment
|
script, div
|
||||||
) = interactive_flexchart_stacked(
|
) = interactive_flexchart_stacked(
|
||||||
encoder.decode_hex(id), r, xparam=xparam,
|
encoder.decode_hex(id), r, xparam=xparam,
|
||||||
yparam1=yparam1,
|
yparam1=yparam1,
|
||||||
@@ -4510,9 +4510,6 @@ def workout_flexchart_stacked_view(request, *args, **kwargs):
|
|||||||
mode=workout.workouttype,
|
mode=workout.workouttype,
|
||||||
)
|
)
|
||||||
|
|
||||||
if comment is not None: # pragma: no cover
|
|
||||||
messages.error(request, comment)
|
|
||||||
|
|
||||||
initial = {
|
initial = {
|
||||||
'xaxis': xparam,
|
'xaxis': xparam,
|
||||||
'yaxis1': yparam1,
|
'yaxis1': yparam1,
|
||||||
@@ -4549,8 +4546,6 @@ def workout_flexchart_stacked_view(request, *args, **kwargs):
|
|||||||
'active': 'nav-workouts',
|
'active': 'nav-workouts',
|
||||||
'workout': workout,
|
'workout': workout,
|
||||||
'chartform': flexaxesform,
|
'chartform': flexaxesform,
|
||||||
'js_res': js_resources,
|
|
||||||
'css_res': css_resources,
|
|
||||||
'id': id,
|
'id': id,
|
||||||
'xparam': xparam,
|
'xparam': xparam,
|
||||||
'yparam1': yparam1,
|
'yparam1': yparam1,
|
||||||
|
|||||||
Reference in New Issue
Block a user