我有一个包含半小时时间段的数组;然后将该数组再细分为“今天”的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);
}
我认为我在这里走在正确的轨道上?但我显然错过了一步。任何一种稍微有点数学精神的人都可以指出我哪里出错了,以及如何最好地实现我想要解决的问题?谢谢!!
答案 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);
但您仍需确保使用所有权重。