]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor: cleanup statistics related namespace
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 3 Jul 2025 09:23:55 +0000 (11:23 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 3 Jul 2025 09:23:55 +0000 (11:23 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/performance/PerformanceStatistics.ts
src/types/Statistics.ts
src/types/orm/entities/PerformanceRecord.ts
src/utils/StatisticUtils.ts
src/utils/index.ts
tests/utils/StatisticUtils.test.ts

index b4d8d31b6bfe4aca2de2cec4208d864f2f2e3123..6d862f69a6338172833d7c0e14481bb779eb23b0 100644 (file)
@@ -21,6 +21,7 @@ import {
   type TimestampedData,
 } from '../types/index.js'
 import {
+  average,
   buildPerformanceStatisticsMessage,
   Configuration,
   Constants,
@@ -31,11 +32,10 @@ import {
   logger,
   logPrefix,
   max,
-  mean,
   median,
   min,
-  nthPercentile,
-  stdDeviation,
+  percentile,
+  std,
 } from '../utils/index.js'
 
 export class PerformanceStatistics {
@@ -252,15 +252,16 @@ export class PerformanceStatistics {
         .measurementTimeSeries as CircularBuffer<TimestampedData>
     )
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    this.statistics.statisticsData.get(entry.name)!.avgTimeMeasurement = mean(timeMeasurementValues)
+    this.statistics.statisticsData.get(entry.name)!.avgTimeMeasurement =
+      average(timeMeasurementValues)
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
     this.statistics.statisticsData.get(entry.name)!.medTimeMeasurement =
       median(timeMeasurementValues)
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
     this.statistics.statisticsData.get(entry.name)!.ninetyFiveThPercentileTimeMeasurement =
-      nthPercentile(timeMeasurementValues, 95)
+      percentile(timeMeasurementValues, 95)
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    this.statistics.statisticsData.get(entry.name)!.stdDevTimeMeasurement = stdDeviation(
+    this.statistics.statisticsData.get(entry.name)!.stdTimeMeasurement = std(
       timeMeasurementValues,
       // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
       this.statistics.statisticsData.get(entry.name)!.avgTimeMeasurement
index 83da1905a2104f6402ada3aafc6101f3781bc1e5..02927e0725dbd4a9ff4432059d2169df063d58a6 100644 (file)
@@ -23,7 +23,7 @@ export type StatisticsData = Partial<{
   ninetyFiveThPercentileTimeMeasurement: number
   requestCount: number
   responseCount: number
-  stdDevTimeMeasurement: number
+  stdTimeMeasurement: number
   timeMeasurementCount: number
   totalTimeMeasurement: number
 }>
index f0206ab01b6d68a60da7d023ea8e132367a94b73..8f9b9204c32eb0ada6afe4f9df74f36b9c2cca10 100644 (file)
@@ -15,7 +15,7 @@ interface StatisticsData {
   ninetyFiveThPercentileTimeMeasurement: number
   requestCount: number
   responseCount: number
-  stdDevTimeMeasurement: number
+  stdTimeMeasurement: number
   timeMeasurementCount: number
   totalTimeMeasurement: number
 }
index fc453236f4c82462624d4b604d723aeb52924440..2c65759a62926fae7cdef1a1a7fba680fbe4d620 100644 (file)
@@ -1,4 +1,4 @@
-export const mean = (dataSet: number[]): number => {
+export const average = (dataSet: number[]): number => {
   if (Array.isArray(dataSet) && dataSet.length === 0) {
     return 0
   }
@@ -28,7 +28,7 @@ export const max = (...args: number[]): number =>
   args.reduce((maximum, num) => (maximum > num ? maximum : num), Number.NEGATIVE_INFINITY)
 
 // TODO: use order statistics tree https://en.wikipedia.org/wiki/Order_statistic_tree
-export const nthPercentile = (dataSet: number[], percentile: number): number => {
+export const percentile = (dataSet: number[], percentile: number): number => {
   if (percentile < 0 && percentile > 100) {
     throw new RangeError('Percentile is not between 0 and 100')
   }
@@ -62,7 +62,7 @@ export const nthPercentile = (dataSet: number[], percentile: number): number =>
  * @see https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation
  * @internal
  */
-export const stdDeviation = (dataSet: number[], dataSetAverage: number = mean(dataSet)): number => {
+export const std = (dataSet: number[], dataSetAverage: number = average(dataSet)): number => {
   if (Array.isArray(dataSet) && (dataSet.length === 0 || dataSet.length === 1)) {
     return 0
   }
index cc970bedf17a7d18bf521e0ce0480a587b1486de..c9baaf34ed38677b795ddef67d3e25f91d8408fb 100644 (file)
@@ -25,7 +25,7 @@ export {
   buildStoppedMessage,
   buildUpdatedMessage,
 } from './MessageChannelUtils.js'
-export { max, mean, median, min, nthPercentile, stdDeviation } from './StatisticUtils.js'
+export { average, max, median, min, percentile, std } from './StatisticUtils.js'
 export {
   clone,
   convertToBoolean,
index 1ba3366f67be3e013b947d630802c07825b9a679..95419fb1ddc165b2bc0a337ba760244a1a182cfc 100644 (file)
@@ -1,21 +1,14 @@
 import { expect } from '@std/expect'
 import { describe, it } from 'node:test'
 
-import {
-  max,
-  mean,
-  median,
-  min,
-  nthPercentile,
-  stdDeviation,
-} from '../../src/utils/StatisticUtils.js'
+import { average, max, median, min, percentile, std } from '../../src/utils/StatisticUtils.js'
 
 await describe('StatisticUtils test suite', async () => {
-  await it('Verify mean()', () => {
-    expect(mean([])).toBe(0)
-    expect(mean([0.08])).toBe(0.08)
-    expect(mean([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(3.1642857142857146)
-    expect(mean([0.25, 4.75, 3.05, 6.04, 1.01, 2.02])).toBe(2.8533333333333335)
+  await it('Verify average()', () => {
+    expect(average([])).toBe(0)
+    expect(average([0.08])).toBe(0.08)
+    expect(average([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(3.1642857142857146)
+    expect(average([0.25, 4.75, 3.05, 6.04, 1.01, 2.02])).toBe(2.8533333333333335)
   })
 
   await it('Verify median()', () => {
@@ -41,20 +34,20 @@ await describe('StatisticUtils test suite', async () => {
     expect(max(-1, 0)).toBe(0)
   })
 
-  await it('Verify nthPercentile()', () => {
-    expect(nthPercentile([], 25)).toBe(0)
-    expect(nthPercentile([0.08], 50)).toBe(0.08)
+  await it('Verify percentile()', () => {
+    expect(percentile([], 25)).toBe(0)
+    expect(percentile([0.08], 50)).toBe(0.08)
     const array0 = [0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03]
-    expect(nthPercentile(array0, 0)).toBe(0.25)
-    expect(nthPercentile(array0, 50)).toBe(3.05)
-    expect(nthPercentile(array0, 80)).toBe(4.974)
-    expect(nthPercentile(array0, 85)).toBe(5.131)
-    expect(nthPercentile(array0, 90)).toBe(5.434)
-    expect(nthPercentile(array0, 95)).toBe(5.736999999999999)
-    expect(nthPercentile(array0, 100)).toBe(6.04)
+    expect(percentile(array0, 0)).toBe(0.25)
+    expect(percentile(array0, 50)).toBe(3.05)
+    expect(percentile(array0, 80)).toBe(4.974)
+    expect(percentile(array0, 85)).toBe(5.131)
+    expect(percentile(array0, 90)).toBe(5.434)
+    expect(percentile(array0, 95)).toBe(5.736999999999999)
+    expect(percentile(array0, 100)).toBe(6.04)
   })
 
-  await it('Verify stdDeviation()', () => {
-    expect(stdDeviation([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(2.1879050645374383)
+  await it('Verify std()', () => {
+    expect(std([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(2.1879050645374383)
   })
 })