moved data field prep for stats to dataprep from views
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# All the data preparation, data cleaning and data mangling should
|
# All the data preparation, data cleaning and data mangling should
|
||||||
# be defined here
|
# be defined here
|
||||||
from rowers.models import Workout, User, Rower
|
from rowers.models import Workout, User, Rower,StrokeData
|
||||||
from rowingdata import rowingdata as rrdata
|
from rowingdata import rowingdata as rrdata
|
||||||
|
|
||||||
from rowers.tasks import handle_sendemail_unrecognized
|
from rowers.tasks import handle_sendemail_unrecognized
|
||||||
@@ -67,6 +67,98 @@ from scipy.signal import savgol_filter
|
|||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
def clean_df_stats(datadf,workstrokesonly=True):
|
||||||
|
# clean data remove zeros and negative values
|
||||||
|
datadf=datadf.clip(lower=0)
|
||||||
|
datadf.replace(to_replace=0,value=np.nan,inplace=True)
|
||||||
|
|
||||||
|
# clean data for useful ranges per column
|
||||||
|
mask = datadf['hr'] < 30
|
||||||
|
datadf.loc[mask,'hr'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['rhythm'] < 5
|
||||||
|
datadf.loc[mask,'rhythm'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['rhythm'] > 70
|
||||||
|
datadf.loc[mask,'rhythm'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['power'] < 20
|
||||||
|
datadf.loc[mask,'power'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['drivelength'] < 0.5
|
||||||
|
datadf.loc[mask,'drivelength'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['forceratio'] < 0.2
|
||||||
|
datadf.loc[mask,'forceratio'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['forceratio'] > 1.0
|
||||||
|
datadf.loc[mask,'forceratio'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['spm'] < 10
|
||||||
|
datadf.loc[mask,'spm'] = np.nan
|
||||||
|
|
||||||
|
|
||||||
|
mask = datadf['spm'] > 60
|
||||||
|
datadf.loc[mask,'spm'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['drivespeed'] < 0.5
|
||||||
|
datadf.loc[mask,'drivespeed'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['drivespeed'] > 4
|
||||||
|
datadf.loc[mask,'drivespeed'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['driveenergy'] > 2000
|
||||||
|
datadf.loc[mask,'driveenergy'] = np.nan
|
||||||
|
|
||||||
|
mask = datadf['driveenergy'] < 100
|
||||||
|
datadf.loc[mask,'driveenergy'] = np.nan
|
||||||
|
|
||||||
|
workoutstateswork = [1,4,5,8,9,6,7]
|
||||||
|
workoutstatesrest = [3]
|
||||||
|
workoutstatetransition = [0,2,10,11,12,13]
|
||||||
|
|
||||||
|
if workstrokesonly=='True' or workstrokesonly==True:
|
||||||
|
try:
|
||||||
|
datadf = datadf[~datadf['workoutstate'].isin(workoutstatesrest)]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return datadf
|
||||||
|
|
||||||
|
def getstatsfields():
|
||||||
|
# Get field names and remove those that are not useful in stats
|
||||||
|
fields = StrokeData._meta.get_fields()
|
||||||
|
|
||||||
|
fielddict = {field.name:field.verbose_name for field in fields}
|
||||||
|
|
||||||
|
fielddict.pop('workoutid')
|
||||||
|
fielddict.pop('ergpace')
|
||||||
|
fielddict.pop('hr_an')
|
||||||
|
fielddict.pop('hr_tr')
|
||||||
|
fielddict.pop('hr_at')
|
||||||
|
fielddict.pop('hr_ut2')
|
||||||
|
fielddict.pop('hr_ut1')
|
||||||
|
fielddict.pop('time')
|
||||||
|
fielddict.pop('distance')
|
||||||
|
fielddict.pop('nowindpace')
|
||||||
|
fielddict.pop('fnowindpace')
|
||||||
|
fielddict.pop('fergpace')
|
||||||
|
fielddict.pop('equivergpower')
|
||||||
|
# fielddict.pop('workoutstate')
|
||||||
|
fielddict.pop('fpace')
|
||||||
|
fielddict.pop('pace')
|
||||||
|
fielddict.pop('id')
|
||||||
|
fielddict.pop('ftime')
|
||||||
|
fielddict.pop('x_right')
|
||||||
|
fielddict.pop('hr_max')
|
||||||
|
fielddict.pop('hr_bottom')
|
||||||
|
fielddict.pop('cumdist')
|
||||||
|
|
||||||
|
fieldlist = [field for field,value in fielddict.iteritems()]
|
||||||
|
|
||||||
|
return fieldlist,fielddict
|
||||||
|
|
||||||
|
|
||||||
# A string representation for time deltas
|
# A string representation for time deltas
|
||||||
def niceformat(values):
|
def niceformat(values):
|
||||||
out = []
|
out = []
|
||||||
|
|||||||
@@ -83,9 +83,14 @@ class PowerZonesField(models.TextField):
|
|||||||
|
|
||||||
# For future Team functionality
|
# For future Team functionality
|
||||||
class Team(models.Model):
|
class Team(models.Model):
|
||||||
|
choices = (
|
||||||
|
('private','private'),
|
||||||
|
('open','open'),
|
||||||
|
)
|
||||||
name = models.CharField(max_length=150,unique=True)
|
name = models.CharField(max_length=150,unique=True)
|
||||||
notes = models.CharField(blank=True,max_length=200)
|
notes = models.CharField(blank=True,max_length=200)
|
||||||
manager = models.ForeignKey(User)
|
manager = models.ForeignKey(User)
|
||||||
|
private = models.CharField(max_length=30,choices=choices,default='open')
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|||||||
165
rowers/views.py
165
rowers/views.py
@@ -2738,97 +2738,17 @@ def cumstats(request,theuser=0,
|
|||||||
u = ''
|
u = ''
|
||||||
|
|
||||||
ids = [int(workout.id) for workout in allergworkouts]
|
ids = [int(workout.id) for workout in allergworkouts]
|
||||||
|
|
||||||
# Get field names and remove those that are not useful in stats
|
|
||||||
fields = StrokeData._meta.get_fields()
|
|
||||||
|
|
||||||
fielddict = {field.name:field.verbose_name for field in fields}
|
|
||||||
|
|
||||||
|
|
||||||
fielddict.pop('workoutid')
|
|
||||||
fielddict.pop('ergpace')
|
|
||||||
fielddict.pop('hr_an')
|
|
||||||
fielddict.pop('hr_tr')
|
|
||||||
fielddict.pop('hr_at')
|
|
||||||
fielddict.pop('hr_ut2')
|
|
||||||
fielddict.pop('hr_ut1')
|
|
||||||
fielddict.pop('time')
|
|
||||||
fielddict.pop('distance')
|
|
||||||
fielddict.pop('nowindpace')
|
|
||||||
fielddict.pop('fnowindpace')
|
|
||||||
fielddict.pop('fergpace')
|
|
||||||
fielddict.pop('equivergpower')
|
|
||||||
# fielddict.pop('workoutstate')
|
|
||||||
fielddict.pop('fpace')
|
|
||||||
fielddict.pop('pace')
|
|
||||||
fielddict.pop('id')
|
|
||||||
fielddict.pop('ftime')
|
|
||||||
fielddict.pop('x_right')
|
|
||||||
fielddict.pop('hr_max')
|
|
||||||
fielddict.pop('hr_bottom')
|
|
||||||
fielddict.pop('cumdist')
|
|
||||||
|
|
||||||
fieldlist,fielddict = dataprep.getstatsfields()
|
fieldlist,fielddict = dataprep.getstatsfields()
|
||||||
|
|
||||||
# prepare data frame
|
# prepare data frame
|
||||||
datadf = dataprep.read_cols_df_sql(ids,fieldlist)
|
datadf = dataprep.read_cols_df_sql(ids,fieldlist)
|
||||||
|
|
||||||
# clean data remove zeros and negative values
|
|
||||||
datadf=datadf.clip(lower=0)
|
|
||||||
datadf.replace(to_replace=0,value=np.nan,inplace=True)
|
|
||||||
|
|
||||||
# clean data for useful ranges per column
|
|
||||||
mask = datadf['hr'] < 30
|
|
||||||
datadf.loc[mask,'hr'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['rhythm'] < 5
|
|
||||||
datadf.loc[mask,'rhythm'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['rhythm'] > 70
|
|
||||||
datadf.loc[mask,'rhythm'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['power'] < 20
|
|
||||||
datadf.loc[mask,'power'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['drivelength'] < 0.5
|
|
||||||
datadf.loc[mask,'drivelength'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['forceratio'] < 0.2
|
|
||||||
datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly)
|
datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly)
|
||||||
|
|
||||||
mask = datadf['forceratio'] > 1.0
|
|
||||||
datadf.loc[mask,'forceratio'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['spm'] < 10
|
|
||||||
datadf.loc[mask,'spm'] = np.nan
|
|
||||||
|
|
||||||
|
|
||||||
mask = datadf['spm'] > 60
|
|
||||||
datadf.loc[mask,'spm'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['drivespeed'] < 0.5
|
|
||||||
datadf.loc[mask,'drivespeed'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['drivespeed'] > 4
|
|
||||||
datadf.loc[mask,'drivespeed'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['driveenergy'] > 2000
|
|
||||||
datadf.loc[mask,'driveenergy'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['driveenergy'] < 100
|
|
||||||
|
|
||||||
|
|
||||||
if datadf.empty:
|
if datadf.empty:
|
||||||
return HttpResponse("No data found")
|
return HttpResponse("No data found")
|
||||||
|
|
||||||
workoutstateswork = [1,4,5,8,9,6,7]
|
|
||||||
workoutstatesrest = [3]
|
|
||||||
workoutstatetransition = [0,2,10,11,12,13]
|
|
||||||
|
|
||||||
if workstrokesonly=='True' or workstrokesonly==True:
|
|
||||||
try:
|
|
||||||
datadf = datadf[~datadf['workoutstate'].isin(workoutstatesrest)]
|
|
||||||
except:
|
|
||||||
|
|
||||||
|
|
||||||
# Create stats
|
# Create stats
|
||||||
@@ -2908,51 +2828,8 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
|
|||||||
message = "You are not allowed to see the stats of this workout"
|
message = "You are not allowed to see the stats of this workout"
|
||||||
url = reverse(workouts_view,args=[str(message)])
|
url = reverse(workouts_view,args=[str(message)])
|
||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly)
|
datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly)
|
||||||
|
|
||||||
# clean data remove zeros and negative values
|
|
||||||
datadf=datadf.clip(lower=0)
|
|
||||||
datadf.replace(to_replace=0,value=np.nan,inplace=True)
|
|
||||||
|
|
||||||
# clean data for useful ranges per column
|
|
||||||
mask = datadf['hr'] < 30
|
|
||||||
datadf.loc[mask,'hr'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['rhythm'] < 5
|
|
||||||
datadf.loc[mask,'rhythm'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['rhythm'] > 70
|
|
||||||
datadf.loc[mask,'rhythm'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['power'] < 20
|
|
||||||
datadf.loc[mask,'power'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['drivelength'] < 0.5
|
|
||||||
datadf.loc[mask,'drivelength'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['forceratio'] < 0.2
|
|
||||||
datadf.loc[mask,'forceratio'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['forceratio'] > 1.0
|
|
||||||
datadf.loc[mask,'forceratio'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['spm'] < 10
|
|
||||||
datadf.loc[mask,'spm'] = np.nan
|
|
||||||
|
|
||||||
|
|
||||||
mask = datadf['spm'] > 60
|
|
||||||
datadf.loc[mask,'spm'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['drivespeed'] < 0.5
|
|
||||||
datadf.loc[mask,'drivespeed'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['drivespeed'] > 4
|
|
||||||
datadf.loc[mask,'drivespeed'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['driveenergy'] > 2000
|
|
||||||
datadf.loc[mask,'driveenergy'] = np.nan
|
|
||||||
|
|
||||||
mask = datadf['driveenergy'] < 100
|
|
||||||
|
|
||||||
|
|
||||||
if datadf.empty:
|
if datadf.empty:
|
||||||
@@ -2961,44 +2838,12 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
|
|||||||
workoutstateswork = [1,4,5,8,9,6,7]
|
workoutstateswork = [1,4,5,8,9,6,7]
|
||||||
workoutstatesrest = [3]
|
workoutstatesrest = [3]
|
||||||
workoutstatetransition = [0,2,10,11,12,13]
|
workoutstatetransition = [0,2,10,11,12,13]
|
||||||
|
|
||||||
if workstrokesonly=='True' or workstrokesonly==True:
|
|
||||||
try:
|
|
||||||
datadf = datadf[~datadf['workoutstate'].isin(workoutstatesrest)]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# Create stats
|
# Create stats
|
||||||
stats = {}
|
stats = {}
|
||||||
|
|
||||||
# Get field names and remove those that are not useful in stats
|
fieldlist,fielddict = dataprep.getstatsfields()
|
||||||
fields = StrokeData._meta.get_fields()
|
|
||||||
|
|
||||||
fielddict = {field.name:field.verbose_name for field in fields}
|
|
||||||
|
|
||||||
|
|
||||||
fielddict.pop('workoutid')
|
|
||||||
fielddict.pop('ergpace')
|
|
||||||
fielddict.pop('hr_an')
|
|
||||||
fielddict.pop('hr_tr')
|
|
||||||
fielddict.pop('hr_at')
|
|
||||||
fielddict.pop('hr_ut2')
|
|
||||||
fielddict.pop('hr_ut1')
|
|
||||||
fielddict.pop('time')
|
|
||||||
fielddict.pop('distance')
|
|
||||||
fielddict.pop('nowindpace')
|
|
||||||
fielddict.pop('fnowindpace')
|
|
||||||
fielddict.pop('fergpace')
|
|
||||||
fielddict.pop('equivergpower')
|
|
||||||
fielddict.pop('workoutstate')
|
|
||||||
fielddict.pop('fpace')
|
|
||||||
fielddict.pop('pace')
|
|
||||||
fielddict.pop('id')
|
|
||||||
fielddict.pop('ftime')
|
|
||||||
fielddict.pop('x_right')
|
|
||||||
fielddict.pop('hr_max')
|
|
||||||
fielddict.pop('hr_bottom')
|
|
||||||
|
|
||||||
|
|
||||||
for field,verbosename in fielddict.iteritems():
|
for field,verbosename in fielddict.iteritems():
|
||||||
|
|||||||
Reference in New Issue
Block a user