rowingdata 3.6.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. rowingdata/__init__.py +2 -0
  2. rowingdata/__main__.py +2 -0
  3. rowingdata/boatedit.py +15 -0
  4. rowingdata/checkdatafiles.py +216 -0
  5. rowingdata/copystats.py +22 -0
  6. rowingdata/crewnerdplot.py +37 -0
  7. rowingdata/crewnerdplottime.py +37 -0
  8. rowingdata/csvparsers.py +3114 -0
  9. rowingdata/ergdataplot.py +31 -0
  10. rowingdata/ergdataplottime.py +31 -0
  11. rowingdata/ergdatatotcx.py +32 -0
  12. rowingdata/ergstickplot.py +31 -0
  13. rowingdata/ergstickplottime.py +32 -0
  14. rowingdata/ergsticktotcx.py +32 -0
  15. rowingdata/example.csv +5171 -0
  16. rowingdata/gpxtools.py +70 -0
  17. rowingdata/gpxwrite.py +151 -0
  18. rowingdata/konkatenaadje.py +19 -0
  19. rowingdata/laptesting.py +293 -0
  20. rowingdata/obsolete.py +654 -0
  21. rowingdata/otherparsers.py +718 -0
  22. rowingdata/painsled_desktop_plot.py +30 -0
  23. rowingdata/painsled_desktop_plottime.py +29 -0
  24. rowingdata/painsled_desktop_toc2.py +30 -0
  25. rowingdata/painsledplot.py +27 -0
  26. rowingdata/painsledplottime.py +27 -0
  27. rowingdata/painsledtoc2.py +23 -0
  28. rowingdata/roweredit.py +15 -0
  29. rowingdata/rowingdata.py +6941 -0
  30. rowingdata/rowproplot.py +31 -0
  31. rowingdata/rowproplottime.py +31 -0
  32. rowingdata/speedcoachplot.py +31 -0
  33. rowingdata/speedcoachplottime.py +31 -0
  34. rowingdata/speedcoachtoc2.py +36 -0
  35. rowingdata/tcxplot.py +38 -0
  36. rowingdata/tcxplot_nogeo.py +38 -0
  37. rowingdata/tcxplottime.py +33 -0
  38. rowingdata/tcxplottime_nogeo.py +33 -0
  39. rowingdata/tcxtoc2.py +30 -0
  40. rowingdata/tcxtools.py +417 -0
  41. rowingdata/trainingparser.py +302 -0
  42. rowingdata/utils.py +135 -0
  43. rowingdata/windcorrected.py +48 -0
  44. rowingdata/writetcx.py +312 -0
  45. rowingdata-3.6.8.dist-info/LICENSE +21 -0
  46. rowingdata-3.6.8.dist-info/METADATA +1149 -0
  47. rowingdata-3.6.8.dist-info/RECORD +49 -0
  48. rowingdata-3.6.8.dist-info/WHEEL +5 -0
  49. rowingdata-3.6.8.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1149 @@
