From 6d6acdbd1e1cf3ab4a8bb0e85468e179f9bf3385 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 9 Apr 2024 15:50:54 +0200 Subject: [PATCH] getting part --- rowers/interactiveplots.py | 41 ++++++++++++-------------- rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 4001 bytes rowers/views/analysisviews.py | 32 ++++++++++---------- rowers/views/statements.py | 2 +- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 22b4e606..541e46d8 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -192,11 +192,11 @@ def tailwind(bearing, vwind, winddir): def interactive_hr_piechart(df, rower, title, totalseconds=0): - if df.empty: + if df.is_empty(): return "", "Not enough data to make a chart" - df.sort_values(by='hr', inplace=True) - df['timehr'] = df['deltat']*df['hr'] + df = df.sort("hr") + df = df.with_columns((pl.col("deltat")*pl.col("hr")).alias("deltat")) sumtimehr = df['deltat'].sum() @@ -205,24 +205,23 @@ def interactive_hr_piechart(df, rower, title, totalseconds=0): hrzones = rower.hrzones - qry = 'hr < {ut2}'.format(ut2=rower.ut2) - qrydata = df.query(qry) + qrydata = df.filter(pl.col("hr") < rower.ut2) frac_lut2 = totalseconds*qrydata['deltat'].sum()/sumtimehr - qry = '{ut2} <= hr < {ut1}'.format(ut1=rower.ut1, ut2=rower.ut2) - frac_ut2 = totalseconds*df.query(qry)['deltat'].sum()/sumtimehr + qrydata = df.lazy().filter(pl.col("hr") >= rower.ut2).filter(pl.col("hr") < rower.ut1) + frac_ut2 = totalseconds*qrydata.collect()['deltat'].sum()/sumtimehr - qry = '{ut1} <= hr < {at}'.format(ut1=rower.ut1, at=rower.at) - frac_ut1 = totalseconds*df.query(qry)['deltat'].sum()/sumtimehr + qrydata = df.lazy().filter(pl.col("hr") >= rower.ut1).filter(pl.col("hr") < rower.at) + frac_ut1 = totalseconds*qrydata.collect()['deltat'].sum()/sumtimehr - qry = '{at} <= hr < {tr}'.format(at=rower.at, tr=rower.tr) - frac_at = totalseconds*df.query(qry)['deltat'].sum()/sumtimehr + qrydata = df.lazy().filter(pl.col("hr") >= rower.at).filter(pl.col("hr") < rower.tr) + frac_at = totalseconds*qrydata.collect()['deltat'].sum()/sumtimehr - qry = '{tr} <= hr < {an}'.format(tr=rower.tr, an=rower.an) - frac_tr = totalseconds*df.query(qry)['deltat'].sum()/sumtimehr + qrydata = df.lazy().filter(pl.col("hr") >= rower.tr).filter(pl.col("hr") < rower.an) + frac_tr = totalseconds*qrydata.collect()['deltat'].sum()/sumtimehr - qry = 'hr >= {an}'.format(an=rower.an) - frac_an = totalseconds*df.query(qry)['deltat'].sum()/sumtimehr + qrydata = df.filter(pl.col("hr") >= rower.an) + frac_an = totalseconds*qrydata['deltat'].sum()/sumtimehr datadict = { '<{ut2}'.format(ut2=hrzones[1]): frac_lut2, @@ -1931,7 +1930,6 @@ def interactive_streamchart(id=0, promember=0): return [script, div] def forcecurve_multi_interactive_chart(selected): # pragma: no cover - df_plot = pd.DataFrame() ids = [analysis.id for analysis in selected] workoutids = [analysis.workout.id for analysis in selected] @@ -1940,18 +1938,17 @@ def forcecurve_multi_interactive_chart(selected): # pragma: no cover columns = ['catch', 'slip', 'wash', 'finish', 'averageforce', 'peakforceangle', 'peakforce', 'spm', 'distance', 'workoutstate', 'workoutid', 'driveenergy', 'cumdist'] + columns = columns + [name for name, d in metrics.rowingmetrics] - rowdata = dataprep.getsmallrowdata_db(columns, ids=workoutids, + rowdata = dataprep.getsmallrowdata_pl(columns, ids=workoutids, workstrokesonly=False) + rowdata = rowdata.fill_nan(None).drop_nulls() - rowdata.dropna(axis=1, how='all', inplace=True) - rowdata.dropna(axis=0, how='any', inplace=True) - - if rowdata.empty: + if rowdata.is_empty(): return "", "No Valid Data Available", "", "" - data_dict = rowdata.to_dict("records") + data_dict = rowdata.to_dicts() thresholdforces = [] for analysis in selected: diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index d96a3d7749349eef1e033a4fa5f9d6018e1ea308..db6565d3c122e8c9a176a06b2f7a51a8007b87cb 100644 GIT binary patch delta 3913 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 X-