Javascript 中给定相同时间值的不同长度的平均时间序列数组

问题描述 投票:0回答:1

我想使用 Javascript 以有效的方式对多个不同长度的时间序列数组进行平均。

  • 长度不同的原因是某些数组中缺少某些数据。
  • 时间应该用作所有数组中的公共变量来求平均值,即对给定时间戳的可用值进行平均。

例如:

array1 = [[1, 100], [2, 200], [3, 300], [4, 400]];
array2 = [[1, 150], [3, 350], [4, 450]];
array3 = [[1, 250], [2, 350], [4, 450]];

allArrays = [array1, array2, array3];

// This is the result I would like to get, i.e. average of same timestamp 1, 2 .... n
average = [[1, 166.7], [2, 275], [3, 325], [4, 433]];

每对是

[time, value]

我的想法是使用 Lodash 首先将这些对转换为对象,然后对所有相等的时间戳进行分组并对值进行平均。然后转换回数组。

// Convert arrays to objects
for (int i = 0; allArrays.length; i++){
var array = allArrays[i];
allArrays[i] = toObject(array, ['time', 'value']);
}

// Group based on similar timestamp and average
???

// Convert averaged object to array
???

// Functions
function toObject(array, names){
  var obj = _.chain(array).map(function(p) {
    return _.zipObject(names, p)
}).value()

我不是一名 Javascript 程序员,如果您对此有任何帮助,我将不胜感激。

javascript arrays object time-series lodash
1个回答
0
投票

您的方法走在正确的轨道上。您可以使用Lodash高效地达到想要的结果。以下是如何完成代码来计算时间序列数组的平均值:

const _ = require('lodash');

const array1 = [[1, 100], [2, 200], [3, 300], [4, 400]];
const array2 = [[1, 150], [3, 350], [4, 450]];
const array3 = [[1, 250], [2, 350], [4, 450]];

const allArrays = [array1, array2, array3];

// Convert arrays to objects
for (let i = 0; i < allArrays.length; i++) {
  const array = allArrays[i];
  allArrays[i] = _.fromPairs(array);
}

// Merge objects and calculate averages
const mergedObject = _.mergeWith({}, ...allArrays, (value1, value2) => {
  if (_.isNumber(value1) && _.isNumber(value2)) {
    return (value1 + value2) / allArrays.length;
  }
});

// Convert merged object to array
const average = _.toPairs(mergedObject);

console.log(average);

此代码将输出所需的平均数组:

[ [ '1', 166.66666666666666 ],
  [ '2', 275 ],
  [ '3', 325 ],
  [ '4', 433.3333333333333 ] ]

请注意,我们使用“.mergeWith”函数来合并对象数组并计算匹配时间戳的平均值。 “.fromPairs”函数将数组转换为对象,“_.toPairs”函数将合并的对象转换回数组。

此外,如果尚未安装 Lodash 库,请运行“npm install lodash”以确保安装了 Lodash 库。

© www.soinside.com 2019 - 2024. All rights reserved.