diff --git a/rowers/datautils.py b/rowers/datautils.py index c156f307..0b24d252 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -1,8 +1,10 @@ import pandas as pd +import polars as pl import numpy as np from scipy.interpolate import griddata from scipy import optimize + from rowers.mytypes import otwtypes, otetypes, rowtypes from rowers.models import Workout @@ -358,8 +360,8 @@ def getmaxwattinterval(tt, ww, i): def getfastest(df, thevalue, mode='distance'): - tt = df['time'].copy() - dd = df['cumdist'].copy() + tt = df['time'].clone() + dd = df['cumdist'].clone() tmax = tt.max() if mode == 'distance': # pragma: no cover @@ -370,40 +372,28 @@ def getfastest(df, thevalue, mode='distance'): return 0 -# if tmax > 500000: -# newlen=int(tmax/2000.) -# newt = np.arange(newlen)*tmax/float(newlen) -# deltat = newt[1]-newt[0] -# else: -# newt = np.arange(0,tmax,10.) -# deltat = 10. - newlen = 1000 newt = np.arange(newlen)*tmax/float(newlen) deltat = newt[1]-newt[0] - dd = griddata(tt.values, - dd.values, newt, method='linear', rescale=True) + dd = griddata(tt.to_numpy(), + dd.to_numpy(), newt, method='linear', rescale=True) - tt = pd.Series(newt, dtype='float') - dd = pd.Series(dd, dtype='float') + tt = pl.Series(newt, dtype=pl.Float64) + dd = pl.Series(dd, dtype=pl.Float64) + + G = pl.concat([pl.Series([0.0]), dd]) - G = pd.concat([pd.Series([0]), dd]) - # T = pd.concat([pd.Series([0]), dd]) - # h = np.mgrid[0:len(tt)+1:1, 0:len(tt)+1:1] - # distances = pd.DataFrame(h[1]-h[0]) ones = 1+np.zeros(len(G)) Ghor = np.outer(ones, G) - # Thor = np.outer(ones, T) - # Tver = np.outer(T, ones) + Gver = np.outer(G, ones) Gdif = Ghor-Gver Gdif = np.tril(Gdif.T).T - Gdif = pd.DataFrame(Gdif) + Gdif = pl.DataFrame(Gdif) F = Gdif - F.fillna(inplace=True, method='ffill', axis=1) - F.fillna(inplace=True, value=0) + F = F.fill_nan(0) restime = [] distance = [] @@ -414,7 +404,7 @@ def getfastest(df, thevalue, mode='distance'): restime.append(deltat*i) cp = np.diag(F, i).max() loc = np.argmax(np.diag(F, i)) - thestarttime = tt[loc] + thestarttime = tt.to_numpy()[loc] starttimes.append(thestarttime) distance.append(cp) @@ -424,10 +414,6 @@ def getfastest(df, thevalue, mode='distance'): distance = np.array(distance) starttimes = np.array(starttimes) - # for i in range(len(restime)): - # if restime[i] 0: w.plannedsession = ps w.save() @@ -1685,8 +1686,9 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False): record.coursecompleted = True record.workoutid = ws[0].id if race.sessiontype == 'fastest_distance': - df = dataprep.getsmallrowdata_db( + df = dataprep.read_data( ['time', 'cumdist'], ids=[ws[0].id]) + df = dataprep.remove_nulls_pl(df) fastest_milliseconds, startsecond, endsecond = datautils.getfastest( df, race.sessionvalue, mode='distance') velo = race.sessionvalue/fastest_milliseconds @@ -1702,8 +1704,9 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False): record.endsecond = endsecond record.save() if race.sessiontype == 'fastest_time': # pragma: no cover - df = dataprep.getsmallrowdata_db( + df = dataprep.read_data( ['time', 'cumdist'], ids=[ws[0].id]) + df = dataprep.remove_nulls_pl(df) fastest_meters, startsecond, endsecond = datautils.getfastest( df, race.sessionvalue, mode='time') velo = fastest_meters/(60.*race.sessionvalue) diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index ed73b421..cd73dd7a 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -309,11 +309,17 @@ def mocked_getrowdata_uh(*args, **kwargs): # pragma: no cover return df, row + def mocked_getsmallrowdata_uh(*args, **kwargs): # pragma: no cover df = pl.read_csv('rowers/tests/testdata/uhfull.csv') return df +def mocked_getsmallrowdata_uh_pd(*args, **kwargs): # pragma: no cover + df = pd.read_csv('rowers/tests/testdata/uhfull.csv') + + return df + def mocked_getsmallrowdata_forfusion(*args, **kwargs): df = pl.read_csv('rowers/tests/testdata/getrowdata_mock.csv') diff --git a/rowers/tests/test_unit_tests.py b/rowers/tests/test_unit_tests.py index 3c59620a..e1311d81 100644 --- a/rowers/tests/test_unit_tests.py +++ b/rowers/tests/test_unit_tests.py @@ -597,8 +597,8 @@ class DataPrepTests(TestCase): result = getagegrouprecord(25) self.assertEqual(int(result),590) - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_uh) - def test_get_videodata(self,mocked_getsmallrowdata_uh): + @patch('rowers.dataprep.getsmallrowdata_pd',side_effect=mocked_getsmallrowdata_uh_pd) + def test_get_videodata(self,mocked_getsmallrowdata_uh_pd): data, metrics, maxtime = dataprep.get_video_data(self.wuh_otw) self.assertEqual(len(data),9) diff --git a/rowers/tests/test_units.py b/rowers/tests/test_units.py index 68754ddc..9fb66dac 100644 --- a/rowers/tests/test_units.py +++ b/rowers/tests/test_units.py @@ -71,9 +71,10 @@ class ForceUnits(TestCase): w = Workout.objects.get(id=1) self.assertEqual(w.forceunit,'lbs') - df = dataprep.getsmallrowdata_db(['averageforce'],ids=[13]) + df = dataprep.read_data(['averageforce'],ids=[13]) + df = dataprep.remove_nulls_pl(df) average_N = int(df['averageforce'].mean()) - self.assertEqual(average_N,398) + self.assertEqual(average_N,400) data = dataprep.read_df_sql(13) average_N = int(data['averageforce'].mean()) @@ -119,9 +120,10 @@ class ForceUnits(TestCase): w = Workout.objects.get(id=13) self.assertEqual(w.forceunit,'N') - df = dataprep.getsmallrowdata_db(['averageforce'],ids=[13]) + df = dataprep.read_data(['averageforce'],ids=[13]) + df = dataprep.remove_nulls_pl(df) average_N = int(df['averageforce'].mean()) - self.assertEqual(average_N,263) + self.assertEqual(average_N,271) def test_upload_speedcoach_colin(self): login = self.c.login(username=self.u.username, password=self.password) @@ -155,9 +157,10 @@ class ForceUnits(TestCase): w = Workout.objects.get(id=13) self.assertEqual(w.forceunit,'N') - df = dataprep.getsmallrowdata_db(['averageforce'],ids=[13]) + df = dataprep.read_data(['averageforce'],ids=[13]) + df = dataprep.remove_nulls_pl(df) average_N = int(df['averageforce'].mean()) - self.assertEqual(average_N,105) + self.assertEqual(average_N,122) @override_settings(TESTING=True) class TestForceUnit(TestCase): @@ -206,7 +209,7 @@ class TestForceUnit(TestCase): rowdata = dataprep.rdata('rowers/tests/testdata/PainsledForce.csv') df = dataprep.dataprep(rowdata.df) - #df = dataprep.getsmallrowdata_db(['averageforce'],ids=[w[0].id],doclean=False, + #df = dataprep.read_data(['averageforce'],ids=[w[0].id],doclean=False, # compute=False) try: average_N = int(df['averageforce'].mean()) diff --git a/rowers/tests/test_uploads.py b/rowers/tests/test_uploads.py index b36335c1..b27a198a 100644 --- a/rowers/tests/test_uploads.py +++ b/rowers/tests/test_uploads.py @@ -29,8 +29,8 @@ class ViewTest(TestCase): self.nu = datetime.datetime.now() @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_upload_view_sled(self, mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_upload_view_sled(self, mocked_sqlalchemy,mocked_read_data): login = self.c.login(username='john',password='koeinsloot') self.assertTrue(login) @@ -120,8 +120,8 @@ class ViewTest(TestCase): pass @patch('rowers.dataprep.create_engine') - @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db) - def test_upload_view_sled_bg(self, mocked_sqlalchemy,mocked_getsmallrowdata_db): + @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) + def test_upload_view_sled_bg(self, mocked_sqlalchemy,mocked_read_data): login = self.c.login(username='john',password='koeinsloot') self.assertTrue(login) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index fc88d493..ef4b2add 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