Stats.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // LoopFollow
  2. // Stats.swift
  3. import Foundation
  4. class StatsData {
  5. var countLow: Int
  6. var percentLow: Float
  7. var percentRange: Float
  8. var percentHigh: Float
  9. var countRange: Int
  10. var countHigh: Int
  11. var totalGlucose: Int
  12. var avgBG: Float
  13. var a1C: Float
  14. var stdDev: Float
  15. var coefficientOfVariation: Float
  16. var bgDataCount: Int
  17. var pie: [DataStructs.pieData]
  18. init(bgData: [ShareGlucoseData]) {
  19. countLow = 0
  20. countRange = 0
  21. countHigh = 0
  22. totalGlucose = 0
  23. a1C = 0.0
  24. coefficientOfVariation = 0.0
  25. let thresholds = UnitSettingsStore.shared.effectiveThresholds()
  26. let lowThreshold = thresholds.low
  27. let highThreshold = thresholds.high
  28. for i in 0 ..< bgData.count {
  29. // Set low/range/high counts for pie chart and %'s
  30. if Double(bgData[i].sgv) < lowThreshold {
  31. countLow += 1
  32. } else if Double(bgData[i].sgv) > highThreshold {
  33. countHigh += 1
  34. } else {
  35. countRange += 1
  36. }
  37. // set total bg for average
  38. totalGlucose += bgData[i].sgv
  39. }
  40. // Set Percents
  41. percentLow = Float(countLow) / Float(bgData.count) * 100
  42. percentRange = Float(countRange) / Float(bgData.count) * 100
  43. percentHigh = Float(countHigh) / Float(bgData.count) * 100
  44. pie = [
  45. DataStructs.pieData(name: "low", value: Double(percentLow)),
  46. DataStructs.pieData(name: "range", value: Double(percentRange)),
  47. DataStructs.pieData(name: "high", value: Double(percentHigh)),
  48. ]
  49. // Set Average
  50. bgDataCount = bgData.count
  51. if bgDataCount < 1 { bgDataCount = 1 }
  52. avgBG = Float(totalGlucose / bgDataCount)
  53. // compute std dev (sigma)
  54. var partialSum: Float = 0
  55. for i in 0 ..< bgData.count {
  56. partialSum += (Float(bgData[i].sgv) - avgBG) * (Float(bgData[i].sgv) - avgBG)
  57. }
  58. let stdDevMgdL = sqrt(partialSum / Float(bgData.count))
  59. if avgBG > 0 {
  60. coefficientOfVariation = (stdDevMgdL / avgBG) * 100.0
  61. }
  62. stdDev = Float(UnitSettingsStore.shared.convertMgdlToDisplay(Double(stdDevMgdL)))
  63. let avgBGDisplay = UnitSettingsStore.shared.convertMgdlToDisplay(Double(avgBG))
  64. let metricValue: Double?
  65. if UnitSettingsStore.shared.glycemicMetricMode == .gmi {
  66. metricValue = GlycemicMetricCalculator.calculateGMI(avgGlucoseInDisplayUnits: avgBGDisplay)
  67. } else {
  68. metricValue = GlycemicMetricCalculator.calculateEhba1c(avgGlucoseInDisplayUnits: avgBGDisplay)
  69. }
  70. a1C = Float(metricValue ?? 0.0)
  71. }
  72. }