public double CalculateVectorNormalizedAverage(WorkoutSampleVector vector) { if (!vector.HasData) return 0; if (vector.NumberOfSamples < 30) return CalculateVectorAverage(vector); var movingAverageBuffer = new SimpleMovingAverage(30); double movingAverage = 0; var movingAverageSamples = 1; movingAverageBuffer.Add(vector.Vector[0].dataPoint); for (var i = 1; i < vector.NumberOfSamples; i++) { if (vector.Vector[i].dataPoint < 0)continue; var timeDiff = vector.Vector[i].timeOffsetSeconds - vector.Vector[i - 1].timeOffsetSeconds; for (var j = 0; j < timeDiff; j++) //Cannot multiply value across time in the sample as we need a 30s moving avg. { movingAverageBuffer.Add(vector.Vector[i].dataPoint); if (movingAverageBuffer.NumberOfSamples >= 30) { movingAverage += Math.Pow(Math.Round(movingAverageBuffer.Average()), 4); movingAverageSamples++; } } } var average = movingAverage/movingAverageSamples; average = Math.Round(Math.Pow(average, 0.25)); return average; }
public WorkoutSamples(int numberOfSamples) { CadenceVector = new WorkoutSampleVector(numberOfSamples, WorkoutSampleDataType.Cadence); HeartRateVector = new WorkoutSampleVector(numberOfSamples, WorkoutSampleDataType.HeartRate); PowerVector = new WorkoutSampleVector(numberOfSamples, WorkoutSampleDataType.Power); SpeedVector = new WorkoutSampleVector(numberOfSamples, WorkoutSampleDataType.Speed); }
public void CalculateNonZero_Average_With_No_Data_Returns_Zero() { var samples = new WorkoutSamples(0); var vector = new WorkoutSampleVector(3, WorkoutSampleDataType.Power); IAthlete athlete = new Athlete(); var workoutCalculator = new WorkoutSamplesCalculator(samples, athlete); var average = workoutCalculator.CalculateNonZeroVectorAverage(vector); Assert.Equal(0, average); }
public void CalculatCadenceClassificatoion_Under_2_Samples_returns_() { var samples = new WorkoutSamples(0); var vector = new WorkoutSampleVector(1, WorkoutSampleDataType.Cadence); vector.AddPoint(1, 2); samples.CadenceVector = vector; IAthlete athlete = new Athlete(); var workoutCalculator = new WorkoutSamplesCalculator(samples, athlete); var classification = workoutCalculator.ClassifyWorkoutCadenceRanges(); Assert.IsType<List<ICadenceRange>>(classification); }
public void CalculateNormalizedPower_With_Under_30_Samples_Returns_Average() { //Initialise(); var samples = new WorkoutSamples(0); var vector = new WorkoutSampleVector(2, WorkoutSampleDataType.Power); vector.AddPoint(1, 2); vector.AddPoint(2, 4); IAthlete athlete = new Athlete(); var workoutCalculator = new WorkoutSamplesCalculator(samples, athlete); var average = workoutCalculator.CalculateVectorNormalizedAverage(vector); Assert.Equal(3, average); }
public void CalculateNonZero_Average_Returns_Average() { var samples = new WorkoutSamples(0); var vector = new WorkoutSampleVector(3, WorkoutSampleDataType.Power); vector.AddPoint(1, 2); vector.AddPoint(2, 4); vector.AddPoint(3, 0); IAthlete athlete = new Athlete(); var workoutCalculator = new WorkoutSamplesCalculator(samples,athlete); var average = workoutCalculator.CalculateNonZeroVectorAverage(vector); Assert.Equal(3, average); }
internal double CalculateVectorAverage(WorkoutSampleVector vector) { if (!vector.HasData) return 0; var weightedCumulative = vector.Vector[0].dataPoint; for (var i = 1; i < vector.NumberOfSamples; i++) { if (vector.Vector[i].dataPoint <= 0) continue; var timeDiff = vector.Vector[i].timeOffsetSeconds - vector.Vector[i - 1].timeOffsetSeconds; weightedCumulative = weightedCumulative + timeDiff*vector.Vector[i].dataPoint; } var divisor = vector.Vector[vector.NumberOfSamples - 1].timeOffsetSeconds; var average = weightedCumulative/divisor; return Math.Round(average); }
internal IEnumerable<IRange> ClassifyWorkoutCadenceType( IEnumerable<IRange> ranges, WorkoutSampleVector vector, double referenceValue) { if (vector.NumberOfSamples < 2) return ranges; var rangeList = ranges as IList<IRange> ?? ranges.ToList(); ClassifyCadenceDataPoint(vector.Vector[0].dataPoint, rangeList, referenceValue); for (var i = 1; i < vector.NumberOfSamples; i++) { if (!(vector.Vector[i].dataPoint >= 0)) continue; var timeDiff = vector.Vector[i].timeOffsetSeconds - vector.Vector[i - 1].timeOffsetSeconds; for (var j = 0; j < timeDiff; j++) { ClassifyCadenceDataPoint(vector.Vector[i].dataPoint, rangeList, referenceValue); } } var totalSamples = rangeList.Sum(range => range.QuanityOfSamples); foreach (var range in rangeList) { var percent = range.QuanityOfSamples/(double) totalSamples*100; range.PercentOfTotal = Math.Round(percent); } return rangeList; }