diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 38782b76..fbbd85fa 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -19,6 +19,7 @@ import rowers.dataprep as dataprep from rowers.dataprep import rdata import rowers.utils as utils import polars as pl +import pytz from rowers.rower_rules import ispromember from polars.exceptions import ColumnNotFoundError @@ -479,7 +480,7 @@ def interactive_forcecurve(theworkouts): def weightfromrecord(row,metricchoice): - vv = row[metricchoice] + vv = row[metricchoice][0] if vv > 0: return vv if metricchoice == 'rscore': # pragma: no cover @@ -505,18 +506,19 @@ def getfatigues( lambda_c = 2/(kfitness+1) nrdays = (enddate-startdate).days + for i in range(nrdays+1): date = startdate+datetime.timedelta(days=i) datekey = date.strftime('%Y-%m-%d') weight = 0 try: - df2 = df.loc[date.date()] + df2 = df.filter(pl.col("date") == date.date()) - if type(df2) == pd.Series: # pragma: no cover + if type(df2) == pl.Series: # pragma: no cover weight += weightfromrecord(df2,metricchoice) else: - for index, row in df2.iterrows(): + for row in df2.iter_slices(n_rows=1): weight += weightfromrecord(row,metricchoice) except KeyError: pass @@ -693,8 +695,8 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue= } records.append(dd) - df = pd.DataFrame.from_records(records) - if df.empty: # pragma: no cover + df = pl.from_records(records) + if df.is_empty(): # pragma: no cover return ['', 'No Data', 0, 0, 0, outids] markerworkouts = Workout.objects.filter( @@ -727,7 +729,7 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue= kfatigue, kfitness ) - df = pd.DataFrame({ + df = pl.DataFrame({ 'date': dates, 'testpower': testpower, 'testduration': testduration, @@ -742,19 +744,19 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue= endform = endfitness-endfatigue if modelchoice == 'banister': # pragma: no cover - df['fatigue'] = k2*df['fatigue'] - df['fitness'] = p0+k1*df['fitness'] + df = df.with_columns((pl.col("fatigue")*k2)) + df = df.with_columns((p0+pl.col("fitness")*k1)) - df['form'] = df['fitness']-df['fatigue'] + df = df.with_columns((pl.col("fitness")-pl.col("fatigue")).alias("form")) + df = df.sort("date") + + df = df.group_by('date').max() + startdate = startdate.replace(tzinfo=None) + startdate = pytz.utc.localize(startdate) - df.sort_values(['date'], inplace=True) - df = df.groupby(['date']).max() - df['date'] = df.index.values - mask = df['date'] > np.datetime64(startdate.astimezone( - tz=datetime.timezone.utc).replace(tzinfo=None)) - df = df.loc[mask] + df = df.filter(pl.col("date") > startdate) - df2 = pd.DataFrame({ + df2 = pl.DataFrame({ "testpower" :df['testpower'], "testduration":df['testduration'].apply( lambda x: totaltime_sec_to_string(x, shorten=True)), @@ -762,14 +764,13 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue= "fatigue":df['fatigue'], "form":df['form'], "impulse":df['impulse'], - "date": df['date'].map(lambda x: x.strftime('%Y-%m-%d')), + "date": df['date'].apply(lambda x: x.strftime('%Y-%m-%d')), }) + df2 = df2.fill_nan(0) - df2.fillna(value=0, inplace=True) - - data_dict = df2.to_dict("records") + data_dict = df2.to_dicts() chart_data = { 'data': data_dict,