计算数组

时间:2015-06-25 17:14:32

标签: php math

我有一个包含半小时时间段的数组;然后将该数组再细分为“今天”的6周后的日期,每个日期具有该日期在该半小时期间内完成的交易量。 e.g。

 [07:30:00] => Array
        (
            [2015-05-18] => 10
            [2015-05-25] => 17
            [2015-06-01] => 11
            [2015-06-08] => 20
            [2015-06-15] => 16
            [average] => 15
        )

    [08:00:00] => Array
        (
            [2015-05-18] => 12
            [2015-05-25] => 10
            [2015-06-01] => 14
            [2015-06-08] => 19
            [2015-06-15] => 18
            [average] => 15
        )

这将持续整个工作日。

我上面正在计算的平均值是所有这些值的简单平均值,计算如下:

foreach($average as $half_hour => $data) {
    $average[$half_hour]['average'] = round(array_sum($data)/count($data), 0, PHP_ROUND_HALF_UP);
}

我想要实现的是在更近的日期应用更多的权重,而对较旧的值应用较小的权重。我开始定义我遇到的一系列日期,并为该特定日期设置权重:

$date_weights = array(
                      date("Y-m-d", strtotime("6 weeks ago $day")) => 0.05,
                      date("Y-m-d", strtotime("5 weeks ago $day")) => 0.05,
                      date("Y-m-d", strtotime("4 weeks ago $day")) => 0.15,
                      date("Y-m-d", strtotime("3 weeks ago $day")) => 0.20,
                      date("Y-m-d", strtotime("2 weeks ago $day")) => 0.25,
                      date("Y-m-d", strtotime("1 weeks ago $day")) => 0.30
);

权重都加1,根据我对加权平均计算的理解,保持简单(r)。除此之外,这是我糟糕的数学大脑抛出异常并拒绝再玩的地方。

我尝试了以下代码,但似乎没有做我正在寻找的内容:

foreach($average as $half_hour => $data) {
    // apply the desired weighting to the values
    foreach($data as $date => $transactions) {
        $average[$half_hour][$date] = ($date_weights[$date]*$transactions);
    }
} 

foreach($average as $half_hour => $data) {
    $average[$half_hour]['average'] = round(array_sum($data)/count($data), 0, PHP_ROUND_HALF_UP);
}

认为我在这里走在正确的轨道上?但我显然错过了一步。任何一种稍微有点数学精神的人都可以指出我哪里出错了,以及如何最好地实现我想要解决的问题?谢谢!!

1 个答案:

答案 0 :(得分:0)

只需按count($data)删除除法即可

$average[$half_hour]['average'] = round(array_sum($data), 0, PHP_ROUND_HALF_UP);

或者选择平均值(而不是总和)为1的权重,并保留除法。

另外,如果你有6个体重,你需要有6个值 - 否则权重不会加1。现在您似乎有6个权重($date_weights但只有5个值($average[$half_hour],不计average)。

编辑:如果您不想担心权重加起来,可以使用:

$average[$half_hour]['average'] = round(array_sum($data)/array_sum($date_weights), 0, PHP_ROUND_HALF_UP);

但您仍需确保使用所有权重。