some testing, some pandas to polars in tasks.py
This commit is contained in:
@@ -61,7 +61,7 @@ from rowers.models import (
|
||||
Workout, User, Rower, WorkoutForm, RowerForm,
|
||||
GraphImage, GeoPolygon, GeoCourse, GeoPoint,
|
||||
)
|
||||
from rowers.tasks import handle_setcp
|
||||
|
||||
from rowingdata import rower as rrower
|
||||
from rowingdata import main as rmain
|
||||
from rowingdata import cumcpdata, histodata
|
||||
@@ -1380,7 +1380,7 @@ def interactive_chart(id=0, promember=0, intervaldata={}):
|
||||
|
||||
columns = ['time', 'pace', 'hr', 'fpace', 'ftime', 'spm']
|
||||
datadf = dataprep.getsmallrowdata_pl(columns, ids=[id])
|
||||
if datadf.is_empty():
|
||||
if datadf.is_eompty():
|
||||
return "", "No Valid Data Available"
|
||||
|
||||
datadf = datadf.fill_nan(None).drop_nulls()
|
||||
@@ -2372,223 +2372,6 @@ def get_zones_report_pl(rower, startdate, enddate, trainingzones='hr', date_agg=
|
||||
|
||||
return chart_data
|
||||
|
||||
|
||||
|
||||
def get_zones_report(rower, startdate, enddate, trainingzones='hr', date_agg='week',
|
||||
yaxis='time'):
|
||||
|
||||
dates = []
|
||||
dates_sorting = []
|
||||
minutes = []
|
||||
hours = []
|
||||
zones = []
|
||||
|
||||
enddate = enddate + datetime.timedelta(days=1)
|
||||
|
||||
workouts = Workout.objects.filter(
|
||||
user=rower,
|
||||
startdatetime__gte=startdate,
|
||||
startdatetime__lte=enddate,
|
||||
duplicate=False,
|
||||
).order_by("-startdatetime")
|
||||
|
||||
ids = [w.id for w in workouts]
|
||||
|
||||
columns = ['workoutid', 'hr', 'power', 'time']
|
||||
|
||||
df = dataprep.getsmallrowdata_db(columns, ids=ids)
|
||||
try:
|
||||
df['deltat'] = df['time'].diff().clip(lower=0).clip(upper=20*1e3)
|
||||
except KeyError: # pragma: no cover
|
||||
pass
|
||||
|
||||
df = dataprep.clean_df_stats(df, workstrokesonly=False,
|
||||
ignoreadvanced=True, ignorehr=False)
|
||||
|
||||
hrzones = rower.hrzones
|
||||
powerzones = rower.powerzones
|
||||
|
||||
for w in workouts:
|
||||
dd3 = w.date.strftime('%Y/%m')
|
||||
dd4 = '{year}/{week:02d}'.format(
|
||||
week=arrow.get(w.date).isocalendar()[1],
|
||||
year=w.date.strftime('%y')
|
||||
)
|
||||
dd4 = (w.date - datetime.timedelta(days=w.date.weekday())
|
||||
).strftime('%y/%m/%d')
|
||||
|
||||
# print(w.date,arrow.get(w.date),arrow.get(w.date).isocalendar())
|
||||
iswater = w.workouttype in mytypes.otwtypes
|
||||
qryw = 'workoutid == {workoutid}'.format(workoutid=w.id)
|
||||
|
||||
qry = 'hr < {ut2}'.format(ut2=rower.ut2)
|
||||
if trainingzones == 'power':
|
||||
qry = 'power < {ut2}'.format(ut2=rower.pw_ut2)
|
||||
timeinzone = df.query(qry).query(qryw)['deltat'].sum()/(60*1e3)
|
||||
if date_agg == 'week':
|
||||
dates.append(dd4)
|
||||
dates_sorting.append(dd4)
|
||||
else: # pragma: no cover
|
||||
dates.append(dd3)
|
||||
dates_sorting.append(dd3)
|
||||
minutes.append(timeinzone)
|
||||
hours.append(timeinzone/60.)
|
||||
if trainingzones == 'hr':
|
||||
zones.append('<{ut2}'.format(ut2=hrzones[1]))
|
||||
else:
|
||||
zones.append('<{ut2}'.format(ut2=powerzones[1]))
|
||||
# print(w,dd,timeinzone,'<UT2')
|
||||
|
||||
qry = '{ut2} <= hr < {ut1}'.format(ut1=rower.ut1, ut2=rower.ut2)
|
||||
if trainingzones == 'power':
|
||||
qry = '{ut2} <= power < {ut1}'.format(
|
||||
ut1=rower.pw_ut1, ut2=rower.pw_ut2)
|
||||
if iswater:
|
||||
qry = '{ut2} <= power < {ut1}'.format(
|
||||
ut1=rower.pw_ut1*rower.otwslack/100., ut2=rower.pw_ut2*rower.otwslack/100.)
|
||||
timeinzone = df.query(qry).query(qryw)['deltat'].sum()/(60*1e3)
|
||||
if date_agg == 'week':
|
||||
dates.append(dd4)
|
||||
dates_sorting.append(dd4)
|
||||
else: # pragma: no cover
|
||||
dates.append(dd3)
|
||||
dates_sorting.append(dd3)
|
||||
minutes.append(timeinzone)
|
||||
hours.append(timeinzone/60.)
|
||||
if trainingzones == 'hr':
|
||||
zones.append(hrzones[1])
|
||||
else:
|
||||
zones.append(powerzones[1])
|
||||
# print(w,dd,timeinzone,'UT2')
|
||||
|
||||
qry = '{ut1} <= hr < {at}'.format(ut1=rower.ut1, at=rower.at)
|
||||
if trainingzones == 'power':
|
||||
qry = '{ut1} <= power < {at}'.format(
|
||||
ut1=rower.pw_ut1, at=rower.pw_at)
|
||||
if iswater:
|
||||
qry = '{ut1} <= power < {at}'.format(
|
||||
ut1=rower.pw_ut1*rower.otwslack/100., at=rower.pw_at*rower.otwslack/100.)
|
||||
timeinzone = df.query(qry).query(qryw)['deltat'].sum()/(60*1e3)
|
||||
if date_agg == 'week':
|
||||
dates.append(dd4)
|
||||
dates_sorting.append(dd4)
|
||||
else: # pragma: no cover
|
||||
dates.append(dd3)
|
||||
dates_sorting.append(dd3)
|
||||
minutes.append(timeinzone)
|
||||
hours.append(timeinzone/60.)
|
||||
if trainingzones == 'hr':
|
||||
zones.append(hrzones[2])
|
||||
else:
|
||||
zones.append(powerzones[2])
|
||||
# print(w,dd,timeinzone,'UT1')
|
||||
|
||||
qry = '{at} <= hr < {tr}'.format(at=rower.at, tr=rower.tr)
|
||||
if trainingzones == 'power':
|
||||
qry = '{at} <= power < {tr}'.format(at=rower.pw_at, tr=rower.pw_tr)
|
||||
if iswater:
|
||||
qry = '{at} <= power < {tr}'.format(at=rower.pw_at*rower.otwslack/100.,
|
||||
tr=rower.pw_tr*rower.otwslack/100.)
|
||||
timeinzone = df.query(qry).query(qryw)['deltat'].sum()/(60*1e3)
|
||||
if date_agg == 'week':
|
||||
dates.append(dd4)
|
||||
dates_sorting.append(dd4)
|
||||
else: # pragma: no cover
|
||||
dates.append(dd3)
|
||||
dates_sorting.append(dd3)
|
||||
minutes.append(timeinzone)
|
||||
hours.append(timeinzone/60.)
|
||||
if trainingzones == 'hr':
|
||||
zones.append(hrzones[3])
|
||||
else:
|
||||
zones.append(powerzones[3])
|
||||
# print(w,dd,timeinzone,'AT')
|
||||
|
||||
qry = '{tr} <= hr < {an}'.format(tr=rower.tr, an=rower.an)
|
||||
if trainingzones == 'power':
|
||||
qry = '{tr} <= power < {an}'.format(tr=rower.pw_tr, an=rower.pw_an)
|
||||
if iswater:
|
||||
qry = '{tr} <= power < {an}'.format(tr=rower.pw_tr*rower.otwslack/100.,
|
||||
an=rower.pw_an*rower.otwslack/100.)
|
||||
timeinzone = df.query(qry).query(qryw)['deltat'].sum()/(60*1e3)
|
||||
if date_agg == 'week':
|
||||
dates.append(dd4)
|
||||
dates_sorting.append(dd4)
|
||||
else: # pragma: no cover
|
||||
dates.append(dd3)
|
||||
dates_sorting.append(dd3)
|
||||
minutes.append(timeinzone)
|
||||
hours.append(timeinzone/60.)
|
||||
if trainingzones == 'hr':
|
||||
zones.append(hrzones[4])
|
||||
else:
|
||||
zones.append(powerzones[4])
|
||||
# print(w,dd,timeinzone,'TR')
|
||||
|
||||
qry = 'hr >= {an}'.format(an=rower.an)
|
||||
if trainingzones == 'power':
|
||||
qry = 'power >= {an}'.format(an=rower.pw_an)
|
||||
if iswater:
|
||||
qry = 'power >= {an}'.format(an=rower.pw_an*rower.otwslack/100.)
|
||||
timeinzone = df.query(qry).query(qryw)['deltat'].sum()/(60*1e3)
|
||||
if date_agg == 'week':
|
||||
dates.append(dd4)
|
||||
dates_sorting.append(dd4)
|
||||
else: # pragma: no cover
|
||||
dates.append(dd3)
|
||||
dates_sorting.append(dd3)
|
||||
minutes.append(timeinzone)
|
||||
hours.append(timeinzone/60.)
|
||||
if trainingzones == 'hr':
|
||||
zones.append(hrzones[5])
|
||||
else:
|
||||
zones.append(powerzones[5])
|
||||
# print(w,dd,timeinzone,'AN')
|
||||
|
||||
try:
|
||||
d = utc.localize(startdate)
|
||||
except (ValueError, AttributeError): # pragma: no cover
|
||||
d = startdate
|
||||
|
||||
try:
|
||||
enddate = utc.localize(enddate)
|
||||
except (ValueError, AttributeError): # pragma: no cover
|
||||
pass
|
||||
|
||||
while d <= enddate:
|
||||
if date_agg == 'week':
|
||||
dd4 = '{year}/{week:02d}'.format(
|
||||
week=arrow.get(d).isocalendar()[1],
|
||||
year=d.strftime('%y')
|
||||
)
|
||||
dd4 = (d - datetime.timedelta(days=d.weekday())).strftime('%y/%m/%d')
|
||||
|
||||
dates.append(dd4)
|
||||
dates_sorting.append(dd4)
|
||||
else: # pragma: no cover
|
||||
dates.append(d.strftime('%Y/%m'))
|
||||
dates_sorting.append(d.strftime('%Y/%m'))
|
||||
|
||||
minutes.append(0)
|
||||
hours.append(0)
|
||||
if trainingzones == 'hr':
|
||||
zones.append(hrzones[1])
|
||||
else:
|
||||
zones.append(powerzones[1])
|
||||
|
||||
d += datetime.timedelta(days=1)
|
||||
|
||||
# this should be renamed with rower zones
|
||||
data = {
|
||||
'date': dates,
|
||||
'date_sorting': dates_sorting,
|
||||
'minutes': minutes,
|
||||
'zones': zones,
|
||||
'hours': hours,
|
||||
}
|
||||
|
||||
|
||||
return data
|
||||
|
||||
def interactive_zoneschart2(rower, data, startdate, enddate, trainingzones='hr', date_agg='week',
|
||||
yaxis='time'):
|
||||
@@ -2621,133 +2404,3 @@ def interactive_zoneschart2(rower, data, startdate, enddate, trainingzones='hr',
|
||||
return script, div
|
||||
|
||||
|
||||
def interactive_zoneschart(rower, data, startdate, enddate, trainingzones='hr', date_agg='week',
|
||||
yaxis='time'):
|
||||
if startdate >= enddate: # pragma: no cover
|
||||
st = startdate
|
||||
startdate = enddate
|
||||
enddate = st
|
||||
|
||||
hrzones = rower.hrzones
|
||||
powerzones = rower.powerzones
|
||||
|
||||
color_map = {
|
||||
'<{ut2}'.format(ut2=hrzones[1]): 'green',
|
||||
hrzones[1]: 'lime',
|
||||
hrzones[2]: 'yellow',
|
||||
hrzones[3]: 'blue',
|
||||
hrzones[4]: 'purple',
|
||||
hrzones[5]: 'red',
|
||||
}
|
||||
if trainingzones == 'power':
|
||||
color_map = {
|
||||
'<{ut2}'.format(ut2=powerzones[1]): 'green',
|
||||
powerzones[1]: 'lime',
|
||||
powerzones[2]: 'yellow',
|
||||
powerzones[3]: 'blue',
|
||||
powerzones[4]: 'purple',
|
||||
powerzones[5]: 'red',
|
||||
}
|
||||
|
||||
zones_order = [
|
||||
'<{ut2}'.format(ut2=hrzones[1]),
|
||||
hrzones[1],
|
||||
hrzones[2],
|
||||
hrzones[3],
|
||||
hrzones[4],
|
||||
hrzones[5]
|
||||
]
|
||||
|
||||
if trainingzones == 'power':
|
||||
zones_order = [
|
||||
'<{ut2}'.format(ut2=powerzones[1]),
|
||||
powerzones[1],
|
||||
powerzones[2],
|
||||
powerzones[3],
|
||||
powerzones[4],
|
||||
powerzones[5]
|
||||
]
|
||||
|
||||
df = pd.DataFrame(data)
|
||||
df2 = pd.DataFrame(data)
|
||||
|
||||
df.drop('minutes', inplace=True, axis='columns')
|
||||
|
||||
df.sort_values('date_sorting', inplace=True)
|
||||
df.drop('date_sorting', inplace=True, axis='columns')
|
||||
df['totaltime'] = 0
|
||||
if df.empty: # pragma: no cover
|
||||
return '', 'No Data Found'
|
||||
|
||||
if yaxis == 'percentage':
|
||||
dates = list(set(df['date'].values))
|
||||
for date in dates:
|
||||
qry = 'date == "{d}"'.format(d=date)
|
||||
|
||||
totaltime = df.query(qry)['hours'].sum()
|
||||
|
||||
mask = df['date'] == date
|
||||
df.loc[mask, 'totaltime'] = totaltime
|
||||
|
||||
df['percentage'] = 100.*df['hours']/df['totaltime']
|
||||
df.drop('hours', inplace=True, axis='columns')
|
||||
df.drop('totaltime', inplace=True, axis='columns')
|
||||
|
||||
hv.extension('bokeh')
|
||||
|
||||
xrotation = 0
|
||||
nrdates = len(list(set(df['date'].values)))
|
||||
if nrdates > 10:
|
||||
xrotation = 45
|
||||
|
||||
bars = hv.Bars(df, kdims=['date', 'zones']).aggregate(
|
||||
function=np.sum).redim.values(zones=zones_order)
|
||||
|
||||
bars.opts(
|
||||
opts.Bars(cmap=color_map, show_legend=True, stacked=True,
|
||||
tools=['tap', 'hover'], width=550, padding=(0, (0, .1)),
|
||||
legend_position='bottom',
|
||||
xrotation=xrotation,
|
||||
show_frame=False)
|
||||
)
|
||||
|
||||
p = hv.render(bars)
|
||||
|
||||
p.title.text = 'Activity {d1} to {d2} for {r}'.format(
|
||||
d1=startdate.strftime("%Y-%m-%d"),
|
||||
d2=enddate.strftime("%Y-%m-%d"),
|
||||
r=str(rower),
|
||||
)
|
||||
|
||||
if date_agg == 'week':
|
||||
p.xaxis.axis_label = 'Week'
|
||||
else: # pragma: no cover
|
||||
p.xaxis.axis_label = 'Month'
|
||||
|
||||
if yaxis == 'percentage':
|
||||
p.yaxis.axis_label = 'Percentage'
|
||||
|
||||
p.width = 550
|
||||
p.height = 350
|
||||
p.toolbar_location = 'right'
|
||||
p.y_range.start = 0
|
||||
#p.sizing_mode = 'stretch_both'
|
||||
|
||||
if yaxis == 'percentage':
|
||||
tidy_df = df2.groupby(['date']).sum()
|
||||
|
||||
source2 = ColumnDataSource(tidy_df)
|
||||
y2rangemax = tidy_df.loc[:, 'hours'].max()*1.1
|
||||
p.extra_y_ranges["yax2"] = Range1d(start=0, end=y2rangemax)
|
||||
p.line('date', 'hours', source=source2,
|
||||
y_range_name="yax2", color="black", width=5)
|
||||
p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10)
|
||||
|
||||
# p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10,
|
||||
# legend_label='Hours')
|
||||
p.add_layout(LinearAxis(y_range_name="yax2",
|
||||
axis_label='Hours'), 'right')
|
||||
|
||||
script, div = components(p)
|
||||
|
||||
return script, div
|
||||
|
||||
Reference in New Issue
Block a user