rowingdata 3.6.6__tar.gz → 3.6.7__tar.gz

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 (192) hide show
  1. {rowingdata-3.6.6/rowingdata.egg-info → rowingdata-3.6.7}/PKG-INFO +20 -1
  2. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/checkdatafiles.py +6 -0
  3. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/csvparsers.py +10 -2
  4. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/rowingdata.py +283 -23
  5. {rowingdata-3.6.6 → rowingdata-3.6.7/rowingdata.egg-info}/PKG-INFO +20 -1
  6. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/testdatasummary.csv +0 -2
  7. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/testtcx.tcx +1 -1
  8. {rowingdata-3.6.6 → rowingdata-3.6.7}/tests/test_rowingdata.py +1 -7
  9. {rowingdata-3.6.6 → rowingdata-3.6.7}/LICENSE +0 -0
  10. {rowingdata-3.6.6 → rowingdata-3.6.7}/MANIFEST.in +0 -0
  11. {rowingdata-3.6.6 → rowingdata-3.6.7}/README.rst +0 -0
  12. {rowingdata-3.6.6 → rowingdata-3.6.7}/bin/crewnerddata.csv +0 -0
  13. {rowingdata-3.6.6 → rowingdata-3.6.7}/bin/crewnerddata.tcx +0 -0
  14. {rowingdata-3.6.6 → rowingdata-3.6.7}/bin/testdata.csv +0 -0
  15. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/.buildinfo +0 -0
  16. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/2x20min.png +0 -0
  17. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/editrower.JPG +0 -0
  18. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/greghoc.png +0 -0
  19. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/image001.png +0 -0
  20. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/otwlogbook.JPG +0 -0
  21. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/otwscreenshot.JPG +0 -0
  22. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/screenshot.JPG +0 -0
  23. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/screenshotlogbook.JPG +0 -0
  24. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_images/woensdag.png +0 -0
  25. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_sources/index.txt +0 -0
  26. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_sources/modules.txt +0 -0
  27. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_sources/rowingdata.txt +0 -0
  28. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/ajax-loader.gif +0 -0
  29. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/alabaster.css +0 -0
  30. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/basic.css +0 -0
  31. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/comment-bright.png +0 -0
  32. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/comment-close.png +0 -0
  33. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/comment.png +0 -0
  34. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/custom.css +0 -0
  35. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/doctools.js +0 -0
  36. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/down-pressed.png +0 -0
  37. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/down.png +0 -0
  38. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/file.png +0 -0
  39. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/jquery-1.11.1.js +0 -0
  40. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/jquery.js +0 -0
  41. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/minus.png +0 -0
  42. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/plus.png +0 -0
  43. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/pygments.css +0 -0
  44. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/searchtools.js +0 -0
  45. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/underscore-1.3.1.js +0 -0
  46. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/underscore.js +0 -0
  47. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/up-pressed.png +0 -0
  48. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/up.png +0 -0
  49. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/_static/websupport.js +0 -0
  50. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/genindex.html +0 -0
  51. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/index.html +0 -0
  52. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/modules.html +0 -0
  53. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/objects.inv +0 -0
  54. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/py-modindex.html +0 -0
  55. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/rowingdata.html +0 -0
  56. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/search.html +0 -0
  57. {rowingdata-3.6.6 → rowingdata-3.6.7}/docs/_build/html/searchindex.js +0 -0
  58. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/__init__.py +0 -0
  59. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/__main__.py +0 -0
  60. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/boatedit.py +0 -0
  61. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/copystats.py +0 -0
  62. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/crewnerdplot.py +0 -0
  63. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/crewnerdplottime.py +0 -0
  64. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/ergdataplot.py +0 -0
  65. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/ergdataplottime.py +0 -0
  66. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/ergdatatotcx.py +0 -0
  67. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/ergstickplot.py +0 -0
  68. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/ergstickplottime.py +0 -0
  69. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/ergsticktotcx.py +0 -0
  70. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/gpxtools.py +0 -0
  71. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/gpxwrite.py +0 -0
  72. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/konkatenaadje.py +0 -0
  73. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/laptesting.py +0 -0
  74. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/obsolete.py +0 -0
  75. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/otherparsers.py +0 -0
  76. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/painsled_desktop_plot.py +0 -0
  77. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/painsled_desktop_plottime.py +0 -0
  78. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/painsled_desktop_toc2.py +0 -0
  79. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/painsledplot.py +0 -0
  80. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/painsledplottime.py +0 -0
  81. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/painsledtoc2.py +0 -0
  82. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/roweredit.py +0 -0
  83. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/rowproplot.py +0 -0
  84. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/rowproplottime.py +0 -0
  85. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/speedcoachplot.py +0 -0
  86. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/speedcoachplottime.py +0 -0
  87. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/speedcoachtoc2.py +0 -0
  88. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/tcxplot.py +0 -0
  89. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/tcxplot_nogeo.py +0 -0
  90. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/tcxplottime.py +0 -0
  91. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/tcxplottime_nogeo.py +0 -0
  92. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/tcxtoc2.py +0 -0
  93. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/tcxtools.py +0 -0
  94. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/trainingparser.py +0 -0
  95. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/utils.py +0 -0
  96. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/windcorrected.py +0 -0
  97. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata/writetcx.py +0 -0
  98. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata.egg-info/SOURCES.txt +0 -0
  99. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata.egg-info/dependency_links.txt +0 -0
  100. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata.egg-info/not-zip-safe +0 -0
  101. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata.egg-info/requires.txt +0 -0
  102. {rowingdata-3.6.6 → rowingdata-3.6.7}/rowingdata.egg-info/top_level.txt +0 -0
  103. {rowingdata-3.6.6 → rowingdata-3.6.7}/setup.cfg +0 -0
  104. {rowingdata-3.6.6 → rowingdata-3.6.7}/setup.py +0 -0
  105. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/2016-03-25-0758.CSV +0 -0
  106. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/2016-03-25-0758_data.CSV +0 -0
  107. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/2x20min_o.csv +0 -0
  108. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/3km_cd_o.csv +0 -0
  109. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/EUBoatCoach.csv +0 -0
  110. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/EmpowerSpeedCoachForce.csv +0 -0
  111. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/NKEmporfromgreg.csv +0 -0
  112. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/NKLiNKv130.csv +0 -0
  113. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/NoHR.tcx +0 -0
  114. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/PainsledForce.csv +0 -0
  115. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/RP_interval.csv +0 -0
  116. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/RP_interval.csv_o.CSV +0 -0
  117. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/RP_testdata.csv +0 -0
  118. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/SpdCoach2_imp_inconsistent.csv +0 -0
  119. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/SpdCoachAmbiguous.csv +0 -0
  120. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/SpeedCoach GPS Workout.csv +0 -0
  121. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/SpeedCoach2Link_interval.csv +0 -0
  122. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/SpeedCoach2Linkv1.27.csv +0 -0
  123. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/SpeedCoach2v2.12.csv +0 -0
  124. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/Speedcoach2example.csv +0 -0
  125. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/aritmo.csv +0 -0
  126. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/bc1.csv +0 -0
  127. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/bc2.csv +0 -0
  128. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/bc3.csv +0 -0
  129. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/boatcoach.csv +0 -0
  130. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/boatcoach_fixed_distance.csv +0 -0
  131. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/boatcoach_otw.csv +0 -0
  132. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/correctedpainsled.csv +0 -0
  133. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/coxmate.csv +0 -0
  134. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/crewnerd_interval.csv +0 -0
  135. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/crewnerddata.CSV +0 -0
  136. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/crewnerddata.tcx +0 -0
  137. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/crewnerddata_o.CSV +0 -0
  138. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/cumvalues.csv +0 -0
  139. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/ergdata_example.csv +0 -0
  140. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/ergdata_example.csv_o.CSV +0 -0
  141. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/ergstick.csv +0 -0
  142. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/ergstick.csv_o.CSV +0 -0
  143. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/ergstick2.csv +0 -0
  144. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/ergstick_o.csv +0 -0
  145. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/example.csv +0 -0
  146. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/example_data.csv +0 -0
  147. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/faketcx.tcx +0 -0
  148. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/float.csv +0 -0
  149. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/herodata.csv +0 -0
  150. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/humon.csv +0 -0
  151. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/impeller_empower.csv +0 -0
  152. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/invalidchar.tcx +0 -0
  153. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/kinomap.csv +0 -0
  154. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/mystery.csv +0 -0
  155. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/nk_logbook.csv +0 -0
  156. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/painsled.tcx +0 -0
  157. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/painsled_desktop_example.csv +0 -0
  158. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/painsled_out_data.csv +0 -0
  159. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/painsled_to_csv_20160221-105218_erg-400150318_760465m.csv +0 -0
  160. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/quiske_per_stroke_left.csv +0 -0
  161. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/quiske_per_stroke_new.csv +0 -0
  162. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/quiske_per_stroke_right.csv +0 -0
  163. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/quiske_per_stroke_seat.csv +0 -0
  164. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/recover.tcx +0 -0
  165. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/ritmointervals.csv +0 -0
  166. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rowingdata_eth.csv +0 -0
  167. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rowinginmotionexample.TCX +0 -0
  168. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rowinginmotionexample.TCX_o.CSV +0 -0
  169. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rowperfect.csv +0 -0
  170. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rowpro5.csv +0 -0
  171. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rowpro_carrick.csv +0 -0
  172. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rp3_curve.csv +0 -0
  173. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rp3intervals.csv +0 -0
  174. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rp3intervals2.csv +0 -0
  175. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/rp_out.csv +0 -0
  176. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/smartrow.csv +0 -0
  177. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/smartrow_intervals.csv +0 -0
  178. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/spdcoach2noheader.csv +0 -0
  179. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/speedcoach2test2.csv +0 -0
  180. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/speedcoach3test3.csv +0 -0
  181. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/speedcoachexample.csv +0 -0
  182. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/speedcoachexample.csv_o.CSV +0 -0
  183. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/summarytest.csv +0 -0
  184. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/testdata.csv +0 -0
  185. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/testdata_part1.csv +0 -0
  186. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/testdata_part2.csv +0 -0
  187. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/testlapidx.csv +0 -0
  188. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/testtcs_210614.tcx +0 -0
  189. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/testtcx_210614.tcx +0 -0
  190. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata/tim.csv +0 -0
  191. {rowingdata-3.6.6 → rowingdata-3.6.7}/testdata//345/210/222/350/210/271.csv" +0 -0
  192. {rowingdata-3.6.6 → rowingdata-3.6.7}/tests/testparser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rowingdata
