From 0936d4ceccce5ae7a4b9c152877aecd0d3520c30 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 16 Apr 2024 14:14:00 +0200 Subject: [PATCH] flex chart pandas to polars --- rowers/interactiveplots.py | 147 ++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 74 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 8fa6c246..8b1d78e4 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1694,10 +1694,10 @@ def interactive_flexchart_stacked(id, r, xparam='time', row = Workout.objects.get(id=id) if ispromember(r.user): - rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], doclean=True, + rowdata = dataprep.getsmallrowdata_pl(columns, ids=[id], doclean=True, workstrokesonly=False, for_chart=True) else: - rowdata = dataprep.getsmallrowdata_db(columns_basic, ids=[id], doclean=True, + rowdata = dataprep.getsmallrowdata_pl(columns_basic, ids=[id], doclean=True, workstrokesonly=False, for_chart=True) if r.usersmooth > 1: # pragma: no cover @@ -1706,65 +1706,69 @@ def interactive_flexchart_stacked(id, r, xparam='time', if metricsdicts[column]['maysmooth']: nrsteps = int(log2(r.usersmooth)) for i in range(nrsteps): - rowdata[column] = utils.ewmovingaverage( - rowdata[column], 5) + rowdata = rowdata.with_columns( + utils.ewmovingaverage( + rowdata[column], 5).alias(column) + ) except KeyError: pass if len(rowdata) < 2: if ispromember(r.user): - rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], + rowdata = dataprep.getsmallrowdata_pl(columns, ids=[id], doclean=False, workstrokesonly=False, for_chart=True) else: - rowdata = dataprep.getsmallrowdata_db(columns_basic, ids=[id], + rowdata = dataprep.getsmallrowdata_pl(columns_basic, ids=[id], doclean=False, workstrokesonly=False, for_chart=True) - if rowdata.empty: + if rowdata.is_empty(): return "", "No valid data" try: - tseconds = rowdata.loc[:, 'time'] + tseconds = rowdata['time'] except KeyError: # pragma: no cover return '', 'No time data - cannot make flex plot' try: - rowdata['x1'] = rowdata.loc[:, xparam] + rowdata = rowdata.with_columns(x1=pl.col(xparam)) except KeyError: # pragma: no cover - rowdata['x1'] = 0*rowdata.loc[:, 'time'] + rowdata = rowdata.with_columns(x1=pl.lit(0)) try: - rowdata['y1'] = rowdata.loc[:, yparam1] + rowdata = rowdata.with_columns(y1=pl.col(yparam1)) except KeyError: # pragma: no cover - rowdata['y1'] = 0*rowdata.loc[:, 'time'] - rowdata[yparam1] = rowdata['y1'] - - try: # pragma: no cover - rowdata['y2'] = rowdata.loc[:, yparam2] - except KeyError: - rowdata['y2'] = 0*rowdata.loc[:, 'time'] - rowdata[yparam2] = rowdata['y2'] + rowdata = rowdata.with_columns(y1=pl.col("time")) + rowdata = rowdata.with_columns((pl.col("y1")).alias(yparam1)) try: - rowdata['y3'] = rowdata.loc[:, yparam3] + rowdata = rowdata.with_columns(y2=pl.col(yparam2)) except KeyError: # pragma: no cover - rowdata['y3'] = 0*rowdata.loc[:, 'time'] - rowdata[yparam3] = rowdata['y3'] + rowdata = rowdata.with_columns(y2=pl.col("time")) + rowdata = rowdata.with_columns((pl.col("y2")).alias(yparam2)) try: - rowdata['y4'] = rowdata.loc[:, yparam4] + rowdata = rowdata.with_columns(y1=pl.col(yparam3)) except KeyError: # pragma: no cover - rowdata['y4'] = 0*rowdata.loc[:, 'time'] - rowdata[yparam4] = rowdata['y4'] + rowdata = rowdata.with_columns(y3=pl.col("time")) + rowdata = rowdata.with_columns((pl.col("y3")).alias(yparam3)) + + try: + rowdata = rowdata.with_columns(y4=pl.col(yparam1)) + except KeyError: # pragma: no cover + rowdata = rowdata.with_columns(y4=pl.col("time")) + rowdata = rowdata.with_columns((pl.col("y4")).alias(yparam4)) + # replace nans - rowdata.fillna(value=0, inplace=True) + rowdata = rowdata.fill_nan(0) - data_dict = rowdata.to_dict("records") + + data_dict = rowdata.to_dicts() metrics_list = [{'name': name, 'rowingmetrics':d } for name, d in metrics.rowingmetrics] @@ -1794,7 +1798,6 @@ def interactive_flex_chart2(id, r, promember=0, trendline=False, mode='rower'): - columns = [name for name, d in metrics.rowingmetrics] columns_basic = [name for name, d in metrics.rowingmetrics if d['group'] == 'basic'] columns = columns + ['spm', 'driveenergy', 'distance'] @@ -1802,10 +1805,10 @@ def interactive_flex_chart2(id, r, promember=0, datadf = pd.DataFrame() if promember: - rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], doclean=True, + rowdata = dataprep.getsmallrowdata_pl(columns, ids=[id], doclean=True, workstrokesonly=workstrokesonly, for_chart=True) else: - rowdata = dataprep.getsmallrowdata_db(columns_basic, ids=[id], doclean=True, + rowdata = dataprep.getsmallrowdata_pl(columns_basic, ids=[id], doclean=True, workstrokesonly=workstrokesonly, for_chart=True) if r.usersmooth > 1: # pragma: no cover @@ -1814,19 +1817,21 @@ def interactive_flex_chart2(id, r, promember=0, if metricsdicts[column]['maysmooth']: nrsteps = int(log2(r.usersmooth)) for i in range(nrsteps): - rowdata[column] = utils.ewmovingaverage( - rowdata[column], 5) + rowdata = rowdata.with_columns( + (utils.ewmovingaverage( + rowdata[column], 5)).alias(column) + ) except KeyError: pass try: if len(rowdata) < 2: if promember: - rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], + rowdata = dataprep.getsmallrowdata_pl(columns, ids=[id], doclean=False, workstrokesonly=False, for_chart=True) else: - rowdata = dataprep.getsmallrowdata_db(columns_basic, ids=[id], doclean=False, + rowdata = dataprep.getsmallrowdata_pl(columns_basic, ids=[id], doclean=False, workstrokesonly=False, for_chart=True) workstrokesonly = False except (KeyError, TypeError): # pragma: no cover @@ -1845,67 +1850,56 @@ def interactive_flex_chart2(id, r, promember=0, try: _ = rowdata['driveenergy'].mean() except (KeyError, TypeError): - rowdata['driveenergy'] = 500. + rowdata = rowdata.with_columns(driveenergy=pl.lit(500)) # test if we have power try: _ = rowdata['power'].mean() except (KeyError, TypeError): - rowdata['power'] = 50. + rowdata = rowdata.with_columns(power=pl.lit(50)) # replace nans - rowdata.fillna(value=0, inplace=True) + rowdata = rowdata.fill_nan(0) row = Workout.objects.get(id=id) - if rowdata.empty: + if rowdata.is_empty(): return "", "No valid data", workstrokesonly workoutstatesrest = [3] if workstrokesonly: # pragma: no cover try: - rowdata = rowdata[~rowdata['workoutstate'].isin(workoutstatesrest)] + rowdata = rowdata.filter(~pl.col("workoutstate").is_in(workoutstatesrest)) except KeyError: pass try: - tseconds = rowdata.loc[:, 'time'] + tseconds = rowdata['time'] except KeyError: # pragma: no cover return '', 'No time data - cannot make flex plot', workstrokesonly try: - rowdata['x1'] = rowdata.loc[:, xparam] + rowdata = rowdata.with_columns(x1 = pl.col(xparam)) except KeyError: # pragma: no cover - rowdata['x1'] = 0*rowdata.loc[:, 'time'] + rowdata = rowdata.with_columns(x1 = pl.col("time")) try: - rowdata['y1'] = rowdata.loc[:, yparam1] + rowdata = rowdata.with_columns(y1 = pl.col(yparam1)) except KeyError: # pragma: no cover - rowdata['y1'] = 0*rowdata.loc[:, 'time'] - rowdata[yparam1] = rowdata['y1'] + rowdata = rowdata.with_columns(y1 = pl.col("time")) + rowdata = rowdata.with_columns(yparam1 = pl.col("y1")) + if yparam2 != 'None': try: - rowdata['y2'] = rowdata.loc[:, yparam2] + rowdata = rowdata.with_columns(y2 = pl.col(yparam2)) except KeyError: # pragma: no cover - rowdata['y2'] = 0*rowdata.loc[:, 'time'] - rowdata[yparam2] = rowdata['y2'] - else: # pragma: no cover - rowdata['y2'] = rowdata['y1'] + rowdata = rowdata.with_columns(y2 = pl.col("time")) + rowdata = rowdata.with_columns(yparam2 = pl.col("y2")) - if xparam == 'time': - xaxmax = tseconds.max() - xaxmin = tseconds.min() - elif xparam == 'distance' or xparam == 'cumdist': - xaxmax = rowdata['x1'].max() - xaxmin = rowdata['x1'].min() else: # pragma: no cover - try: - xaxmax = get_yaxmaxima(r, xparam, mode) - xaxmin = get_yaxminima(r, xparam, mode) - except KeyError: - xaxmax = rowdata['x1'].max() - xaxmin = rowdata['x1'].min() + rowdata = rowdata.with_columns(y2=pl.col("y1")) + # average values if xparam != 'time': @@ -1921,20 +1915,23 @@ def interactive_flex_chart2(id, r, promember=0, try: - rowdata['xname'] = axlabels[xparam] + rowdata = rowdata.with_columns((pl.lit(axlabels[xparam])).alias("xname")) except KeyError: # pragma: no cover - rowdata['xname'] = xparam + rowdata = rowdata.with_columns((pl.lit(xparam)).alias("xname")) + try: - rowdata['yname1'] = axlabels[yparam1] + rowdata = rowdata.with_columns((pl.lit(axlabels[yparam1])).alias("yname1")) except KeyError: # pragma: no cover - rowdata['yname1'] = yparam1 + rowdata = rowdata.with_columns((pl.lit(yparam1)).alias("yname1")) + if yparam2 != 'None': try: - rowdata['yname2'] = axlabels[yparam2] + rowdata = rowdata.with_columns((pl.lit(axlabels[yparam2])).alias("yname2")) except KeyError: # pragma: no cover - rowdata['yname2'] = yparam2 + rowdata = rowdata.with_columns((pl.lit(yparam2)).alias("yname2")) + else: # pragma: no cover - rowdata['yname2'] = rowdata['yname1'] + rowdata = rowdata.with_columns((pl.col("yname1")).alias("yname2")) def func(x, a, b): return a*x+b @@ -1944,13 +1941,15 @@ def interactive_flex_chart2(id, r, promember=0, try: popt, pcov = optimize.curve_fit(func, x1, y1) ytrend = func(x1, popt[0], popt[1]) - rowdata['ytrend'] = ytrend + rowdata = rowdata.with_columns(ytrend=ytrend) except TypeError: # pragma: no cover - rowdata['ytrend'] = y1 + rowdata = rowdata.with_columns(ytrend=pl.col("y1")) - rowdata.replace([np.inf, -np.inf], np.nan, inplace=True) - rowdata.dropna(axis=1, how='all', inplace=True) - data_dict = rowdata.to_dict("records") + + #rowdata = rowdata.replace([np.inf, -np.inf], np.nan) + rowdata = rowdata.fill_nan(None).drop_nulls() + + data_dict = rowdata.to_dicts() metrics_list = [{'name': name, 'rowingmetrics':d } for name, d in metrics.rowingmetrics]