| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // LoopFollow
- // Stats.swift
- import Foundation
- class StatsData {
- var countLow: Int
- var percentLow: Float
- var percentRange: Float
- var percentHigh: Float
- var countRange: Int
- var countHigh: Int
- var totalGlucose: Int
- var avgBG: Float
- var a1C: Float
- var stdDev: Float
- var coefficientOfVariation: Float
- var bgDataCount: Int
- var pie: [DataStructs.pieData]
- init(bgData: [ShareGlucoseData]) {
- countLow = 0
- countRange = 0
- countHigh = 0
- totalGlucose = 0
- a1C = 0.0
- coefficientOfVariation = 0.0
- let thresholds = UnitSettingsStore.shared.effectiveThresholds()
- let lowThreshold = thresholds.low
- let highThreshold = thresholds.high
- for i in 0 ..< bgData.count {
- // Set low/range/high counts for pie chart and %'s
- if Double(bgData[i].sgv) < lowThreshold {
- countLow += 1
- } else if Double(bgData[i].sgv) > highThreshold {
- countHigh += 1
- } else {
- countRange += 1
- }
- // set total bg for average
- totalGlucose += bgData[i].sgv
- }
- // Set Percents
- percentLow = Float(countLow) / Float(bgData.count) * 100
- percentRange = Float(countRange) / Float(bgData.count) * 100
- percentHigh = Float(countHigh) / Float(bgData.count) * 100
- pie = [
- DataStructs.pieData(name: "low", value: Double(percentLow)),
- DataStructs.pieData(name: "range", value: Double(percentRange)),
- DataStructs.pieData(name: "high", value: Double(percentHigh)),
- ]
- // Set Average
- bgDataCount = bgData.count
- if bgDataCount < 1 { bgDataCount = 1 }
- avgBG = Float(totalGlucose / bgDataCount)
- // compute std dev (sigma)
- var partialSum: Float = 0
- for i in 0 ..< bgData.count {
- partialSum += (Float(bgData[i].sgv) - avgBG) * (Float(bgData[i].sgv) - avgBG)
- }
- let stdDevMgdL = sqrt(partialSum / Float(bgData.count))
- if avgBG > 0 {
- coefficientOfVariation = (stdDevMgdL / avgBG) * 100.0
- }
- stdDev = Float(UnitSettingsStore.shared.convertMgdlToDisplay(Double(stdDevMgdL)))
- let avgBGDisplay = UnitSettingsStore.shared.convertMgdlToDisplay(Double(avgBG))
- let metricValue: Double?
- if UnitSettingsStore.shared.glycemicMetricMode == .gmi {
- metricValue = GlycemicMetricCalculator.calculateGMI(avgGlucoseInDisplayUnits: avgBGDisplay)
- } else {
- metricValue = GlycemicMetricCalculator.calculateEhba1c(avgGlucoseInDisplayUnits: avgBGDisplay)
- }
- a1C = Float(metricValue ?? 0.0)
- }
- }
|