diff --git a/rowers/datautils.py b/rowers/datautils.py index cb17a357..c53d20cf 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -81,8 +81,8 @@ def cpfit(powerdf, fraclimit=0.0001, nmax=1000): p1 = p0 - thesecs = powerdf['Delta'] - theavpower = powerdf['CP'] + thesecs = powerdf['Delta'].to_numpy() + theavpower = powerdf['CP'].to_numpy() if len(thesecs) >= 4: try: @@ -102,7 +102,7 @@ def cpfit(powerdf, fraclimit=0.0001, nmax=1000): fitpower = fitfunc(p1, fitt) fitpoints = fitfunc(p1, thesecs) - fitpoints0 = fitpoints.copy() + fitpoints0 = fitpoints dd = fitpoints-theavpower ddmin = dd.min() diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index df373c11..e2c01858 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -996,7 +996,8 @@ def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, title='', type='water', wcpower=[], wcdurations=[], cpoverlay=False): - powerdf2 = powerdf[~(powerdf == 0).any(axis=1)].copy() + powerdf2 = powerdf.filter(pl.col("Delta") > 0, pl.col("CP") > 0) + # plot tools if (promember == 1): # pragma: no cover TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair' @@ -1006,11 +1007,9 @@ def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, x_axis_type = 'log' deltas = powerdf2['Delta'].apply(lambda x: timedeltaconv(x)) - powerdf2['ftime'] = deltas.apply(lambda x: strfdelta(x)) - powerdf2['Deltaminutes'] = powerdf2['Delta']/60. - - source = ColumnDataSource( - data=powerdf2 + powerdf2 = powerdf2.with_columns( + ftime = deltas.apply(lambda x: strfdelta(x)), + Deltaminutes = pl.col("Delta")/60. ) # there is no Paul's law for OTW @@ -1071,7 +1070,7 @@ def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, fitpoweraverage = 0*fitpower - fit_data = pd.DataFrame(dict( + fit_data = pl.DataFrame(dict( CP=fitpower, CPmax=ratio*fitpower, duration=fitt/60., @@ -1085,13 +1084,12 @@ def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, # url = urls, )) - if not title: title = "Critical Power for "+rowername chart_dict = { - 'data': powerdf2.to_dict("records"), - 'fitdata': fit_data.to_dict("records"), + 'data': powerdf2.to_dicts(), + 'fitdata': fit_data.to_dicts(), 'title': title, } diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 414430c0..5c88125c 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -639,7 +639,7 @@ def cpdata(workouts, options): delta, cpvalue, avgpower, workoutnames, urls = dataprep.fetchcp_new( r, workouts) - powerdf = pd.DataFrame({ + powerdf = pl.DataFrame({ 'Delta': delta, 'CP': cpvalue, 'workout': workoutnames, @@ -648,16 +648,17 @@ def cpdata(workouts, options): savedata = options.get('savedata',False) if savedata: # pragma: no cover - return powerdf + return powerdf.to_pandas() - if powerdf.empty: # pragma: no cover + if powerdf.is_empty(): # pragma: no cover return('', '

No valid data found

') - powerdf = powerdf[powerdf['CP'] > 0] - powerdf.dropna(axis=0, inplace=True) - powerdf.sort_values(['Delta', 'CP'], ascending=[1, 0], inplace=True) - powerdf.drop_duplicates(subset='Delta', keep='first', inplace=True) + powerdf = powerdf.lazy().filter(pl.col("CP")>0) + powerdf = powerdf.sort(["Delta", "CP"], descending=[False, True]) + powerdf = powerdf.unique(subset="Delta", keep="first") + powerdf = powerdf.fill_nan(None).drop_nulls() + powerdf = powerdf.collect() rowername = r.user.first_name+" "+r.user.last_name