3
- Version: 3.6.6
3
+ Version: 3.6.7
4
4
  Summary: The rowingdata library to create colorful plots from CrewNerd, Painsled and other rowing data tools
5
5
  Home-page:
6
6
  Author: Sander Roosendaal
@@ -9,6 +9,25 @@ License: MIT
9
9
  Keywords: rowing ergometer concept2
10
10
  Classifier: Programming Language :: Python :: 3
11
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
12
31
 
13
32
  **************
14
33
  Rowingdata
@@ -1,5 +1,6 @@
1
1
  from __future__ import absolute_import
2
2
  from __future__ import print_function
3
+ import polars as pl
3
4
 
4
5
  try:
5
6
  from . import rowingdata
@@ -151,6 +152,11 @@ def checkfile(f2, verbose=False):
151
152
  else:
152
153
  row = rowingdata.rowingdata(csvfile=f2)
153
154
 
155
+ row.write_csv(f2+'pl.csv')
156
+ row2 = rowingdata.rowingdata_pl(csvfile=f2 + 'pl.csv')
157
+ os.remove(f2 + 'pl.csv')
158
+ row2 = rowingdata.rowingdata_pl(df=pl.from_pandas(row.df))
159
+
154
160
  nr_of_rows = row.number_of_rows
155
161
  distmax = row.df['cum_dist'].max()
