Stats.swift 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 pie: [DataStructs.pieData]
  21. init(bgData: [ShareGlucoseData]) {
  22. self.countLow = 0
  23. self.countRange = 0
  24. self.countHigh = 0
  25. self.totalGlucose = 0
  26. self.a1C = 0.0
  27. for i in 0..<bgData.count {
  28. // Set low/range/high counts for pie chart and %'s
  29. if Float(bgData[i].sgv) <= UserDefaultsRepository.lowLine.value {
  30. self.countLow += 1
  31. } else if Float(bgData[i].sgv) >= UserDefaultsRepository.highLine.value {
  32. self.countHigh += 1
  33. } else {
  34. self.countRange += 1
  35. }
  36. // set total bg for average
  37. totalGlucose += bgData[i].sgv
  38. }
  39. // Set Percents
  40. percentLow = Float(countLow) / Float(bgData.count) * 100
  41. percentRange = Float(countRange) / Float(bgData.count) * 100
  42. percentHigh = Float(countHigh) / Float(bgData.count) * 100
  43. pie = [
  44. DataStructs.pieData(name: "low", value: Double(percentLow)),
  45. DataStructs.pieData(name: "range", value: Double(percentRange)),
  46. DataStructs.pieData(name: "high", value: Double(percentHigh))
  47. ]
  48. // Set Average
  49. avgBG = Float(totalGlucose / bgData.count)
  50. // compute std dev (sigma)
  51. var partialSum: Float = 0;
  52. for i in 0..<bgData.count {
  53. partialSum += (Float(bgData[i].sgv) - avgBG) * ( Float(bgData[i].sgv) - avgBG)
  54. }
  55. stdDev = sqrt(partialSum / Float(bgData.count))
  56. if UserDefaultsRepository.units.value != "mg/dL" {
  57. stdDev = Float( bgUnits.toDisplayUnits( String( stdDev ) ) ) ?? 0.0;
  58. }
  59. if UserDefaultsRepository.useIFCC.value {
  60. a1C = (((46.7 + Float(avgBG)) / 28.7) - 2.152) / 0.09148
  61. } else {
  62. a1C = (46.7 + Float(avgBG)) / 28.7
  63. }
  64. }
  65. }