Private
Public Access
1
0

Merge branch 'develop' into feature/sensorfusion

This commit is contained in:
Sander Roosendaal
2017-03-04 22:24:35 +01:00
9 changed files with 460 additions and 374 deletions

View File

@@ -8,7 +8,7 @@ from rowers.tasks import handle_sendemail_unrecognized
from rowingdata import rower as rrower
from rowingdata import main as rmain
from rowingdata import get_file_type
from rowingdata import get_file_type,get_empower_rigging
from pandas import DataFrame,Series
from pytz import timezone as tz,utc
@@ -31,7 +31,7 @@ import os
import pandas as pd
import numpy as np
import itertools
import math
from tasks import handle_sendemail_unrecognized
from django.conf import settings
@@ -102,6 +102,11 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True,
except KeyError:
pass
try:
datadf['hr'] = datadf['hr']+10
except KeyError:
pass
datadf=datadf.clip(lower=0)
datadf.replace(to_replace=0,value=np.nan,inplace=True)
@@ -116,6 +121,11 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True,
except KeyError:
pass
try:
datadf['hr'] = datadf['hr']-10
except KeyError:
pass
# clean data for useful ranges per column
if not ignorehr:
try:
@@ -222,11 +232,11 @@ def clean_df_stats(datadf,workstrokesonly=True,ignorehr=True,
pass
try:
mask = datadf['catch'] > -30.
datadf.loc[mask,'catch'] = np.nan
except KeyError:
pass
try:
mask = datadf['catch'] > -30.
datadf.loc[mask,'catch'] = np.nan
except KeyError:
pass
workoutstateswork = [1,4,5,8,9,6,7]
@@ -326,7 +336,8 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower',
dosummary=True,title='Workout',
notes='',totaldist=0,totaltime=0,
summary='',
makeprivate=False):
makeprivate=False,
oarlength=2.89,inboard=0.88):
message = None
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,
@@ -432,7 +443,7 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower',
privacy = 'visible'
# check for duplicate start times
ws = Workout.objects.filter(starttime=workoutstarttime,
ws = Workout.objects.filter(startdatetime=workoutstartdatetime,
user=r)
if (len(ws) != 0):
message = "Warning: This workout probably already exists in the database"
@@ -446,6 +457,7 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower',
csvfilename=f2,notes=notes,summary=summary,
maxhr=maxhr,averagehr=averagehr,
startdatetime=workoutstartdatetime,
inboard=inboard,oarlength=oarlength,
privacy=privacy)
@@ -458,11 +470,13 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower',
# put stroke data in database
res = dataprep(row.df,id=w.id,bands=True,
barchart=True,otwpower=True,empower=True)
barchart=True,otwpower=True,empower=True,inboard=inboard)
return (w.id,message)
def handle_nonpainsled(f2,fileformat,summary=''):
oarlength = 2.89
inboard = 0.88
# handle RowPro:
if (fileformat == 'rp'):
row = RowProParser(f2)
@@ -506,6 +520,7 @@ def handle_nonpainsled(f2,fileformat,summary=''):
if (fileformat == 'speedcoach2'):
row = SpeedCoach2Parser(f2)
try:
oarlength,inboard = get_empower_rigging(f2)
summary = row.allstats()
except:
pass
@@ -534,7 +549,7 @@ def handle_nonpainsled(f2,fileformat,summary=''):
except:
os.remove(f_to_be_deleted+'.gz')
return (f2,summary)
return (f2,summary,oarlength,inboard)
# Create new workout from file and store it in the database
# This routine should be used everywhere in views.py and mailprocessing.py
@@ -547,6 +562,8 @@ def new_workout_from_file(r,f2,
message = None
fileformat = get_file_type(f2)
summary = ''
oarlength = 2.89
inboard = 0.88
if len(fileformat)==3 and fileformat[0]=='zip':
f_to_be_deleted = f2
with zipfile.ZipFile(f2) as z:
@@ -590,7 +607,7 @@ def new_workout_from_file(r,f2,
# handle non-Painsled by converting it to painsled compatible CSV
if (fileformat != 'csv'):
f2,summary = handle_nonpainsled(f2,fileformat,summary=summary)
f2,summary,oarlength,inboard = handle_nonpainsled(f2,fileformat,summary=summary)
dosummary = (fileformat != 'fit')
@@ -599,6 +616,7 @@ def new_workout_from_file(r,f2,
makeprivate=makeprivate,
dosummary=dosummary,
summary=summary,
inboard=inboard,oarlength=oarlength,
title=title)
return (id,message,f2)
@@ -905,7 +923,7 @@ def datafusion(id1,id2,columns,offset):
# saves it to the stroke_data table in the database
# Takes a rowingdata object's DataFrame as input
def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True,
empower=True):
empower=True,inboard=0.88):
rowdatadf.set_index([range(len(rowdatadf))],inplace=True)
t = rowdatadf.ix[:,'TimeStamp (sec)']
t = pd.Series(t-rowdatadf.ix[0,'TimeStamp (sec)'])
@@ -1018,8 +1036,15 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True,
finish = rowdatadf.ix[:,'finish']
peakforceangle = rowdatadf.ix[:,'peakforceangle']
driveenergy = rowdatadf.ix[:,'driveenergy']
drivelength = driveenergy/(averageforce*4.44822)
arclength = (inboard-0.05)*(np.radians(finish)-np.radians(catch))
if arclength.mean()>0:
drivelength = arclength
else:
drivelength = driveenergy/(averageforce*4.44822)
slip = rowdatadf.ix[:,'slip']
totalangle = finish-catch
effectiveangle = finish-wash-catch-slip
if windowsize > 3 and windowsize<len(slip):
wash = savgol_filter(wash,windowsize,3)
slip = savgol_filter(slip,windowsize,3)
@@ -1028,6 +1053,8 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True,
peakforceangle = savgol_filter(peakforceangle,windowsize,3)
driveenergy = savgol_filter(driveenergy,windowsize,3)
drivelength = savgol_filter(drivelength,windowsize,3)
totalangle = savgol_filter(totalangle,windowsize,3)
effectiveangle = savgol_filter(effectiveangle,windowsize,3)
data['wash'] = wash
data['catch'] = catch
data['slip'] = slip
@@ -1035,6 +1062,8 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True,
data['peakforceangle'] = peakforceangle
data['driveenergy'] = driveenergy
data['drivelength'] = drivelength
data['totalangle'] = totalangle
data['effectiveangle'] = effectiveangle
except KeyError:
pass