156
162
  timemax = row.df['TimeStamp (sec)'].max() - row.df['TimeStamp (sec)'].min()
@@ -1969,10 +1969,18 @@ class HeroParser(CSVParser):
1969
1969
 
1970
1970
  class SmartRowParser(CSVParser):
1971
1971
  def __init__(self, *args, **kwargs):
1972
+ if args:
1973
+ csvfile = args[0]
1974
+ else: # pragma: no cover
1975
+ csvfile = kwargs['csvfile']
1976
+
1977
+ separator = get_separator(5, csvfile)
1978
+ kwargs['sep'] = separator
1979
+
1972
1980
  super(SmartRowParser, self).__init__(*args, **kwargs)
1973
1981
 
1974
1982
  self.cols = [
1975
- 'Second (#)',
1983
+ 'Timestamp (UTC)',
1976
1984
  'Distance (m)',
1977
1985
  'Stroke rate (SPM)',
1978
1986
  'Heart rate (bpm)',
@@ -1986,7 +1994,7 @@ class SmartRowParser(CSVParser):
1986
1994
  '', #' AverageDriveForce (lbs)',
1987
1995
  '', #' PeakDriveForce (lbs)',
1988
1996
  '', #' lapIdx',
1989
- '', #Second (#)',
1997
+ 'Second (#)',
1990
1998
  '', #' latitude',
1991
1999
  '', #' longitude',
1992
2000
  ]
