106 lines
2.5 KiB
Swift
106 lines
2.5 KiB
Swift
import Foundation
|
|
|
|
struct Prediction: Codable, Identifiable {
|
|
let id: UUID
|
|
let date: Date
|
|
let predictedValue: Decimal
|
|
let algorithm: PredictionAlgorithm
|
|
let confidenceInterval: ConfidenceInterval
|
|
|
|
init(
|
|
id: UUID = UUID(),
|
|
date: Date,
|
|
predictedValue: Decimal,
|
|
algorithm: PredictionAlgorithm,
|
|
confidenceInterval: ConfidenceInterval
|
|
) {
|
|
self.id = id
|
|
self.date = date
|
|
self.predictedValue = predictedValue
|
|
self.algorithm = algorithm
|
|
self.confidenceInterval = confidenceInterval
|
|
}
|
|
|
|
struct ConfidenceInterval: Codable {
|
|
let lower: Decimal
|
|
let upper: Decimal
|
|
|
|
var range: Decimal {
|
|
upper - lower
|
|
}
|
|
|
|
var percentageWidth: Decimal {
|
|
guard upper != 0 else { return 0 }
|
|
return (range / upper) * 100
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Prediction Algorithm Codable
|
|
|
|
extension PredictionAlgorithm: Codable {}
|
|
|
|
// MARK: - Prediction Helpers
|
|
|
|
extension Prediction {
|
|
var formattedValue: String {
|
|
CurrencyFormatter.format(predictedValue, style: .currency, maximumFractionDigits: 0)
|
|
}
|
|
|
|
var formattedDate: String {
|
|
let formatter = DateFormatter()
|
|
formatter.dateFormat = "MMM yyyy"
|
|
return formatter.string(from: date)
|
|
}
|
|
|
|
var formattedConfidenceRange: String {
|
|
let lower = CurrencyFormatter.format(
|
|
confidenceInterval.lower,
|
|
style: .currency,
|
|
maximumFractionDigits: 0
|
|
)
|
|
let upper = CurrencyFormatter.format(
|
|
confidenceInterval.upper,
|
|
style: .currency,
|
|
maximumFractionDigits: 0
|
|
)
|
|
|
|
return "\(lower) - \(upper)"
|
|
}
|
|
}
|
|
|
|
// MARK: - Prediction Result
|
|
|
|
struct PredictionResult {
|
|
let predictions: [Prediction]
|
|
let algorithm: PredictionAlgorithm
|
|
let accuracy: Double // R-squared or similar metric
|
|
let volatility: Double
|
|
|
|
var isHighConfidence: Bool {
|
|
accuracy >= 0.7
|
|
}
|
|
|
|
var confidenceLevel: ConfidenceLevel {
|
|
switch accuracy {
|
|
case 0.8...: return .high
|
|
case 0.5..<0.8: return .medium
|
|
default: return .low
|
|
}
|
|
}
|
|
|
|
enum ConfidenceLevel: String {
|
|
case high = "High"
|
|
case medium = "Medium"
|
|
case low = "Low"
|
|
|
|
var color: String {
|
|
switch self {
|
|
case .high: return "#10B981"
|
|
case .medium: return "#F59E0B"
|
|
case .low: return "#EF4444"
|
|
}
|
|
}
|
|
}
|
|
}
|