First version of gold medal chart
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user