@@ -5,7 +5,7 @@ from __future__ import print_function
5
5
  from six.moves import range
6
6
  from six.moves import input
7
7
 
8
- __version__ = "3.6.6"
8
+ __version__ = "3.6.7"
9
9
 
10
10
  from collections import Counter
11
11
 
@@ -40,7 +40,7 @@ import math
40
40
  from math import cos
41
41
 
42
42
  import pickle
43
-
43
+ import gzip
44
44
  import time
45
45
  import warnings
46
46
  import sys
@@ -58,6 +58,7 @@ import numpy as np
58
58
  from numpy import isinf, isnan
59
59
 
60
60
  import pandas as pd
61
+ import polars as pl
61
62
  from pandas import DataFrame, Series
62
63
 
63
64
 
@@ -1778,6 +1779,40 @@ def addpowerzones(df, ftp, powerperc):
1778
1779
 
1779
1780
  return df
1780
1781
 
1782
+ def addpowerzones_pl(df, ftp, powerperc):
1783
+ percut2, percut1, percat, perctr, percan = np.array(powerperc) / 100.
1784
+
1785
+ ut2, ut1, at, tr, an = ftp * np.array(powerperc) / 100.
1786
+
1787
+ df = df.with_columns([
1788
+ (pl.when(pl.col(" Power (watts)") <= ut2).then(pl.col(" Power (watts)"))
1789
+ .otherwise(pl.lit(0))).alias("pw_ut2"),
1790
+ (pl.when(pl.col(" Power (watts)") > ut2, pl.col(" Power (watts)") <= ut1).then(pl.col(" Power (watts)"))
1791
+ .otherwise(pl.lit(0))).alias("pw_ut1"),
1792
+ (pl.when(pl.col(" Power (watts)") > ut1, pl.col(" Power (watts)") <= at).then(pl.col(" Power (watts)"))
1793
+ .otherwise(pl.lit(0))).alias("pw_at"),
1794
+ (pl.when(pl.col(" Power (watts)") > at, pl.col(" Power (watts)") <= tr).then(pl.col(" Power (watts)")).otherwise(pl.lit(0))).alias("pw_tr"),
1795
+ (pl.when(pl.col(" Power (watts)") > tr, pl.col(" Power (watts)") <= an).then(pl.col(" Power (watts)")).otherwise(pl.lit(0))).alias("pw_an"),
1796
+ (pl.when(pl.col(" Power (watts)") > an, pl.col(" Power (watts)") <= 360).then(pl.col(" Power (watts)")).otherwise(pl.lit(0))).alias("pw_max"),
1797
+ ]
1798
+ )
1799
+
1800
+ return df
1801
+
1802
+
1803
+ def addzones_pl(df, ut2, ut1, at, tr, an, mmax):
1804
+ df = df.with_columns([
1805
+ (pl.when(pl.col(" HRCur (bpm)") <= ut2).then(pl.col(" HRCur (bpm)")).otherwise(pl.lit(0))).alias("hr_ut2"),
1806
+ (pl.when(pl.col(" HRCur (bpm)") > ut2, pl.col(" HRCur (bpm)") <= ut1).then(pl.col(" HRCur (bpm)")).otherwise(pl.lit(0))).alias("hr_ut1"),
1807
+ (pl.when(pl.col(" HRCur (bpm)") > ut1, pl.col(" HRCur (bpm)") <= at).then(pl.col(" HRCur (bpm)")).otherwise(pl.lit(0))).alias("hr_at"),
1808
+ (pl.when(pl.col(" HRCur (bpm)") > at, pl.col(" HRCur (bpm)") <= tr).then(pl.col(" HRCur (bpm)")).otherwise(pl.lit(0))).alias("hr_tr"),
1809
+ (pl.when(pl.col(" HRCur (bpm)") > tr, pl.col(" HRCur (bpm)") <= an).then(pl.col(" HRCur (bpm)")).otherwise(pl.lit(0))).alias("hr_an"),
1810
+ (pl.when(pl.col(" HRCur (bpm)") > an, pl.col(" HRCur (bpm)") <= 360).then(pl.col(" HRCur (bpm)")).otherwise(pl.lit(0))).alias("hr_max"),
1811
+ ]
1812
+ )
1813
+
1814
+ return df
1815
+
1781
1816
  def addzones(df, ut2, ut1, at, tr, an, mmax):
