Private
Public Access
1
0

First version of gold medal chart

This commit is contained in:
Sander Roosendaal
2021-01-03 20:34:40 +01:00
parent f5ad179c3c
commit b84ba9d49a
4 changed files with 390 additions and 2 deletions

View File

@@ -123,6 +123,29 @@ def newtestpowerid(x):
return x['id']
def newtestpowerdate(x):
try:
if np.isnan(x['testpower']):
return np.nan
except (AttributeError,TypeError):
return np.nan
return x['date']
def all_goldmedalstandards(workouts,startdate,enddate):
dates = []
testpowers = []
testduration = []
for w in workouts:
goldmedalstandard, goldmedalseconds = dataprep.workout_goldmedalstandard(w)
if goldmedalseconds > 60:
dates.append(arrow.get(w.date).datetime)
testpowers.append(goldmedalstandard)
testduration.append(goldmedalseconds)
return dates,testpowers,testduration
def build_goldmedalstandards(workouts,kfitness):
dates = []
testpower = []
@@ -1778,6 +1801,162 @@ def getfatigues(
return fatigues,fitnesses,dates,testpower,testduration,impulses
def goldmedalscorechart(user,startdate=None,enddate=None):
# to avoid data mess later on
startdate = arrow.get(startdate).datetime.replace(hour=0,minute=0,second=0,microsecond=0)
enddate = enddate+datetime.timedelta(days=1)
enddate = arrow.get(enddate).datetime.replace(hour=0,minute=0,second=0,microsecond=0)
TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair'
workouts = Workout.objects.filter(user=user.rower,date__gte=startdate,
date__lte=enddate,
workouttype__in=mytypes.rowtypes,
duplicate=False)
# marker workouts
dates,testpower,testduration,fatigues,fitnesses,impulses, outids = build_goldmedalstandards(
workouts,42
)
df = pd.DataFrame({
'date':dates,
'testpower':testpower,
'testduration':testduration,
})
df.sort_values(['date'],inplace=True)
df['testdup'] = df['testpower'].shift(1)
df['testpower'] = df.apply(lambda x: newtestpower(x),axis=1)
#df['date'] = df.apply(lambda x: newtestpowerdate(x), axis=1)
mask = df['testpower'].isnull()
dates = df.mask(mask)['date'].dropna().values
testpower = df.mask(mask)['testpower'].dropna().values
# all workouts
alldates,alltestpower,allduration = all_goldmedalstandards(workouts,startdate,enddate)
nrdays = (enddate-startdate).days
td = []
markerscore = []
score = []
markerduration = []
duration = []
previous = 0
for i in range(len(dates)):
dd = str(dates[i])
td.append(arrow.get(dd).datetime)
markerscore.append(testpower[i])
markerduration.append(testduration[i])
score.append(np.nan)
duration.append(np.nan)
for i in range(len(alldates)):
td.append(arrow.get(alldates[i]).datetime)
markerscore.append(np.nan)
score.append(alltestpower[i])
markerduration.append(np.nan)
duration.append(allduration[i])
for i in range(nrdays+1):
td.append(arrow.get(startdate+datetime.timedelta(days=i)).datetime)
markerscore.append(np.nan)
score.append(np.nan)
markerduration.append(np.nan)
duration.append(np.nan)
df = pd.DataFrame({
'markerscore':markerscore,
'markerduration':markerduration,
'score':score,
'duration':duration,
'date':td,
})
df.sort_values(['date'],inplace=True)
df = df.groupby(['date']).max()
df['date'] = df.index.values
source = ColumnDataSource(
data = dict(
markerscore = df['markerscore'],
score = df['score'],
markerduration = df['markerduration'].apply(lambda x:totaltime_sec_to_string(x,shorten=True)),
duration = df['duration'].apply(lambda x:totaltime_sec_to_string(x,shorten=True)),
date = df['date'],
fdate = df['date'].map(lambda x: x.strftime('%d-%m-%Y')),
)
)
plot = Figure(tools=TOOLS,x_axis_type='datetime',
plot_width=900,plot_height=600,
toolbar_location='above',
toolbar_sticky=False)
# add watermark
watermarkurl = "/static/img/logo7.png"
watermarksource = ColumnDataSource(dict(
url = [watermarkurl],))
watermarkrange = Range1d(start=0,end=1)
watermarkalpha = 0.6
watermarkx = 0.99
watermarky = 0.01
watermarkw = 184
watermarkh = 35
watermarkanchor = 'bottom_right'
plot.extra_y_ranges = {"watermark": watermarkrange}
plot.extra_x_ranges = {"watermark": watermarkrange}
plot.image_url([watermarkurl],watermarkx,watermarky,
watermarkw,watermarkh,
global_alpha=watermarkalpha,
w_units='screen',
h_units='screen',
anchor=watermarkanchor,
dilate=True,
x_range_name = "watermark",
y_range_name = "watermark",
)
plot.xaxis.axis_label = 'Date'
plot.yaxis.axis_label = 'Gold Medal Score'
plot.circle('date','score',source=source,fill_color='blue',
size=10,
legend_label='Workouts')
plot.circle('date','markerscore',source=source,fill_color='red',
size=10,
legend_label='Marker Workouts')
plot.legend.location = "top_left"
plot.x_range = Range1d(
startdate,enddate+datetime.timedelta(days=5),
)
hover = plot.select(dict(type=HoverTool))
hover.tooltips = OrderedDict([
('Marker','@markerscore{int}'),
('Test', '@markerduration'),
('Score','@score{int}'),
('Duration', '@duration'),
('Date','@fdate'),
])
script, div = components(plot)
return script, div
def performance_chart(user,startdate=None,enddate=None,kfitness=42,kfatigue=7,
metricchoice='trimp',doform=False,dofatigue=False,
showtests=False):