fix
This commit is contained in:
30
backend/app/services/power_curve.py
Normal file
30
backend/app/services/power_curve.py
Normal file
@@ -0,0 +1,30 @@
|
||||
import numpy as np
|
||||
|
||||
from backend.app.models.activity import DataPoint
|
||||
|
||||
# Standard durations for the power duration curve
|
||||
DURATIONS = [1, 5, 10, 15, 30, 60, 120, 300, 600, 1200, 1800, 3600]
|
||||
|
||||
|
||||
def calculate_power_curve(data_points: list[DataPoint]) -> dict[int, int]:
|
||||
"""
|
||||
Calculate max average power for standard durations.
|
||||
Returns {duration_seconds: max_avg_power}.
|
||||
"""
|
||||
powers = np.array([dp.power for dp in data_points if dp.power is not None], dtype=float)
|
||||
if len(powers) == 0:
|
||||
return {}
|
||||
|
||||
result = {}
|
||||
for dur in DURATIONS:
|
||||
if dur > len(powers):
|
||||
break
|
||||
if dur == 1:
|
||||
result[dur] = int(np.max(powers))
|
||||
else:
|
||||
# Rolling mean via cumsum for efficiency
|
||||
cumsum = np.cumsum(np.insert(powers, 0, 0))
|
||||
rolling_avg = (cumsum[dur:] - cumsum[:-dur]) / dur
|
||||
result[dur] = int(np.max(rolling_avg))
|
||||
|
||||
return result
|
||||
Reference in New Issue
Block a user