1782
1817
  # define an additional data frame that will hold the multiple bar plot data and the hr
1783
1818
  # limit data for the plot, it also holds a cumulative distance column
@@ -1868,6 +1903,249 @@ def getaddress(spm,vw,vb):
1868
1903
 
1869
1904
  return i,j,k
1870
1905
 
1906
+
1907
+ class rowingdata_pl:
1908
+ """
1909
+ This is used if you want to get a polars DataFrame. This class is much more finicky about
1910
+ the data, and might fail reading a csv file where the class rowingdata succeeds.
1911
+
1912
+ There are no plans to exactly reproduce the pandas version's functionality here.
1913
+
1914
+ The intention is to be strict about the width and data types of the resulting data frame.
1915
+ """
1916
+ def __init__(self, *args, **kwargs):
1917
+ if 'debug' in kwargs: # pragma: no cover
1918
+ debug = kwargs['debug']
1919
+ else:
1920
+ debug = False
1921
+
1922
+ self.debug = debug
1923
+
1924
+ readFile = None
1925
+ if 'csvfile' in kwargs:
1926
+ readFile = kwargs['csvfile']
1927
+
1928
+ rwr = kwargs.get('rower', rower())
1929
+
1930
+ rowtype = kwargs.get('rowtype', 'Indoor Rower')
1931
+
1932
+
1933
+ sled_df = pl.DataFrame()
1934
+ if 'df' in kwargs:
1935
+ sled_df = kwargs['df']
1936
+ readFile = None
1937
+ elif readFile:
1938
+ try:
1939
+ try:
1940
+ sled_df = pl.read_csv(readFile,encoding='utf-8', infer_schema_length=1000)
1941
+ except IOError: # pragma: no cover
1942
+ sled_df = pl.read_csv(readFile + '.gz',encoding='utf-8')
1943
+ except:
1944
+ sled_df = pl.DataFrame()
1945
+ except IOError: # pragma: no cover
1946
+ try:
1947
+ f = open(readFile)
1948
+ sled_df = pl.read_csv(f)
1949
+ f.close()
1950
+ except IOError:
1951
+ try:
1952
+ f = open(readFile + '.gz')
1953
+ sled_df = pl.read_csv(f)
1954
+ f.close()
1955
+ except:
1956
+ sled_df = pl.DataFrame()
1957
+ except UnicodeEncodeError: # pragma: no cover
1958
+ try:
1959
+ f = open(readFile)
1960
+ sled_df = pl.read_csv(f)
1961
+ f.close()
1962
+ except IOError:
1963
+ try:
1964
+ f = open(readFile + '.gz')
1965
+ sled_df = pl.read_csv(f)
1966
+ f.close()
1967
+ except:
1968
+ sled_df = pl.DataFrame()
1969
+
1970
+
1971
+ self.readfilename = 'rowing dataframe'
1972
+
1973
+ if readFile:
1974
+ try:
1975
+ self.readfilename = readFile.name
1976
+ except AttributeError:
1977
+ self.readfilename = readFile
1978
+
1979
+ self.readFile = readFile
1980
+ self.rwr = rwr
1981
+ self.rowtype = rowtype
1982
+
1983
+ self.empty = False
1984
+ if sled_df.is_empty():
1985
+ self.empty = True
1986
+
1987
+ othernames = ['catch','finish','peakforceangle',
1988
+ 'wash','slip','index',
1989
+ 'cum_dist',
1990
+ 'hr_an','hr_at','hr_tr','hr_ut1','hr_ut2','hr_max',
1991
+ # 'lim_an','lim_at','lim_tr','lim_ut1','lim_ut2',
1992
+ # 'limpw_an','limpw_at','limpw_tr',
1993
+ # 'limpw_ut1','limpw_ut2',
1994
+ 'pw_an','pw_at','pw_max','pw_tr','pw_ut1','pw_ut2',
1995
+ # 'lim_max','hr_max',
1996
+ ' latitude',' longitude']
1997
+
1998
+ # check for missing column names
1999
+ mandatorynames = [
2000
+ 'TimeStamp (sec)',
2001
+ ' Horizontal (meters)',
2002
+ ' Cadence (stokes/min)',
2003
+ ' HRCur (bpm)',
2004
+ ' Stroke500mPace (sec/500m)',
2005
+ ' Power (watts)',
2006
+ ' DriveLength (meters)',
2007
+ ' StrokeDistance (meters)',
2008
+ ' DriveTime (ms)',
2009
+ ' DragFactor',
2010
+ ' StrokeRecoveryTime (ms)',
2011
+ ' AverageDriveForce (lbs)',
2012
+ ' AverageBoatSpeed (m/s)',
2013
+ ' PeakDriveForce (lbs)',
2014
+ ' AverageDriveForce (N)',
2015
+ ' PeakDriveForce (N)',
2016
+ ' lapIdx',
2017
+ ' ElapsedTime (sec)',
2018
+ ' Calories (kCal)',
2019
+ ' WorkoutState',
2020
+ ]
2021
+
2022
+
2023
+ self.defaultnames = othernames+mandatorynames
2024
+
2025
+ if readFile and not sled_df.is_empty():
2026
+ for name in self.defaultnames:
2027
+ if name in sled_df.columns:
2028
+ if sled_df[name].dtype == pl.String:
2029
+ if name != ' lapIdx':
2030
+ sled_df = sled_df.with_columns(
2031
+ (pl.col(name).str.strip_chars_start()).cast(pl.Float64).alias(name)
2032
+ )
2033
+
2034
+
2035
+ if ' ElapsedTime (sec)' not in sled_df.columns and not sled_df.is_empty():
2036
+ sled_df = sled_df.with_columns((pl.col("TimeStamp (sec)")-sled_df[0, "TimeStamp (sec)"]).alias(" ElapsedTime (sec)"))
2037
+
2038
+ if not sled_df.is_empty():
2039
+ for name in self.defaultnames:
2040
+ if name not in sled_df.columns:
2041
+ if debug:
2042
+ print(name + " is not found in data")
2043
+ sled_df = sled_df.with_columns((pl.lit(0)).alias(name))
2044
+ if name == "TimeStamp (sec)":
2045
+ sled_df = sled_df.rename({"TimeStamp (sec utc)" : name})
2046
+ if name == ' WorkoutState':
2047
+ sled_df = sled_df.with_columns((pl.lit(4)).alias(name))
2048
+ if name == ' Calories (kCal)':
2049
+ sled_df = sled_df.with_columns((pl.lit(1)).alias(name))
2050
+ if name == ' Stroke500mPace (sec/500m)': # pragma: no cover
2051
+ dd = sled_df[' Horizontal (meters)'].diff()
2052
+ dt = sled_df[' ElapsedTime (sec)'].diff()
2053
+ velo = dd / dt
2054
+ sled_df = sled_df.with_columns((500. / velo).alias(name))
2055
+ if name == ' AverageBoatSpeed (m/s)':
2056
+ try:
2057
+ velo = 500./sled_df[' Stroke500mPace (sec/500m)']
2058
+ except (KeyError,ValueError): # pragma: no cover
2059
+ dd = sled_df[' Horizontal (meters)'].diff()
2060
+ dt = sled_df[' ElapsedTime (sec)'].diff()
2061
+ velo = dd / dt
2062
+ sled_df = sled_df.with_columns((velo).alias(name))
2063
+ if name == ' AverageDriveForce (lbs)':
2064
+ try: # pragma: no cover
2065
+ forcen = sled_df[' AverageDriveForce (N)']
2066
+ sled_df = sled_df.with_columns((pl.col(" AverageDriveForce (lbs)") / lbstoN).alias(name))
2067
+ except (KeyError, TypeError):
2068
+ sled_df = sled_df.with_columns((pl.lit(0)).alias(name))
2069
+ if name == ' AverageDriveForce (N)':
2070
+ try:
2071
+ forcelbs = sled_df[' AverageDriveForce (lbs)']
2072
+ sled_df = sled_df.with_columns((pl.col(" AverageDriveForce (lbs)") * lbstoN).alias(name))
2073
+ except KeyError: # pragma: no cover
2074
+ sled_df = sled_df.with_columns((pl.lit(0)).alias(name))
2075
+ if name == ' PeakDriveForce (lbs)':
2076
+ try: # pragma: no cover
2077
+ forcen = sled_df[' PeakDriveForce (N)']
2078
+ sled_df = sled_df.with_columns((pl.col(forcen / lbstoN).alias(name)))
2079
+ except (KeyError, TypeError):
2080
+ sled_df = sled_df.with_columns((pl.lit(0)).alias(name))
2081
+ if name == ' PeakDriveForce (N)':
2082
+ try:
2083
+ forcelbs = sled_df[' PeakDriveForce (lbs)']
2084
+ sled_df = sled_df.with_columns((pl.col(" PeakDriveForce (lbs)") * lbstoN).alias(name))
2085
+ except KeyError: # pragma: no cover
2086
+ sled_df = sled_df.with_columns((pl.lit(0)).alias(name))
2087
+ if name == ' Cadence (stokes/min)':
2088
+ try:
2089
+ spm = sled_df[' Cadence (strokes/min)']
2090
+ if debug: # pragma: no cover
2091
+ print('Cadence found')
2092
+ sled_df = sled_df.with_columns((spm).alias(name))
2093
+ except KeyError: # pragma: no cover
2094
+ pass
2095
+
2096
+ sled_df = sled_df.drop([c for c in sled_df.columns if c not in self.defaultnames])
2097
+
2098
+ # add drive energy
2099
+ sled_df = sled_df.with_columns((pl.col(" Power (watts)")/pl.col(" Cadence (stokes/min)")).alias("driveenergy"))
2100
+
2101
+ self.duration = 0
2102
+
2103
+ if not sled_df.is_empty():
2104
+ sled_df = addzones_pl(
2105
+ sled_df,
2106
+ self.rwr.ut2,
2107
+ self.rwr.ut1,
2108
+ self.rwr.at,
2109
+ self.rwr.tr,
2110
+ self.rwr.an,
2111
+ self.rwr.max
2112
+ )
2113
+
2114
+ sled_df = sled_df.filter(pl.col(" WorkoutState") != 12)
2115
+ sled_df = sled_df.with_columns(pl.col(" Cadence (stokes/min)").cast(pl.Float64))
2116
+
2117
+ sled_df = addpowerzones_pl(sled_df, self.rwr.ftp, self.rwr.powerperc)
2118
+
2119
+ self.duration = sled_df['TimeStamp (sec)'].max()-sled_df['TimeStamp (sec)'].min()
2120
+
2121
+ self.df = sled_df
2122
+ self.number_of_rows = self.df.shape[0]
2123
+
2124
+
2125
+ def write_csv(self, writeFile, compressed=False):
2126
+ data = self.df.clone()
2127
+ data = data.drop([
2128
+ 'hr_ut2',
2129
+ 'hr_ut1',
2130
+ 'hr_at',
2131
+ 'hr_tr',
2132
+ 'hr_an',
2133
+ 'hr_max',
2134
+ 'pw_ut2',
2135
+ 'pw_ut1',
2136
+ 'pw_at',
2137
+ 'pw_tr',
2138
+ 'pw_an',
2139
+ 'pw_max',
2140
+ ])
2141
+
2142
+ if compressed:
2143
+ with gzip.open(writeFile + '.gz','wb') as f:
2144
+ return data.write_csv(f)
2145
+
2146
+ return data.write_csv(writeFile)
2147
+
2148
+
1871
2149
  class rowingdata:
