m26 - calculations for sports like running, cycling, and swimming
Project description
m26
m26 - calculations for sports like running, cycling, and swimming
Urls
Features
- Create Distances in either miles, kilometers, or yards.
- Translates Distances to the other units of measure.
- Specify ElapsedTime either in 'hh:mm:ss' strings, or int second values.
- Calculates Speed from a given Distance and ElapsedTime - per mile, per kilometer, and per yard.
- Calculates pace_per_mile and seconds_per_mile for a given Speed.
- Projects one Speed to another Distance with either a simple or algorithmic formula.
- RunWalkCalculator calculates pace and mph from given time intervals and paces.
- Calculates the Age of person, and age_graded times.
- Calculates five standard heart-rate training zones based on Age.
Quick start
Installation
$ pip install m26
Use
Sample Program
See sample-program.py in the GitHub repo.
import json
import m26
if __name__ == "__main__":
d1 = m26.Distance(26.2)
print(d1)
print("d1, as_miles: {0}".format(d1.as_miles()))
print("d1, as_kilometers: {0}".format(d1.as_kilometers()))
print("d1, as_yards: {0}".format(d1.as_yards()))
print("")
d2 = m26.Distance(50.0, m26.Constants.uom_kilometers())
print(d2)
print("")
d3 = m26.Distance(7040, m26.Constants.uom_yards())
print(d3)
print("")
d4 = m26.Distance(10.0, m26.Constants.uom_kilometers())
print(d4)
print("")
d4.add(d1)
print(d4)
print("")
d4.subtract(d3)
print(d4)
print("")
t1 = m26.ElapsedTime("3:47:30")
print(t1)
print("t1 hours: {0}".format(t1.hours()))
print("")
t2 = m26.ElapsedTime(3662)
print(t2)
print("t2 hours: {0}".format(t2.hours()))
print("")
s = m26.Speed(d1, t1)
print(s)
print("s, mph: {0}".format(s.mph()))
print("s, kph: {0}".format(s.kph()))
print("s, yph: {0}".format(s.yph()))
print("s, spm: {0}".format(s.seconds_per_mile()))
print("s, ppm: {0}".format(s.pace_per_mile()))
hhmmss_simple = s.projected_time(d2, "simple")
hhmmss_riegel = s.projected_time(d2, "riegel")
print("projected_time, simple: {0}".format(hhmmss_simple))
print("projected_time, riegel: {0}".format(hhmmss_riegel))
print("")
result = m26.RunWalkCalculator.calculate("2:30", "9:16", "0:45", "17:00", 31.0)
print(json.dumps(result, sort_keys=True, indent=2))
print("")
a = m26.AgeCalculator.calculate("1960-10-01", "2015-10-18")
print(a)
print("")
a2 = m26.Age(58.1)
graded = s.age_graded(a, a2)
print(graded)
zones = a2.training_zones()
print(json.dumps(zones, sort_keys=True, indent=2))
print("")
Sample Program Output
<Distance value:26.2 uom:m>
d1, as_miles: 26.2
d1, as_kilometers: 42.1648128
d1, as_yards: 46112.0
<Distance value:50.0 uom:k>
<Distance value:7040.0 uom:y>
<Distance value:10.0 uom:k>
<Distance value:52.1648128 uom:k>
<Distance value:45.7274368 uom:k>
<ElapsedTime hh:3.0 mm:47.0 ss:30.0 secs:13650.0>
t1 hours: 3.7916666666666665
<ElapsedTime hh:1 mm:1 ss:2.0 secs:3662.0>
t2 hours: 1.0172222222222222
<Speed dist:<Distance value:26.2 uom:m> etime:<ElapsedTime hh:3.0 mm:47.0 ss:30.0 secs:13650.0>>
s, mph: 6.90989010989011
s, kph: 11.120390189010989
s, yph: 12161.406593406595
s, spm: 520.9923664122138
s, ppm: 8:40.99
projected_time, simple: 04:29:46
projected_time, riegel: 04:32:32
{
"avg_mph": 5.4292343387471,
"avg_ppm": "11:03.07",
"miles": 31.0,
"proj_miles": 31.0,
"proj_time": "05:42:35",
"run_hhmmss": "2:30",
"run_ppm": "9:16",
"walk_hhmmss": "0:45",
"walk_ppm": "17:00"
}
<Age value:55.044490075290895>
<Speed dist:<Distance value:26.2 uom:m> etime:<ElapsedTime hh:3 mm:51 ss:47.61402391772026 secs:13907.61402391772>>
[
{
"age": 58.1,
"max": 161.9,
"pct_max": 0.95,
"pulse": 153.805,
"zone": 1
},
{
"age": 58.1,
"max": 161.9,
"pct_max": 0.9,
"pulse": 145.71,
"zone": 2
},
{
"age": 58.1,
"max": 161.9,
"pct_max": 0.85,
"pulse": 137.615,
"zone": 3
},
{
"age": 58.1,
"max": 161.9,
"pct_max": 0.8,
"pulse": 129.52,
"zone": 4
},
{
"age": 58.1,
"max": 161.9,
"pct_max": 0.75,
"pulse": 121.42500000000001,
"zone": 5
}
]
Changelog
Current version: 0.3.2
- 2024/09/24, version 0.3.2, python 3.11 support
- 2024/09/23, version 0.3.1, Class AgeCalculator modified to use datetime delta for mac/win consistency
- 2024/09/21, version 0.3.0, Removed arrow dependency, upgraded to python 3.12
- 2020/02/19, version 0.2.1, Jinja2 upgrade
- 2017/09/27, version 0.2.0, Converted to the pytest testing framework; coverage at 100%.
- 2015/10/31, version 0.1.0, Initial Production release.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
m26-0.3.2.tar.gz
(9.4 kB
view details)
Built Distribution
m26-0.3.2-py3-none-any.whl
(8.9 kB
view details)
File details
Details for the file m26-0.3.2.tar.gz
.
File metadata
- Download URL: m26-0.3.2.tar.gz
- Upload date:
- Size: 9.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1c5bb2b88bfd05b4a2b12c74a0fe632aefa89e9064c32f6d86d53e1f31d45575 |
|
MD5 | 0e3eba9fd38e81fb1daefda886938314 |
|
BLAKE2b-256 | a27053240b69ca9a1ab3821b7971e137c0c2008b375de20106459dd2f4211df3 |
File details
Details for the file m26-0.3.2-py3-none-any.whl
.
File metadata
- Download URL: m26-0.3.2-py3-none-any.whl
- Upload date:
- Size: 8.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 58dc8231862b3d141dcd8d343c2f26d7441103c2aca67605a5a0ddf7c9ed84c1 |
|
MD5 | 81756ab0cdc830e4a688b16a39e49d43 |
|
BLAKE2b-256 | 920c273faf699d33afae6cfd80ddcce741ea5ddf0fc892a10a6931d3a3ebf6fc |