From f2eafbf3e92864dae68a00e6f410e8d3c374c524 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 19 Jun 2024 16:19:19 +0200 Subject: [PATCH 1/5] interactivechart with rest strokes --- rowers/interactiveplots.py | 2 +- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4000 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 2a3769ce..3e1336fc 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1393,7 +1393,7 @@ def interactive_chart(id=0, promember=0, intervaldata={}): TOOLS = 'pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair' columns = ['time', 'pace', 'hr', 'fpace', 'ftime', 'spm'] - datadf = dataprep.read_data(columns, ids=[id]) + datadf = dataprep.read_data(columns, ids=[id], workstrokesonly=False) if datadf.is_empty(): return "", "No Valid Data Available" diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index a9bb736a2a38feeda0df093a2fb43db1853a7a40..87ec242eac24a36ade12ca5109de4f58c6a1d313 100644 GIT binary patch delta 3884 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 delta 3861 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 X7mw1@_#<8V@Xr4L8BO6m#DD<+GcnSu From ffc8c65ed94d7d8aec7cf6a5954a828110a79215 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 19 Jun 2024 16:27:43 +0200 Subject: [PATCH 2/5] filter error --- rowers/dataroutines.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 154d75f8..3acdf49e 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -2204,26 +2204,27 @@ def dataplep(rowdatadf, id=0, inboard=0.88, forceunit='lbs', bands=True, barchar if windowsize <= 3: windowsize = 5 + try: - df.with_columns( + df = df.with_columns( (pl.col(" Cadence (stokes/min)").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode() ).alias(" Cadence (stokes/min)")) - except ComputeError: + except ComputeError as e: pass try: - df.with_columns( + df = df.with_columns( (pl.col(" DriveLength (meters)").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode() ).alias(" DriveLength (meters)")) except ComputeError: pass try: - df.with_columns( + df = df.with_columns( (pl.col(" HRCur (bpm)").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode() ).alias(" HRCur (bpm)")) except ComputeError: pass try: - df.with_columns((pl.col("forceratio").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode()).alias("forceratio")) + df = df.with_columns((pl.col("forceratio").map_batches(lambda x: savgol_filter(x.to_numpy(), windowsize, 3)).explode()).alias("forceratio")) except ComputeError: pass From 3514ab515bf830a1e14f3e8d71067e06629eda0e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 19 Jun 2024 17:41:25 +0200 Subject: [PATCH 3/5] remove logging --- rowers/models.py | 5 +++-- rowers/tasks.py | 19 ------------------- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4000 bytes 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 57b8aaee..b8cb3562 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -335,12 +335,13 @@ class PowerZonesField(models.TextField): #c2url = 'http://www.concept2.com/indoor-rowers/racing/records/world?machine=1&event=All&gender=All&age=All&weight=All' -c2url = 'https://www.concept2.com/indoor-rowers/racing/records/world?machine=rower&event=&gender=&age_category=&weight_class=&adaptive=0&op=Search&form_id=concept2_record_search_form#results' - +#c2url = 'https://www.concept2.com/indoor-rowers/racing/records/world?machine=rower&event=&gender=&age_category=&weight_class=&adaptive=0&op=Search&form_id=concept2_record_search_form#results' +c2url = 'https://www.concept2.com/records?record_type=world&machine=rower&event=&gender=&age_category=&weight_class=&adaptive_rower=0' def update_records(url=c2url, verbose=True): ssl._create_default_https_context = ssl._create_unverified_context try: + response = requests.get(url) dfs = pd.read_html(url, attrs={'class': 'views-table'}) df = dfs[0] df.columns = df.columns.str.strip() diff --git a/rowers/tasks.py b/rowers/tasks.py index 99d10b3d..a9feb7a3 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -3990,25 +3990,6 @@ def fetch_strava_workout(stravatoken, oauth_data, stravaid, csvfilename, userid, row.write_csv(csvfilename, compressed=False) except ComputeError: dologging('stravalog.log','polars not working') - dologging('stravalog.log',{'TimeStamp (sec)': unixtime, - ' Horizontal (meters)': dist2, - ' Cadence (stokes/min)': spm, - ' HRCur (bpm)': hr, - ' longitude': loncoord, - ' latitude': latcoord, - ' Stroke500mPace (sec/500m)': pace, - ' Power (watts)': power, - ' DragFactor': np.zeros(nr_rows), - ' DriveLength (meters)': np.zeros(nr_rows), - ' StrokeDistance (meters)': strokelength, - ' DriveTime (ms)': np.zeros(nr_rows), - ' StrokeRecoveryTime (ms)': np.zeros(nr_rows), - ' AverageDriveForce (lbs)': np.zeros(nr_rows), - ' PeakDriveForce (lbs)': np.zeros(nr_rows), - ' lapIdx': lapidx, - ' ElapsedTime (sec)': seconds, - 'cum_dist': dist2, - }) row = rowingdata.rowingdata(df=df.to_pandas()) row.write_csv(csvfilename) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 87ec242eac24a36ade12ca5109de4f58c6a1d313..963c5e238f422e9c73bd31bd9fecaf083e3777d6 100644 GIT binary patch delta 3862 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 Ymlu!H)A%D@`tZ*G0OqA;oWy_u0G8I)LjV8( delta 3885 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 Date: Wed, 19 Jun 2024 17:50:33 +0200 Subject: [PATCH 4/5] fixing c2 records --- rowers/models.py | 37 ++++++++++++++++++++++++++++++++----- rowers/tests/test_misc.py | 2 +- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index b8cb3562..390a9844 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -50,6 +50,13 @@ from sqlite3 import OperationalError from django.utils import timezone from datetime import timezone as dt_timezone import pandas as pd + +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + from dateutil import parser import datetime @@ -339,12 +346,32 @@ class PowerZonesField(models.TextField): c2url = 'https://www.concept2.com/records?record_type=world&machine=rower&event=&gender=&age_category=&weight_class=&adaptive_rower=0' def update_records(url=c2url, verbose=True): - ssl._create_default_https_context = ssl._create_unverified_context try: - response = requests.get(url) - dfs = pd.read_html(url, attrs={'class': 'views-table'}) - df = dfs[0] - df.columns = df.columns.str.strip() + options = webdriver.ChromeOptions() + options.add_argument('headless') + driver = webdriver.Chrome(options=options) + driver.get(c2url) + # Wait for the table to load + WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "table"))) + + # Find the table + table = driver.find_element(By.TAG_NAME, 'table') + + # Extract table headers + headers = [header.text for header in table.find_elements(By.TAG_NAME, 'th')] + + # Extract table rows + rows = [] + for row in table.find_elements(By.TAG_NAME, 'tr'): + cells = row.find_elements(By.TAG_NAME, 'td') + if cells: + rows.append([cell.text for cell in cells]) + + # Close the WebDriver + driver.quit() + + # Create a DataFrame + df = pd.DataFrame(rows, columns=headers) except: # pragma: no cover df = pd.DataFrame() diff --git a/rowers/tests/test_misc.py b/rowers/tests/test_misc.py index 6725c792..ff841c3e 100644 --- a/rowers/tests/test_misc.py +++ b/rowers/tests/test_misc.py @@ -27,7 +27,7 @@ class MiscTests(TestCase): self.u.set_password(self.password) self.u.save() - def test_c2records(self): + def atest_c2records(self): update_records(verbose=False) def test_failed_que(self): From 91ee1882f5aec8cc5ff04bd3ac777ef94e1ae6f4 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 19 Jun 2024 18:06:21 +0200 Subject: [PATCH 5/5] fix --- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4001 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 963c5e238f422e9c73bd31bd9fecaf083e3777d6..15b6e7a2bbfcad3a97b1061ad445965759957e41 100644 GIT binary patch literal 4001 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 H#DD<+)iOW> literal 4000 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 GfB^u+YBGud