1872
2150
  """ This is the main class. Read the data from the csv file and do all
1873
2151
  kinds
@@ -2097,11 +2375,6 @@ class rowingdata:
2097
2375
  hrmean = sled_df[' HRCur (bpm)'].mean()
2098
2376
  hrstd = sled_df[' HRCur (bpm)'].std()
2099
2377
 
2100
- if hrmean != 0 and hrstd != 0:
2101
- sled_df[' HRCur (bpm)'].replace(to_replace=0, value=np.nan,
2102
- inplace=True)
2103
- sled_df[' HRCur (bpm)'].ffill(inplace=True)
2104
-
2105
2378
  self.dragfactor = sled_df[' DragFactor'].mean()
2106
2379
  # do stroke count
2107
2380
  dt = sled_df['TimeStamp (sec)'].diff()
@@ -2173,7 +2446,8 @@ class rowingdata:
2173
2446
 
2174
2447
  # add HR zone data to dataframe
2175
2448
  if len(sled_df):
2176
- self.df = addzones(sled_df, self.rwr.ut2,
2449
+ self.df = addzones(sled_df,
2450
+ self.rwr.ut2,
2177
2451
  self.rwr.ut1,
2178
2452
  self.rwr.at,
2179
2453
  self.rwr.tr,
@@ -2199,7 +2473,7 @@ class rowingdata:
2199
2473
  else:
2200
2474
  self.duration = 0
2201
2475
 
2202
-
2476
+
2203
2477
  def __add__(self, other):
2204
2478
  self_df = self.df.copy()
2205
2479
  other_df = other.df.copy()
@@ -2278,20 +2552,6 @@ class rowingdata:
2278
2552
  self.df[' DragFactor'] = dragfactor
2279
2553
  self.dragfactor = dragfactor
2280
2554
 
2281
- def get_minutes_averages(self, columnname):
2282
- """ Returns a list of values, the mean for each minute of the session
2283
- """
2284
-
2285
- df = self.df.copy()
2286
- df['dt'] = df['TimeStamp (sec)'].apply(lambda x: arrow.get(x).datetime)
2287
- df.set_index('dt',inplace=True)
2288
-
2289
- try:
2290
- result = df[columnname].resample('T').mean().values
2291
- except KeyError:
2292
- return []
2293
-
2294
- return result
2295
2555
 
2296
2556
  def getvalues(self, keystring):
2297
2557
  """ Just a tool to get a column of the row data as a numpy array
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rowingdata
3
- Version: 3.6.6
3
+ Version: 3.6.7
4
4
  Summary: The rowingdata library to create colorful plots from CrewNerd, Painsled and other rowing data tools
