Stats.swift 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // LoopFollow
  2. // Stats.swift
  3. // Created by Jon Fawcett on 2020-06-23.
  4. import Foundation
  5. class StatsData {
  6. var countLow: Int
  7. var percentLow: Float
  8. var percentRange: Float
  9. var percentHigh: Float
  10. var countRange: Int
  11. var countHigh: Int
  12. var totalGlucose: Int
  13. var avgBG: Float
  14. var a1C: Float
  15. var stdDev: 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. for i in 0 ..< bgData.count {
  25. // Set low/range/high counts for pie chart and %'s
  26. if Double(bgData[i].sgv) <= Storage.shared.lowLine.value {
  27. countLow += 1
  28. } else if Double(bgData[i].sgv) >= Storage.shared.highLine.value {
  29. countHigh += 1
  30. } else {
  31. countRange += 1
  32. }
  33. // set total bg for average
  34. totalGlucose += bgData[i].sgv
  35. }
  36. // Set Percents
  37. percentLow = Float(countLow) / Float(bgData.count) * 100
  38. percentRange = Float(countRange) / Float(bgData.count) * 100
  39. percentHigh = Float(countHigh) / Float(bgData.count) * 100
  40. pie = [
  41. DataStructs.pieData(name: "low", value: Double(percentLow)),
  42. DataStructs.pieData(name: "range", value: Double(percentRange)),
  43. DataStructs.pieData(name: "high", value: Double(percentHigh)),
  44. ]
  45. // Set Average
  46. bgDataCount = bgData.count
  47. if bgDataCount < 1 { bgDataCount = 1 }
  48. avgBG = Float(totalGlucose / bgDataCount)
  49. // compute std dev (sigma)
  50. var partialSum: Float = 0
  51. for i in 0 ..< bgData.count {
  52. partialSum += (Float(bgData[i].sgv) - avgBG) * (Float(bgData[i].sgv) - avgBG)
  53. }
  54. stdDev = sqrt(partialSum / Float(bgData.count))
  55. if UserDefaultsRepository.units.value != "mg/dL" {
  56. stdDev = stdDev * Float(GlucoseConversion.mgDlToMmolL)
  57. }
  58. if Storage.shared.useIFCC.value {
  59. a1C = (((46.7 + Float(avgBG)) / 28.7) - 2.152) / 0.09148
  60. } else {
  61. a1C = (46.7 + Float(avgBG)) / 28.7
  62. }
  63. }
  64. }