1
+ Metadata-Version: 2.1
2
+ Name: rowingdata
3
+ Version: 3.6.8
4
+ Summary: The rowingdata library to create colorful plots from CrewNerd, Painsled and other rowing data tools
5
+ Home-page:
6
+ Author: Sander Roosendaal
7
+ Author-email: roosendaalsander@gmail.com
8
+ License: MIT
9
+ Keywords: rowing ergometer concept2
10
+ Classifier: Programming Language :: Python :: 3
11
+ License-File: LICENSE
12
+ Requires-Dist: Cython
13
+ Requires-Dist: numpy
14
+ Requires-Dist: scipy
15
+ Requires-Dist: matplotlib
16
+ Requires-Dist: pandas
17
+ Requires-Dist: fitparse
18
+ Requires-Dist: arrow >=1.0.2
19
+ Requires-Dist: python-dateutil
20
+ Requires-Dist: docopt
21
+ Requires-Dist: tqdm
22
+ Requires-Dist: rowingphysics >=0.2.3
23
+ Requires-Dist: iso8601
24
+ Requires-Dist: lxml
25
+ Requires-Dist: xmltodict
26
+ Requires-Dist: nose-parameterized
27
+ Requires-Dist: timezonefinder
28
+ Requires-Dist: pycairo
29
+ Requires-Dist: tk
30
+ Requires-Dist: requests
31
+
32
+ **************
33
+ Rowingdata
34
+ **************
35
+ ==============
36
+ Introduction
37
+ ==============
38
+
39
+ This is a solution for the self-tracking rowers.
40
+
41
+ Some of us use Concept2 rowing machines. Some of us are On-The-Water
42
+ rowers. All of us will use smartphone apps, smart watches, fitness (GPS)
43
+ watches, etc. to track our activities.
44
+
45
+ Most of them will cross-train. Bike. Run. Skate.
46
+
47
+ That means, the Concept2 logbook is not a sufficient training logbook for us.
48
+
49
+ At the same time, the Concept2 logbook is used in rankings, for challenges,
50
+ and more. Many of us will want to log all our rowing on the Concept2 logbook.
51
+
52
+ So there are a couple of challenges here:
53
+
54
+ * How do I get my erg rows on Strava/SportTracks/Garmin Connect?
55
+
56
+ * Use an ANT+ device, like explained here: https://dr3do.wordpress.com/2015/07/09/hurray/
57
+
58
+ * Import from RowPro to SportTracks
59
+
60
+ * There are many smartphone apps to capture data from the PM3/4/5 erg monitor. Not many of them export in a format that is suitable for upload to the above-mentioned sites.
61
+
62
+ * How do I get all my rows (including OTW) into the Concept2 logbook
63
+
64
+ * For On-Water and Erg: Add them manually
65
+
66
+ * For erg: Upload from ErgData, RowPro, Concept2 utility
67
+
68
+ This project aims at giving you ways to:
69
+
70
+ * Upload fitness data captured in TCX format to the Concept2 logbook (implemented)
71
+
72
+ * This should cover all your On-Water activities, whether they are captured with a SpeedCoach, a GPS fitness watch, your phone, or any other device. As long as you are able to export a valid TCX file.
73
+
74
+ * Get erg data captured with apps that have no "upload to Concept2" functionality and upload them to the Concept2 logbook (implemented)
75
+
76
+ * For example, painsled
77
+
78
+ * Get erg data captured with apps that have no TCX export functionality and convert hem to TCX (implemented)
79
+
80
+ * ErgData - downloaded to CSV, converted to TCX
81
+
82
+ * RowPro data - exported to CSV, converted to TCX.
83
+
84
+ * Make the data accessible in python and create useful plots. Who wants to be limited to what the on-line logbooks plot. Get your data and create:
85
+
86
+ * Color HR band charts or Pie Charts (implemented)
87
+
88
+ * Plot drive length, drive time, and other erg related parameters as a function of time or distance (implemented)
89
+
90
+ * Create histograms (Do-it-yourself).
91
+
92
+ * And much more (do-it-yourself). You've got the entire Python matplotlib at your disposal. Goodbye excel!
93
+
94
+ As soon as Crewnerd or Speedcoach can upload to C2 natively, or a web
95
+ synchronization can be set up between the C2 logbook and popular fitness
96
+ tracking sites, my project will lose much of its significance. But that's OK.
97
+
98
+ Well, at least the colorful plots remain.
99
+
100
+ ===============
101
+ Credits
102
+ ===============
103
+
104
+ The project is based on python plotting code by
105
+ Greg Smith (https://quantifiedrowing.wordpress.com/)
106
+ and inspired by the RowPro Dan Burpee spreadsheet
107
+ (http://www.sub7irc.com/RP_Split_Template.zip).
108
+
109
+ .. image:: C:\python\rowingdata\screenshots\image001.png
110
+
111
+
112
+ ===============
113
+ To install
114
+ ===============
115
+
116
+ ::
117
+
118
+ $ easy_install rowingdata
119
+
120
+ Or ::
121
+
122
+ $ pip install rowingdata
123
+
124
+
125
+ To upgrade: ::
126
+
127
+ $ pip install --upgrade rowingdata
128
+
129
+ or ::
130
+
131
+ $ easy_install --upgrade rowingdata
132
+
133
+ Numpy, SciPy and matplotlib are needed. On Linux systems, they should be installed automatically through the dependencies.
134
+
135
+ On Windows, there may be installation issues.
136
+
137
+ A workaround is to install Anaconda, as described here: https://www.scipy.org/install.html
138
+
139
+ Another option is to use official 32-bit installers:
140
+
141
+ * http://sourceforge.net/projects/numpy/files/
142
+ * http://sourceforge.net/projects/scipy/files/
143
+ * http://sourceforge.net/projects/matplotlib/files/matplotlib/
144
+
145
+ Or you can fetch the unofficial but recommended Windows releases from
146
+
147
+ * http://www.lfd.uci.edu/~gohlke/pythonlibs/ (get the MKL builds for NumPy)
148
+
149
+ ======================
150
+ Command Line Tools
151
+ ======================
152
+
153
+ Beta. Use with caution.
154
+
155
+ The easiest way to use rowingdata is from the command line.
156
+
157
+ First, create a rower data file (if you don't have one yet). Just run the
158
+ following command and answer a few questions about yourself. If you don't
159
+ know what heart rate bands are, check here http://www.freespiritsrowing.com/content/utilities/hr-bands/ : ::
160
+
161
+ $ roweredit yourfilename.txt
162
+
163
+ You can omit the file name. This will create a file defaultrower.txt.
164
+ You can always run the same command to change parameters (for example
165
+ if you lost or gained weight, change the user name or password, etc.
166
+
167
+ .. image:: C:\python\rowingdata\screenshots\editrower.JPG
168
+
169
+ Now you need the data files for your row. (The install comes with a few test
170
+ files.) Get a TCX file (and a CSV summary file) from CrewNerd. TCX files from
171
+ other tools should also work (not tested), as long as the TCX is valid.
172
+
173
+ Or get a CSV export from painsled.
174
+
175
+
176
+ TCX files
177
+ -----------
178
+
179
+ Generic TCX
180
+ ....................
181
+
182
+ If you have a generic TCX file (from a SpeedCoach, from a Garmin), the
183
+ following will create plots and spit out some summary text ::
184
+
185
+ $ tcxplot tcxfile.tcx yourrower.txt
186
+
187
+ .. image:: C:\python\rowingdata\screenshots\greghoc.png
188
+
189
+ If you prefer a time based plot: ::
190
+
191
+ $ tcxplottime tcxfile.tcx yourrower.txt
192
+
193
+ Some TCX files do not have GPS position data. For example SpeedCoach with impeller.
194
+ In that case: ::
195
+
196
+ $ tcxplot_nogeo tcxfile.tcx yourrower.txt
197
+ $ tcxplottime_nogeo tcxfile.tcx yourrower.txt
198
+
199
+ The following will upload your row to the Concept2 logbook, and create a
200
+ file crewnerddata.tcx_o.csv that looks like a painsled csv, for future use ::
201
+
202
+ $ tcxtoc2 tcxfile.tcx yourrower.txt
203
+
204
+ Again, yourrower.txt is optional.
205
+
206
+
207
+ .. image:: C:\python\rowingdata\screenshots\otwscreenshot.JPG
208
+
209
+ Here is the row on the Concept2 logbook:
210
+
211
+ .. image:: C:\python\rowingdata\screenshots\otwlogbook.JPG
212
+
213
+
214
+
215
+ CrewNerd with summary
216
+ .......................
217
+
218
+ Having a crewnerddata.csv (summary csv) and a crewnerddata.tcx, the following
219
+ will create plots and spit out some summary text ::
220
+
221
+ $ crewnerdplot crewnerddata yourrower.txt
222
+
223
+ The yourrower.txt argument is the file where you keep your rower data.
224
+ This is optional. If you don't provide it, the tool will look for
225
+ defaultrower.txt. If it doesn't find that, it will use some default values.
226
+
227
+ The script will also spit out some statistics from the summary csv.
228
+
229
+ .. image:: C:\python\rowingdata\screenshots\woensdag.png
230
+
231
+
232
+ If you prefer a time based plot: ::
233
+
234
+ $ crewnerdplottime crewnerddata yourrower.txt
235
+
236
+
237
+
238
+ Painsled
239
+ ------------
240
+
241
+ Having painsled data in testdata.csv, the following will create plots and
242
+ spit out some summary text ::
243
+
244
+ $ painsledplot testdata.csv yourrower.txt
245
+
246
+ or ::
247
+
248
+ $ painsledplottime testdata.csv yourrower.txt
249
+
250
+ The yourrower.txt argument is the file where you keep your rower data.
251
+ This is optional. If you don't provide it, the tool will look for
252
+ defaultrower.txt. If it doesn't find that, it will use some default values.
253
+
254
+ .. image:: C:\python\rowingdata\screenshots\2x20min.png
255
+
256
+
257
+
258
+ The following will upload your row to the Concept2 logbook: ::
259
+
260
+ $ painsledtoc2 testdata.csv yourrower.txt
261
+
262
+ Again, yourrower.txt is optional.
263
+
264
+ .. image:: C:\python\rowingdata\screenshots\screenshot.JPG
265
+
266
+ Here is the row on the Concept2 logbook
267
+
268
+ .. image:: C:\python\rowingdata\screenshots\screenshotlogbook.JPG
269
+
270
+
271
+ SpeedCoach GPS
272
+ ---------------------
273
+
274
+ Having SpeedCoach GPS data in testdata.csv, the following will create plots and
275
+ spit out some summary text ::
276
+
277
+ $ speedcoachplot testdata.csv yourrower.txt
278
+
279
+ or ::
280
+
281
+ $ speedcoachplottime testdata.csv yourrower.txt
282
+
283
+ The yourrower.txt argument is the file where you keep your rower data.
284
+ This is optional. If you don't provide it, the tool will look for
285
+ defaultrower.txt. If it doesn't find that, it will use some default values.
286
+
287
+ The following will upload your row to the Concept2 logbook: ::
288
+
289
+ $ speedcoachtoc2 testdata.csv yourrower.txt '2015-11-05T13:15:30-05:00'
290
+
291
+ Again, yourrower.txt and date string are optional.
292
+ Because the SpeedCoach CSV file content doesn't have the row date,
293
+ you may provide a date string. The tool should be quite forgiving regarding
294
+ the exact format in which you write your date/time string. However, if
295
+ you input something ambiguous (time zone), the tool will guess
296
+ and your row may end up on the wrong date.
297
+ If nothing is provided, today's date will be taken.
298
+
299
+ RowPro
300
+ ---------------------
301
+
302
+ Having RowPro exported data in testdata.csv,
303
+ the following will create plots and
304
+ spit out some summary text ::
305
+
306
+ $ rowproplot testdata.csv yourrower.txt
307
+
308
+ or ::
309
+
310
+ $ rowproplottime testdata.csv yourrower.txt
311
+
312
+ The yourrower.txt argument is the file where you keep your rower data.
313
+ This is optional. If you don't provide it, the tool will look for
314
+ defaultrower.txt. If it doesn't find that, it will use some default values.
315
+
316
+ For RowPro CSV files, upload to C2 logbook is not available on the command
317
+ line. You can upload to C2 directly from the RowPro application.
318
+
319
+ ErgData
320
+ ---------------------
321
+
322
+ If you use ErgData, you can download a CSV file from your Concept2 log.
323
+ Here is how you use those data in this tool: ::
324
+
325
+ $ ergdataplot testdata.csv yourrower.txt
326
+
327
+ or ::
328
+
329
+ $ ergdataplottime testdata.csv yourrower.txt
330
+
331
+ The yourrower.txt argument is the file where you keep your rower data.
332
+ This is optional. If you don't provide it, the tool will look for
333
+ defaultrower.txt. If it doesn't find that, it will use some default values.
334
+
335
+ As your data are already on the Concept2 logbook, it doesn't make sense to
336
+ have a script to upload them once more.
337
+
338
+ However, you may appreciate creating a TCX file for uploading to SportTracks.mobi or Strava: ::
339
+
340
+ $ ergdatatotcx testdata.csv
341
+
342
+ This will create a file testdata.csv_o.tcx which you can upload. I have tested
343
+ this file on Strava and SportTracks with success. Somehow, even though the
344
+ resulting file validates against the TCX Schema, I wasn't able to upload the file to Garmin Connect, because Garmin Connect rejects TCX files from non-Garmin devices.
345
+
346
+ ErgStick
347
+ ---------------------
348
+
349
+ If you use ErgStick, you can download a CSV file from your Concept2 log.
350
+ Here is how you use those data in this tool: ::
351
+
352
+ $ ergstickplot testdata.csv yourrower.txt
353
+
354
+ or ::
355
+
356
+ $ ergstickplottime testdata.csv yourrower.txt
357
+
358
+ The yourrower.txt argument is the file where you keep your rower data.
359
+ This is optional. If you don't provide it, the tool will look for
360
+ defaultrower.txt. If it doesn't find that, it will use some default values.
361
+
362
+ As your data are already on the Concept2 logbook, it doesn't make sense to
363
+ have a script to upload them once more.
364
+
365
+ However, you may appreciate creating a TCX file for uploading to SportTracks.mobi or Strava: ::
366
+
367
+ $ ergsticktotcx testdata.csv
368
+
369
+ This will create a file testdata.csv_o.tcx which you can upload. I have tested
370
+ this file on Strava and SportTracks with success. Somehow, even though the
371
+ resulting file validates against the TCX Schema, I wasn't able to upload the file to Garmin Connect.
372
+
373
+ Copying to clipboard
374
+ ---------------------
375
+
376
+ From the command-line, this only works on windows: ::
377
+
378
+ $ copystats testdata.csv yourrower.txt
379
+
380
+
381
+
382
+ ==============================
383
+ Directly in Python
384
+ ==============================
385
+
386
+ Beta. Use with caution.
387
+
388
+
389
+ Import
390
+ ---------
391
+
392
+ Import the package
393
+
394
+ >>> import rowingdata
395
+
396
+ Your personal data
397
+ -----------------------
398
+
399
+ The old and difficult way
400
+ .............................
401
+
402
+ If you're not me (or have identical heart rate thresholds),
403
+ you will have to change the default values for the rower. For example:
404
+
405
+ >>> john = rowingdata.rower(hrut2=100,hrut1=120,hrat=140,hrtr=150,hran=170,hrmax=180,c2username="johntherower",c2password="caughtacrab")
406
+
407
+ You can store this locally like this
408
+
409
+ >>> john.write("johnsdata.txt")
410
+
411
+ Then you can load this like this
412
+
413
+ >>> john = rowingdata.read_obj("johnsdata.txt")
414
+
415
+ The new and easy way
416
+ .............................
417
+
418
+ Since version 0.65 there are easier ways.
419
+
420
+ Create a new rower through some interactive Q&A:
421
+
422
+ >>> rowingdata.roweredit("johnsdata.txt")
423
+
424
+ If you omit the file name, it will default to "defaultrower.txt"
425
+
426
+ >>> john = rowingdata.getrower("johnsdata.txt")
427
+
428
+ If you want to change John's data, again just type:
429
+
430
+ >>> rowingdata.roweredit("johnsdata.txt")
431
+
432
+ Painsled iOS
433
+ ----------------
434
+
435
+ To use with Painsled iOS CSV data, simply do
436
+
437
+ >>> row = rowingdata.rowingdata(csvfile="testdata.csv",rower=myrower)
438
+ >>> row.plotmeters_erg()
439
+ >>> print row.allstats()
440
+
441
+ The rowingdata object is the basic object containing your rowing data.
442
+
443
+ RowPro
444
+ -----------------
445
+
446
+ To use with RowPro CSV data, simply do
447
+
448
+ >>> rp = rowingdata.RowProParser(csvfile="RP_testdata.csv")
449
+ >>> row = rowingdata.rowingdata(df=rp.df)
450
+ >>> row.plotmeters_erg()
451
+ >>> row.plottime_erg()
452
+ >>> print row.summary()
453
+
454
+ The rp object has a dataframe "df" that you can pass to rowingdata.rowingdata
455
+ using the df keyword. Thus, you avoid storing intermediate results.
456
+
457
+ Alternatively, you can use:
458
+
459
+ >>> rp = rowingdata.RowProParser(csvfile="RP_testdata.csv")
460
+ >>> rp.write_csv("example_data.csv")
461
+ >>> row = rowingdata.rowingdata(csvfile="example_data.csv")
462
+ >>> row.plotmeters_erg()
463
+ >>> row.plottime_erg()
464
+ >>> print row.summary()
465
+
466
+ SpeedCoach
467
+ -----------------
468
+
469
+ To use with SpeedCoach CSV data, simply do
470
+
471
+ >>> sc = rowingdata.speedcoachParser(csvfile="RP_testdata.csv")
472
+ >>> row = rowingdata.rowingdata(df=sc.df)
473
+ >>> row.plotmeters_erg()
474
+ >>> row.plottime_erg()
475
+ >>> print row.summary()
476
+
477
+ CrewNerd (and other TCX)
478
+ ---------------------------
479
+
480
+ To use with CrewNerd TCX data, simply do
481
+
482
+ >>> tcx = rowingdata.TCXParser(csvfile="2016-03-25-0758.tcx")
483
+ >>> tcx.write_csv("example_data.csv")
484
+ >>> row = rowingdata.rowingdata(csvfile=open("example_data.csv"),rower=myrower)
485
+ >>> row.plotmeters_otw()
486
+ >>> row.plottime_otw()
487
+ >>> print row.summary()
488
+
489
+ Other useful stuff
490
+ ----------------------------
491
+
492
+ To get any data column as a numpy array, use (for example for HR data -
493
+ see list below for other accessible data fields).
494
+
495
+ >>> row.getvalues[' HRCur (bpm)']
496
+
497
+ Of course you have access to the entire data frame as well:
498
+
499
+ >>> df = row.df
500
+ >>> df.describe
501
+
502
+ To create the colorful plots,
503
+ assuming you have a summary file from CrewNerd called 2016-03-25-0758.CSV and
504
+ a TCX file called 2016-03-25-0758.TCX
505
+
506
+ >>> rowingdata.dorowall("2016-03-25-0758")
507
+
508
+ Plots and statistics
509
+
510
+ >>> row.uploadtoc2()
511
+
512
+ This will upload your row to Concept2 logbook. It just simply fill the online
513
+ form for you. So nothing more than total distance and duration, date, weight
514
+ category and row type.
515
+
516
+ Export or re-export to a tcx file is done with
517
+
518
+ >>> row.exporttotcx("test.tcx")
519
+
520
+ With the package at your full disposal, the sky is the limit. You can do any
521
+ plot you like or do other statistics, like calculate your average stroke length
522
+ including error margin, etc.
523
+
524
+ You can add two rowingdata objects and obtain a new one:
525
+
526
+ >>> row = row1+row2
527
+
528
+ This is an experimental feature and it may lead to unexpected results.
529
+ The addition will merge the two dataframes and sort them by time stamp,
530
+ removing duplicate time stamps.
531
+
532
+ ==============
533
+ Data Fields
534
+ ==============
535
+
536
+ The available data fields are
537
+
538
+ * 'Timestamp (sec)'
539
+ * ' Horizontal (meters)'
540
+ * ' Cadence (stokes/min'
541
+ * ' HRCur (bpm)'
542
+ * ' Stroke500mPace (sec/500m)'
543
+ * ' Power (watts)'
544
+ * ' DriveLength (meters)'
545
+ * ' StrokeDistance (meters)'
546
+ * ' DriveTime (ms)'
547
+ * ' StrokeRecoveryTime (ms)'
548
+ * ' AverageDriveForce (lbs)'
549
+ * ' PeakDriveForce (lbs)'
550
+ * 'cum_dist'
551
+
552
+ If imported from TCX, Rowpro, or other tools, some data fields may not contain
553
+ useful information.
554
+
555
+ =================
556
+ CSV File Standard
557
+ =================
558
+
559
+ The basic rowingdata class reads CSV files that adher to the standard
560
+ described here. Any parser implementation should adher to the minimum
561
+ standard as described here.
562
+
563
+ Please send to me any CSV file that adhers to the standard described here
564
+ but does not parse well in the "rowingdata" module. I will update the module
565
+ and add the file to standard testing.
566
+
567
+ Field Names (Columns)
568
+ ----------------------
569
+
570
+ The standard field names are:
571
+
572
+ * 'Timestamp (sec)'
573
+ * ' Horizontal (meters)'
574
+ * ' Cadence (stokes/min'
575
+ * ' HRCur (bpm)'
576
+ * ' Stroke500mPace (sec/500m)'
577
+ * ' Power (watts)'
578
+ * ' DriveLength (meters)'
579
+ * ' StrokeDistance (meters)'
580
+ * ' DriveTime (ms)'
581
+ * ' StrokeRecoveryTime (ms)'
582
+ * ' AverageDriveForce (lbs)'
583
+ * ' PeakDriveForce (lbs)'
584
+ * ' lapIdx'
585
+ * ' ElapsedTime (sec)'
586
+
587
+ The CSV file adhers to the US conventions, with fields
588
+ separated by a comma (',')
589
+ and using the dot '.' as the decimal symbol.
590
+
591
+ The field names are on the first line. There are no header or footer lines
592
+ in the CSV file, to simplify data ingestion.
593
+
594
+ The field names must match exactly, including use of capitals and
595
+ leading spaces. Please note the space at the beginning
596
+ of some of the field names. If one of the "standard" field names is
597
+ missing, the parser shall create it and set the values for this field to 0 (zero), except for the 'TimeStamp (sec)' field which is mandatory.
598
+
599
+ The parser shall not depend on the order of the field names (columns).
600
+ The parser may reorder columns as well as rows, for example reordering
601
+ by the time stamp.
602
+
603
+
604
+ Data Fields (Rows)
605
+ ---------------------
606
+
607
+ It is recommended that there is one data record per one rowing stroke.
608
+
609
+ Sometimes this is difficult to implement. In that case, the following
610
+ formats are happily parsed as well:
611
+
612
+ * One record per N meters traveled
613
+ * One record per N seconds
614
+
615
+ For calculating statistics, it is important to be consistent. Rowers may
616
+ use different devices to capture data in different situations.
617
+ Inconsistencies between the devices may lead to inconsistencies in aggregrate data, such as (for example) an app that calculates the number of strokes
618
+ taken during a season.
619
+ As a "stroke" is a
620
+ unit that is natural for rowers, we recommend to have one data field
621
+ per stroke.
622
+
623
+ Unless otherwise stated below, all numerical types shall be parsed by
624
+ the parser, so it is up to the user to implement single, double, decimal
625
+ or integer, and common (en-US) numerical notation shall be parsed well, e.g.
626
+
627
+ * 234 (integer)
628
+ * 22.1 (float)
629
+ * 6.3e4 (scientific)
630
+
631
+ Percentages are not guaranteed to be parsed well. Use fractions, e.g.:
632
+
633
+ * 0.67 (good)
634
+ * 67% (not good)
635
+
636
+ Missing Data
637
+ -------------
638
+
639
+ If a measuring device does not obtain a value during a stroke, this shall
640
+ be indicated in the file. Avoid using dummy values. It will be up to the
641
+ parser and further data processing to "clean" the data.
642
+
643
+ Recommended values are 'nan' (not a number), or leaving the field empty.
644
+
645
+ Please not that 'nan' replacing a missing time stamp may lead to
646
+ unpredictable results.
647
+
648
+ TimeStamp (sec)
649
+ ---------------
650
+
651
+ Field name: 'TimeStamp (sec)' (no leading space).
652
+
653
+ Unit: seconds
654
+
655
+ This shall be a Unix time stamp (seconds since January 1, 1970, midnight UTC/GMT) in the UTC time zone.
656
+
657
+ For human readability, it is advised to add a ISO8601 formatted time stamp
658
+ as a separate column called ' ISO8601'.
659
+
660
+ The value reported shall be the time at the end of the stroke cycle (i.e.
661
+ the start of the next stroke), or
662
+ at the crossing of the finish line (or lap end distance), whichever
663
+ is first. If this
664
+ is not adhered to, lap times may be inaccurate.
665
+
666
+ The precision may be up to microseconds, but as a minimum the parser shall
667
+ take into account tenths of seconds.
668
+
669
+ It is strongly advised to have no "missing data" in the time stamp field.
670
+
671
+ Distance (m)
672
+ ------------
673
+
674
+ Field name: ' Horizontal (meters)'
675
+
676
+ Unit: meters
677
+
678
+ This is the distance covered at the end of the stroke since the beginning
679
+ of the workout or lap.
680
+
681
+ For best results, it is recommended to report the cumulative distance since
682
+ the beginning of the workout, but it is allowed to reset the distance at
683
+ the beginning of each lap.
684
+
685
+ Cadence (SPM)
686
+ --------------
687
+
688
+ Field name: ' Cadence (stokes/min)'
689
+
690
+ Unit: strokes/min
691
+
692
+ Please note the typo in the field name. It is recommended that the parser
693
+ checks for "strokes" if "stokes" is not found, but this is not guaranteed.
694
+
695
+ Heart Rate
696
+ -----------
697
+
698
+ Field name: ' HRCur (bpm)'
699
+
700
+ Unit: beats per minute
701
+
702
+ Heart Rate in beats per minute
703
+
704
+ Pace
705
+ ------
706
+
707
+ Field name: ' Stroke500mPace (sec/500m)'
708
+
709
+ Unit: seconds
710
+
711
+ Pace in seconds per 500m. Avoid negative values.
712
+
713
+ When the rower stops, this value goes to infinity. Use empty field, 'nan',
714
+ 'inf' or equivalent. Avoid inserting 0, because this will mess
715
+ up speed calculations.
716
+
717
+ If this field is missing, there must be a possibility to calculate it
718
+ from distance and time fields. If distance and pace fields are missing,
719
+ the parser may throw an error.
720
+
721
+ Power (watts)
722
+ --------------
723
+
724
+ Field name: ' Power (watts)'
725
+
726
+ Unit: Watt
727
+
728
+ Power in watts. For erg it should be the power reported by the monitor.
729
+ For OTW rowing, it is recommended that this is the total mechanical
730
+ power exerted by the rower, i.e. power used for propulsion, plus waste
731
+ (puddles, drag), as opposed to the metabolistic power.
732
+
733
+ Drive Length
734
+ -------------
735
+
736
+ Field name: ' DriveLength (meters)'
737
+
738
+ Unit: meter
739
+
740
+ The distance traveled by the handle along the longitudal
741
+ axis of the boat or erg.
742
+
743
+ For OTW rowing, where the oar or scull rotates around the pin, this
744
+ is not equal to the length trajectory traveled by the hands. It
745
+ is the projection of that trajectory on the longitudal axis.
746
+
747
+ Stroke Distance
748
+ ------------------------
749
+
750
+ Field name: ' StrokeDistance (meters)'
751
+
752
+ Unit: meter
753
+
754
+ The distance traveled during the stroke cycle.
755
+
756
+ Drive Time
757
+ -------------
758
+
759
+ Field name: ' DriveTime (ms)'
760
+
761
+ Unit: ms
762
+
763
+ The duration of the drive part (from catch to finish) of the stroke. For
764
+ OTW rowing it is recommended to measure this as
765
+ the time it takes from the minimum (catch) oar angle to the maximum (finish)
766
+ or angle,
767
+ as opposed to "blade in" to "blade out" times.
768
+
769
+ Recovery Time
770
+ ---------------
771
+
772
+ Field name: ' StrokeRecoveryTime (ms)'
773
+
774
+ Unit: ms
775
+
776
+ The duration of the recovery part. See Drive Time for the definition. Drive Time plus Recovery Time should equal the duration of the entire stroke cycle.
777
+
778
+ Average Drive Force
779
+ --------------------
780
+
781
+ Field name: ' AverageDriveForce (lbs)' / ' AverageDriveForce (N)'
782
+
783
+ Unit: lbs - or N, see below
784
+
785
+ Currently implemented is only the field name and value in lbs. In the future,
786
+ we will implement ' AverageDriveForce (N)' so we can report in SI units.
787
+
788
+ This should be the part of the handle force that does actual work.
789
+
790
+ For dynamic ergs and OTW rowing this is not sufficient to describe the
791
+ complete stroke dynamics, so additional fields can be defined, for example
792
+ ' StretcherForce'.
793
+
794
+ For OTW rowing there are various measurement systems. Some measure at
795
+ or near the handle. Some measure at the pin.
796
+
797
+ I recommend to either
798
+
799
+ * Recalculate to handle force if possible, adding a separate field with the
800
+ real measured value and a descriptive field name
801
+
802
+ * Report the real measured value in this field as well as in a separate
803
+ field with a descriptive field name
804
+
805
+ The average should be an average over the working distance of the force,
806
+ as opposed to an average over time or oar angles.
807
+
808
+ Peak Drive Force
809
+ ------------------
810
+
811
+ Field name: ' PeakDriveForce (lbs)' or ' PeakDriveForce (N)'
812
+
813
+ Unit: lbs (currently) or N (supported in the future)
814
+
815
+ See discusison about measuring forces under Average Drive Force.
816
+
817
+ Lap Identifier
818
+ -------------------
819
+
820
+ Field name: ' lapIdx'
821
+
822
+ Unit: N/A
823
+
824
+ A unique identifier identifying the lap. It is recommended to use
825
+ integer numbers, starting at 0, and increasing in time, but the following
826
+ should also parse well:
827
+
828
+ * 'aap', 'noot', 'mies', 'jet'
829
+ * 'a', 'b', 'c'
830
+ * 'first', 'second', 'third'
831
+ * 'clubtobridge', 'straightkm', etc ..
832
+
833
+ As long as each identifier is unique.
834
+
835
+ Elapsed Time
836
+ --------------------
837
+
838
+ Field name: ' ElapsedTime (sec)'
839
+
840
+ Unit: Seconds
841
+
842
+ Elapsed time since start of workout (or interval). The value may
843
+ reset at the start of a new lap. In that case, it should be consistent
844
+ with the lap identifier.
845
+
846
+ Measured at the end of the stroke cycle or when crossing the finish or lap
847
+ line, whatever comes first. The first reported time in a new lap or workout
848
+ should be at the end of the first stroke cycle.
849
+
850
+ Seconds in decimal notation. So '32425.2' is good. Other time notations,
851
+ e.g. '34:45.2' may not be parsed.
852
+
853
+ Workout State
854
+ --------------
855
+
856
+ Field name: ' WorkoutState'
857
+
858
+ A number indicating the workout state, following the Concept2 erg convention:
859
+
860
+ * Work strokes: 1, 4, 5, 6, 7, 8, 9
861
+ * Rest strokes: 3
862
+ * Transitions: 0,2,10,11,12,13
863
+
864
+ The transitions ("waiting for interval start") are not supported, so a
865
+ parser may simply consider all strokes with a workout state that is not
866
+ equal to 3 as work strokes.
867
+
868
+ It is not mandatory to record rest (paddle) strokes, but it is recommended.
869
+
870
+ If this field is not present, the parser shall assume that all strokes
871
+ are work strokes.
872
+
873
+ Coordinates
874
+ ------------
875
+
876
+ Field names: ' latitude', ' longitude'
877
+
878
+ Units: degrees, in decimal notation
879
+
880
+ For example:
881
+
882
+ * 52.059876, 5.111655 (good)
883
+ * 52 03'35.5"N, 5 06'42.0"E (bad)
884
+
885
+ Wind speed and direction
886
+ --------------------------
887
+
888
+ Field names: 'vwind' and 'winddirection'
889
+
890
+ Units: m/s and degrees (0 = North, 90 = East)
891
+
892
+ Boat bearing
893
+ -------------
894
+
895
+ Field name: 'bearing'
896
+
897
+ Unit: degrees
898
+
899
+ Boat bearing.
900
+
901
+ ================
902
+ Release Notes:
903
+ ================
904
+
905
+ 0.97.x
906
+ ------
907
+
908
+ - Improved time zone awareness
909
+
910
+ 0.96.x
911
+ ------
912
+
913
+ - Improved Interval String Parser
914
+
915
+ 0.95.x
916
+ ------
917
+
918
+ - Bug fixes on TCX export
919
+ - Added addition method to rowingdata object
920
+ - ErgData parser: Offset ElapsedTime by the value of the first stroke
921
+ - BoatCoach parser: Calculate RecoveryTime
922
+ - Added support for NK SpeedCoach set to impeller
923
+
924
+ 0.94.x
925
+ ------
926
+
927
+ - Recognizes C2 logbook summary CSV (which is not supported)
928
+ - Added RowPerfect3 Parser
929
+
930
+ 0.93.x
931
+ ------
932
+ - Added support for Empower Oarlock parameters from the CSV file export from SpeedCoach GPS 2 with Data Pack (LiNK v1.27 and higher)
933
+ - Enabled gzip (through gzip=True in write_csv)
934
+ - Revamped CSV parsers.
935
+
936
+ 0.92.x
937
+ ------
938
+
939
+ - Added Power Zones
940
+ - Improved Pie Charts
941
+ - Added drag info to some charts
942
+ - Bug fix in summary statistics
943
+ - Updated ErgDataParser because ErgData corrected a typo in their column header
944
+ - Added power info to summary and interval summaries
945
+ - Added BoatCoachParser
946
+
947
+ 0.90.x
948
+ ------
949
+
950
+ - Improved handling of RowPro files. Taking the split/interval info from the footer and putting it in the resulting data frame.
951
+ - Added functionality to update the intervals/splits
952
+ - Some fiddling with the interval statistics calculations
953
+
954
+ 0.89.x
955
+ -------
956
+
957
+ - Some internal optimizations to reduce memory consumption
958
+ - A simple EU format "1.000,0" instead of "1 000.0" recognition added to RowProParser
959
+ - Added a MysteryParser for a CSV file type that is clearly rowing data, but I don't know the origin
960
+
961
+ 0.86.x
962
+ -------
963
+
964
+ - Added support for SpeedCoach GPS 2 CSV file
965
+ - Added support for FIT files
966
+ - Improved the CrewNerd summary (now calculates time weighted averages)
967
+
968
+ 0.85.x
969
+ -------
970
+
971
+ - Changes to support rowsandall.com rowing physics calculations
972
+ - TCX Export now adds Power if power calculations have been done
973
+
974
+ 0.84.x
975
+ -------
976
+
977
+ - Added support for wind and stream updates on rowsandall.com
978
+ - Other changes to support rowsandall.com rowing physics calculations
979
+
980
+
981
+ 0.81.x
982
+ ------
983
+
984
+ - added some plotting for rowsandall.com
985
+ - a workaround for the ugly HR plateaux in plots from CrewNerd
986
+
987
+ 0.80.x
988
+ -------
989
+
990
+ - fixed bug in summary strings for CrewNerd plots
991
+ - fixed bug in parser of ErgData files. Interval workouts should now work well.
992
+
993
+ 0.79.x
994
+ -------
995
+
996
+ - rowingdata now uses a file object instead of a file name. Command-line tools updated.
997
+ - added code to get image objects (for use on web app)
998
+ - changing RowPro to cumulativetime
999
+
1000
+
1001
+ 0.78.x
1002
+ -------
1003
+
1004
+ - Added some experimental code for doing wind corrected pace
1005
+ - Improved TCX processing (to minimize impact of some CrewNerd glitches)
1006
+
1007
+ 0.77.x
1008
+ -------
1009
+
1010
+ - Added ErgStickParser
1011
+ - Added write_csv(writeFile) to rowingdata class
1012
+
1013
+ 0.76.x
1014
+ -------
1015
+
1016
+ - Added export to TCX file
1017
+ - Corrected some bugs in dynamic y axis algo
1018
+ - Corrected bug in Meter based OTW rowing plots (missing AN HR data in bar chart)
1019
+ - Correct bug in CrewNerd summary stats algorithm.
1020
+ - Pie chart improved: Now matches the HR bar plot (difference between < and <=)
1021
+ - Pie chart - strange values. Corrected.
1022
+
1023
+ 0.75.x
1024
+ -------
1025
+
1026
+ - Added plotting for ErgData CSV files (exported from Concept2 log)
1027
+ - Improved the colorful HR bar charts (with width parameter)
1028
+ - Made y axis ranges dynamic (except for stroke rate plots)
1029
+ - Replaced moving average with Exponentially Weighted Moving Average. Sounds more scientific. Doesn't make a big difference in the data.
1030
+ - In TCXParser, moved some of the heavy data lifting to __init__ (from write_csv)
1031
+
1032
+ 0.74.x
1033
+ --------
1034
+
1035
+ - Added command-line scripts to plot data from RowPro
1036
+ - Added Pie Chart as extra plot to time based plot
1037
+
1038
+
1039
+ 0.73.x
1040
+ --------
1041
+
1042
+ - Added parser for speedcoach CSV files
1043
+ - Fixed bugs in RowProParser
1044
+
1045
+
1046
+ 0.72.x
1047
+ --------
1048
+
1049
+ - added command line tools for generic TCX files (should work with RIM)
1050
+
1051
+ 0.71.x
1052
+ --------
1053
+
1054
+ - painsledDesktopParser now removes the "00 waiting to row": Statistics for Painsled Desktop work
1055
+ - Command line scripts should now install well
1056
+ - Moved test data to testdata folder
1057
+ - replaced * operator for the bool dtype with &
1058
+ - tested on Linux (Ubuntu), Mac OS X (thx Greg), Windows 7 & Windows 10
1059
+ - fixed bug related to clipboard copying on Mac and Linux. I have temporarily disabled clipboard copying of summary strings for all platforms except windows.
1060
+ - using elapsed time where possible instead of time stamps
1061
+
1062
+ 0.65
1063
+ ------
1064
+
1065
+ - Expanded command line scripts with time plots
1066
+ - Command line scripts now take a rower file as an optional second argument
1067
+ - Command line script to change rower parameters easily
1068
+
1069
+ 0.63
1070
+ ------
1071
+
1072
+ - Fixed a bug that caused unwanted forgetting of Concept2 username and password
1073
+
1074
+ 0.62
1075
+ -------
1076
+
1077
+ - Fixed the time plot bug which also led to errors in the Concept2 upload (needed to sort the painsled data by time)
1078
+
1079
+ 0.6
1080
+ -------
1081
+
1082
+ - Added command-line tools and some test data
1083
+
1084
+ 0.52
1085
+ -------
1086
+
1087
+ - Adding weight and row type to Concept2 upload
1088
+ - Adding options to locally save concept2 username and password
1089
+ - Added row type (e.g. "Indoor Rower" or "On-water") to rowingdata
1090
+
1091
+
1092
+ 0.51
1093
+ -------
1094
+
1095
+ - Corrected some dependencies errors
1096
+
1097
+ 0.5
1098
+ -------
1099
+
1100
+ - Upload to Concept2 logbook is working!
1101
+
1102
+ 0.45
1103
+ --------
1104
+
1105
+ - Added saving and loading of rower data (so you can store your password and HR data)
1106
+
1107
+ 0.43
1108
+ --------
1109
+
1110
+ - Attempting to remove the dubious DataFrame copy errors using df.loc
1111
+
1112
+ 0.42
1113
+ --------
1114
+ - Added RowPro CSV Parser
1115
+ - Added summary statistics and interval statistics (also copies the output to clipboard)
1116
+ - Interval statistics now (sort of) works for Desktop Painsled data
1117
+
1118
+
1119
+
1120
+ ======================
1121
+ Known bugs
1122
+ ======================
1123
+
1124
+ * Copy to clipboard doesn't work from command-line on Linux, OS X
1125
+ * The summary statistics don't work well when you use the TCX from Rowing in Motion (RIM).
1126
+ * RowProParser doesn't read the header information. Total row time reported by the tool is shorter by about half a stroke. Also there are a few meters missing. As RowPro has its own upload to C2 log, I didn't fix this bug. I guess RowPro users would use the tool mainly for plotting.
1127
+ * The TCX created from the CSV doesn't work upload to Garmin Connect. This is not a bug. It's Garmin's policy to not accept TCX from non-Garmin devices.
1128
+
1129
+
1130
+ =======================
1131
+ Future functionality
1132
+ =======================
1133
+
1134
+ * Add support for other erg software tools (just need the csv/tcx and it will be easy)
1135
+
1136
+ * Done for generic TCX
1137
+
1138
+ * Done for CSV from SpeedCoach
1139
+
1140
+ * Done for RowPro
1141
+
1142
+ * Done for ErgData
1143
+
1144
+ * Done for ErgStick
1145
+
1146
+
1147
+ * Come up with a way to add Watts to the rowing plots - Done in EXPERIMENTAL mode
1148
+
1149
+ * Use the C2 logbook API and add splits and other data to the workout on the Concept2 logbook