Stats.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. //
  2. // Stats.swift
  3. // LoopFollow
  4. //
  5. // Created by Jon Fawcett on 6/23/20.
  6. // Copyright © 2020 Jon Fawcett. All rights reserved.
  7. //
  8. import Foundation
  9. class StatsData {
  10. var countLow: Int
  11. var percentLow: Float
  12. var percentRange: Float
  13. var percentHigh: Float
  14. var countRange: Int
  15. var countHigh: Int
  16. var totalGlucose: Int
  17. var avgBG: Float
  18. var a1C: Float
  19. var stdDev: Float
  20. var bgDataCount: Int
  21. var pie: [DataStructs.pieData]
  22. init(bgData: [ShareGlucoseData]) {
  23. self.countLow = 0
  24. self.countRange = 0
  25. self.countHigh = 0
  26. self.totalGlucose = 0
  27. self.a1C = 0.0
  28. for i in 0..<bgData.count {
  29. // Set low/range/high counts for pie chart and %'s
  30. if Float(bgData[i].sgv) <= UserDefaultsRepository.lowLine.value {
  31. self.countLow += 1
  32. } else if Float(bgData[i].sgv) >= UserDefaultsRepository.highLine.value {
  33. self.countHigh += 1
  34. } else {
  35. self.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. stdDev = sqrt(partialSum / Float(bgData.count))
  59. if UserDefaultsRepository.units.value != "mg/dL" {
  60. stdDev = stdDev * Float(GlucoseConversion.mgDlToMmolL)
  61. }
  62. if UserDefaultsRepository.useIFCC.value {
  63. a1C = (((46.7 + Float(avgBG)) / 28.7) - 2.152) / 0.09148
  64. } else {
  65. a1C = (46.7 + Float(avgBG)) / 28.7
  66. }
  67. }
  68. }