Swift 生成包含其他数组的加权平均值的数组

Swift 生成包含其他数组的加权平均值的数组,swift,math,Swift,Math,我正在创建一个加密货币价格跟踪应用程序,它有一个图表来说明过去7天投资组合的价值。因此,我需要一种在图表上生成数据点的方法 对于投资组合中的每种加密货币,我都有一个NSDecimalNumber值数组,这些值表示过去一周中每小时加密货币的价格。为了创建数据点,我需要一种方法来计算每小时价格的总体加权平均值。通过加权,我的意思是总体平均数组应该表示当前持有的每种加密货币的数量 例如,如果我有以下数组: Cryptocurrency 1 (25% of the overall portfolio v

我正在创建一个加密货币价格跟踪应用程序,它有一个图表来说明过去7天投资组合的价值。因此,我需要一种在图表上生成数据点的方法

对于投资组合中的每种加密货币,我都有一个
NSDecimalNumber
值数组,这些值表示过去一周中每小时加密货币的价格。为了创建数据点,我需要一种方法来计算每小时价格的总体加权平均值。通过加权,我的意思是总体平均数组应该表示当前持有的每种加密货币的数量

例如,如果我有以下数组:

Cryptocurrency 1 (25% of the overall portfolio value) - [1.2, 8.3, 7.2] 
Cryptocurrency 2 (25% of the overall portfolio value) - [3.4, 9.2, 6.3]
Cryptocurrency 3 (50% of the overall portfolio value) - [6.3, 1.1, 5.9]
结果应该是:

[4.3, 4.92, 6.33]
根据计算结果:

((1.2 * 0.75) + (3.4 * 0.75) + (6.3 * 1.5)) / 3 = 4.3
((8.3 * 0.75) + (9.2 * 0.75) + (1.1 * 1.5)) / 3 = 4.92
((7.2 * 0.75) + (6.3 * 0.75) + (5.9 * 1.5)) / 3 = 6.33
我确信一定有一种干净的方法可以用
map
reduce
实现这一点,但是我还没有想到任何潜在的解决方案。即使是基于循环的答案,我也会很感激,因为我可以在以后简化它。

您可以尝试以下代码:

    let weight = [0.25, 0.25, 0.5]// Weights of your crypto, matrix 1*N
    let crypto1 = [1.2, 8.3, 7.2]
    let crypto2 = [3.4, 9.2, 6.3]
    let crypto3 = [6.3, 1.1, 5.9]
    let crypto = [crypto1, crypto2, crypto3]// Matrix M*N

    var result: [Double] = []
    for i in 0..<weight.count {
        let aux = crypto.map { $0[i] }
        let sum = zip(aux, weight).map { $0 * $1 }.reduce(0,+)
        result.append(sum)
    }
    print("test: \(result)")  // print "test: [4.3, 4.925, 6.325]"
let weight=[0.25,0.25,0.5]//加密的权重,矩阵1*N
设crypto1=[1.2,8.3,7.2]
设crypto2=[3.4,9.2,6.3]
设crypto3=[6.3,1.1,5.9]
设crypto=[crypto1,crypto2,crypto3]//矩阵M*N
变量结果:[Double]=[]

对于0中的i.如果有人好奇,根据qtngo的答案,这就是我得出的结论:

    let holdings = cryptocurrencies.flatMap { cryptocurrency -> (cryptocurrency: Cryptocurrency, assetHolding: AssetHolding)? in
        guard let assetHolding = portfolio.assetHolding(forCryptocurrency: cryptocurrency) else {
            return nil
        }
        return (cryptocurrency, assetHolding)
    }
    let sparklineLength = holdings.map { $0.cryptocurrency.marketOverview.sparkline.count }.min() ?? 0
    let weights = holdings.flatMap { holding -> NSDecimalNumber in
        let quantity = NSDecimalNumber(value: holding.assetHolding.quantity)
        let value = holding.cryptocurrency.marketOverview.valuation.value
        let totalHoldingValue = value.multiplying(by: quantity)
        let totalPortfolioValue = portfolio.totalValue(withCryptocurrencies: cryptocurrencies)
        let percentage = totalHoldingValue.dividing(by: totalPortfolioValue)
        return percentage
    }

    var averageSparkline = [NSDecimalNumber]()
    for index in 0..<sparklineLength {
        let indexSparklineValues = holdings.flatMap { holding -> NSDecimalNumber? in
            return holding.cryptocurrency.marketOverview.sparkline[index]
        }
        let averageSparklineValue = zip(indexSparklineValues, weights).map { $0.multiplying(by: $1) }.reduce(0, +)
        averageSparkline.append(averageSparklineValue)
    }
let holdings=cryptocurrences.flatMap{cryptocurrency->(cryptocurrency:cryptocurrency,assetHolding:assetHolding)?位于
guard let assetHolding=portfolio.assetHolding(对于加密货币:加密货币)else{
归零
}
返回(加密货币、资产托管)
}
让SparkInLength=holdings.map{$0.cryptocurrency.marketOverview.Sparkine.count}.min()??0
让weights=holdings.flatMap{holding->NSDecimalNumber输入
let quantity=NSDecimalNumber(值:holding.assetHolding.quantity)
let value=holding.cryptocurrency.marketOverview.valuation.value
让totalHoldingValue=值。乘以(乘以:数量)
让totalPortfolioValue=portfolio.totalValue(使用加密货币:加密货币)
让百分比=totalHoldingValue.除以(totalPortfolioValue)
回报率
}
var averageSparkline=[NSDecimalNumber]()
对于0中的索引。。小数点?在里面
返回持有。加密货币。市场概述。迷你们[指数]
}
让averageSparklineValue=zip(indexParkLineValue,weights).map{$0.乘以(乘以:$1)}.reduce(0,+)
averageSparkline.append(averageSparklineValue)
}

它需要一些整理,可能可以简化,但它会产生我想要的结果。

如何获得显示的结果?我不明白你是怎么计算的,投资组合的总价值是多少?这是一个数字吗?好吧,假设一个投资组合总价值1000美元。在这个例子中,我给出了加密货币1和加密货币2各为250美元,加密货币3为500美元(基于当前持有的金额)。因此,第一次平均值的计算结果为((1.2*0.75)+(3.4*0.75)+(6.3*1.5))/3。我用值2和3的示例更新了我的问题。看起来像矩阵乘法谢谢!这似乎达到了我想要的结果。我发布了我的具体(WIP)实现,作为一个单独的答案,以防有人好奇。