adding dataplep
This commit is contained in:
@@ -1417,7 +1417,6 @@ def getrowdata_db(id=0, doclean=False, convertnewtons=True,
|
||||
def getrowdata_pl(id=0, doclean=False, convertnewtons=True,
|
||||
checkefficiency=True, for_chart=False):
|
||||
data = read_df_sql(id,polars=True)
|
||||
print(data)
|
||||
try:
|
||||
data = data.with_columns(pl.col(data['time'].diff()).alias("deltat")) # data['time'].diff()
|
||||
except KeyError: # pragma: no cover
|
||||
@@ -1973,7 +1972,191 @@ def add_efficiency(id=0): # pragma: no cover
|
||||
# saves it to the stroke_data table in the database
|
||||
# Takes a rowingdata object's DataFrame as input
|
||||
|
||||
# polars
|
||||
def dataplep(rowdatadf, id=0, inboard=0.88, forceunit='lbs'):
|
||||
# rowdatadf is pd.DataFrame
|
||||
if rowdatadf.empty:
|
||||
return 0
|
||||
|
||||
df = pl.from_pandas(rowdatadf)
|
||||
|
||||
df = df.with_columns((pl.col("TimeStamp (sec)")-df[0, "TimeStamp (sec)"]).alias("TimeStamp (sec)"))
|
||||
df = df.with_columns((pl.col(" Stroke500mPace (sec/500m)").clip(1,3000)).alias(" Stroke500mPace"))
|
||||
if ' AverageBoatSpeed (m/s)' not in df.columns:
|
||||
df = df.with_columns((500./pl.col(' Stroke500mPace (sec/500m)')).alias(' AverageBoatSpeed (m/s)'))
|
||||
if ' WorkoutState' not in df.columns:
|
||||
df = df.with_columns((pl.lit(0)).alias(" WorkoutState"))
|
||||
df = df.with_columns((100.*pl.col(" DriveTime (ms)")/(pl.col(" DriveTime (ms)")+pl.col(" StrokeRecoveryTime (ms)"))).alias("rhythm"))
|
||||
df = df.with_columns((pl.col(" AverageDriveForce (lbs)")/pl.col(" PeakDriveForce (lbs)")).alias("forceratio"))
|
||||
f = df['TimeStamp (sec)'].diff().mean()
|
||||
if f != 0 and not np.isinf(f):
|
||||
try:
|
||||
windowsize = 2 * (int(10. / (f))) + 1
|
||||
except ValueError:
|
||||
windowsize = 1
|
||||
else:
|
||||
windowsize = 1
|
||||
|
||||
if windowsize <= 3:
|
||||
windowsize = 5
|
||||
|
||||
df.with_columns(
|
||||
(pl.col(" Cadence (stokes/min)").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode()
|
||||
).alias(" Cadence (stokes/min)"))
|
||||
df.with_columns(
|
||||
(pl.col(" DriveLength (meters)").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode()
|
||||
).alias(" DriveLength (meters)"))
|
||||
df.with_columns(
|
||||
(pl.col(" HRCur (bpm)").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode()
|
||||
).alias(" HRCur (bpm)"))
|
||||
df.with_columns((pl.col("forceratio").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode()).alias("forceratio"))
|
||||
|
||||
df = df.with_columns((pl.col(" DriveLength (meters)") / pl.col(" DriveTime (ms)") * 1.0e3).alias("drivespeed"))
|
||||
|
||||
if 'driveenergy' not in df.columns:
|
||||
if forceunit == 'lbs':
|
||||
df = df.with_columns((pl.col(" DriveLength (meters)") * pl.col(" AverageDriveForce (lbs)") * lbstoN).alias("driveenergy"))
|
||||
df = df.with_columns((pl.col(" AverageDriveForce (lbs)") * lbstoN).alias(" AverageDriveForce (lbs)"))
|
||||
df = df.with_columns((pl.col(" PeakDriveForce (lbs)") * lbstoN).alias(" PeakDriveForce (lbs)"))
|
||||
else:
|
||||
df = df.with_columns((pl.col(" DriveLength (meters)") * pl.col(" AverageDriveForce (lbs)")).alias("driveenergy"))
|
||||
|
||||
if df["driveenergy"].mean() == 0 and df["driveenergy"].std() == 0:
|
||||
df = df.with_columns((0.0*pl.col("driveenergy")+100).alias("driveenergy"))
|
||||
|
||||
df = df.with_columns((60. * pl.col(" AverageBoatSpeed (m/s)")/pl.col(" Cadence (stokes/min)")).alias("distanceperstroke"))
|
||||
|
||||
t2 = df["TimeStamp (sec)"].map_elements(lambda x: timedeltaconv(x), return_dtype=pl.Datetime)
|
||||
p2 = df[" Stroke500mPace"].map_elements(lambda x: timedeltaconv(x), return_dtype=pl.Datetime)
|
||||
|
||||
data = pl.DataFrame(
|
||||
dict(
|
||||
time=df["TimeStamp (sec)"] * 1e3,
|
||||
hr=df[" HRCur (bpm)"],
|
||||
pace=df[" Stroke500mPace"] * 1e3,
|
||||
spm=df[" Cadence (stokes/min)"],
|
||||
velo=df[" AverageBoatSpeed (m/s)"],
|
||||
cumdist=df["cum_dist"],
|
||||
ftime=niceformat(t2),
|
||||
fpace=nicepaceformat(p2),
|
||||
driveenergy=df["driveenergy"],
|
||||
power=df[' Power (watts)'],
|
||||
workoutstate=df[" WorkoutState"],
|
||||
averageforce=df[" AverageDriveForce (lbs)"],
|
||||
drivelength=df[" DriveLength (meters)"],
|
||||
peakforce=df[" PeakDriveForce (lbs)"],
|
||||
forceratio=df["forceratio"],
|
||||
distance=df["cum_dist"],
|
||||
drivespeed=df["drivespeed"],
|
||||
rhythm=df["rhythm"],
|
||||
distanceperstroke=df["distanceperstroke"],
|
||||
)
|
||||
)
|
||||
|
||||
data = data.with_columns(
|
||||
hr_ut2 = df['hr_ut2'],
|
||||
hr_ut1 = df['hr_ut1'],
|
||||
hr_at = df['hr_at'],
|
||||
hr_tr = df['hr_tr'],
|
||||
hr_an = df['hr_an'],
|
||||
hr_max = df['hr_max'],
|
||||
hr_bottom = 0.0*df[' HRCur (bpm)'],
|
||||
)
|
||||
|
||||
if 'wash' not in df.columns:
|
||||
data = data.with_columns(
|
||||
wash = pl.lit("0"),
|
||||
catch = pl.lit("0"),
|
||||
peakforceangle = pl.lit("0"),
|
||||
finish = pl.lit("0"),
|
||||
slip = pl.lit("0"),
|
||||
totalangle = pl.lit("0"),
|
||||
effectiveangle = pl.lit("0"),
|
||||
efficiency = pl.lit("0"),
|
||||
)
|
||||
else:
|
||||
wash = df['wash']
|
||||
catch = df['catch']
|
||||
finish = df['finish']
|
||||
peakforceangle = df['peakforceangle']
|
||||
arclength = (inboard - 0.05) * (np.radians(finish) - np.radians(catch))
|
||||
if arclength.mean() > 0:
|
||||
drivelength = arclength
|
||||
|
||||
slip = df['slip']
|
||||
totalangle = finish - catch
|
||||
effectiveangle = finish - wash - catch - slip
|
||||
|
||||
if windowsize > 3 and windowsize < len(slip):
|
||||
try:
|
||||
wash = savgol_filter(wash, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
try:
|
||||
slip = savgol_filter(slip, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
try:
|
||||
catch = savgol_filter(catch, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
try:
|
||||
finish = savgol_filter(finish, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
try:
|
||||
peakforceangle = savgol_filter(peakforceangle, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
try:
|
||||
driveenergy = savgol_filter(driveenergy, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
try:
|
||||
drivelength = savgol_filter(drivelength, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
try:
|
||||
totalangle = savgol_filter(totalangle, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
try:
|
||||
effectiveangle = savgol_filter(effectiveangle, windowsize, 3)
|
||||
except TypeError: # pragma: no cover
|
||||
pass
|
||||
|
||||
data = data.with_columns(
|
||||
wash = wash,
|
||||
catch = catch,
|
||||
slip = slip,
|
||||
finish = finish,
|
||||
peakforceangle = peakforceangle,
|
||||
driveenergy = driveenergy,
|
||||
drivelength = drivelength,
|
||||
totalangle = totalangle,
|
||||
effectiveangle = effectiveangle,
|
||||
)
|
||||
|
||||
ergpw = 2.8*data['velo']**3
|
||||
efficiency = 100. * ergpw / data['power']
|
||||
|
||||
data = data.with_columns(efficiency=efficiency)
|
||||
|
||||
if id != 0:
|
||||
data = data.with_columns(
|
||||
workoutid = pl.lit(id)
|
||||
)
|
||||
filename = 'media/strokedata_{id}.parquet.gz'.format(id=id)
|
||||
try:
|
||||
data.write_parquet(filename, compression='gzip')
|
||||
except IsADirectoryError:
|
||||
shutil.rmtree(filename)
|
||||
data.write_parquet(filename, compression='gzip')
|
||||
|
||||
|
||||
return data
|
||||
|
||||
# pandas/a little polars
|
||||
def dataprep(rowdatadf, id=0, bands=True, barchart=True, otwpower=True,
|
||||
empower=True, inboard=0.88, forceunit='lbs', debug=False, polars=True):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user