5
5
  Home-page:
6
6
  Author: Sander Roosendaal
@@ -9,6 +9,25 @@ License: MIT
9
9
  Keywords: rowing ergometer concept2
10
10
  Classifier: Programming Language :: Python :: 3
11
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
12
31
 
13
32
  **************
14
33
  Rowingdata
@@ -1,8 +1,6 @@
1
1
  filename,type,nr_lines,year,month,day,hour,minute,second,dist,seconds,nrintervals,lap 1 time,lap 1 dist,timezone,lap 1 time new,lap 1 dist new,,,,
2
2
  quiske_per_stroke_new.csv,quiske,139,2022,11,7,7,58,35,930,382,1,382,930,UTC,382,928,,,,
3
3
  boatcoach_fixed_distance.csv,boatcoach,493,2022,6,13,12,31,37,1996,495,4,109,494,UTC,109,494,,,,
4
- smartrow_intervals.csv,smartrow,739,0,0,0,0,0,0,6979,2335,1,2335,6979,UTC,2335,6970,,,,
5
- smartrow.csv,smartrow,878,0,0,0,0,0,0,7836,3005,1,3005,7836,UTC,3005,7829,,,,
6
4
  rowpro_carrick.csv,rp,1212,2022,1,19,17,33,0,10023,3608,10,422,1495,UTC,422,1493,,,,
