Private
Public Access
1
0

some testing, some pandas to polars in tasks.py

This commit is contained in:
2024-04-17 13:35:02 +02:00
parent 4e05799e35
commit af62267996
9 changed files with 35 additions and 507 deletions

View File

@@ -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