7
5
  fromnk.csv.gz,nklinklogbook,430,2021,7,7,17,33,28,3005,1062,12,60,250,UTC,60,250,,,,
8
6
  herodata.csv,hero,300,2021,4,26,13,37,33,3512,896,1,896,3512,UTC,896,3509,,,,
@@ -1280,7 +1280,7 @@
1280
1280
  </Trackpoint>
1281
1281
  </Track>
1282
1282
  </Lap>
1283
- <Notes>&lt;Element 'Notes' at 0x7f4989bccae0&gt;</Notes>
1283
+ <Notes>&lt;Element 'Notes' at 0x7f7e54795680&gt;</Notes>
1284
1284
  </Activity>
1285
1285
  </Activities>
1286
1286
  <Creator>
@@ -258,12 +258,6 @@ class TestStringParser:
258
258
  assert_equal(t6,d6)
259
259
  assert_equal(t7,d7)
260
260
 
261
- class TestMinutes:
262
- def test_minutes(self):
263
- row = rowingdata.rowingdata(csvfile='testdata/testdata.csv')
264
-
265
- res = row.get_minutes_averages(' Cadence (stokes/min)')
266
- assert_equal(len(res),9)
267
261
 
268
262
  class TestPhysics:
269
263
  row = rowingdata.rowingdata(csvfile='testdata/testdata.csv')
@@ -731,7 +725,7 @@ class TestSequence(unittest.TestCase):
731
725
  if filetype not in ['unknown','c2log']:
732
726
  assert_not_equal(res,0)
733
727
  if res != 0:
734
- for key,value in six.iteritems(res):
728
+ for key,value in res.items():
735
729
  if key not in ['summary']:
736
730
  if expected[key] != 0:
737
731
  assert_equal(value,expected[key])
File without changes
File without changes
File without changes
File without changes