square1/laravel-collection-rolling-average

扩展集合以支持滚动平均功能。

2.0.0 2024-03-21 08:46 UTC

This package is auto-updated.

Last update: 2024-09-25 19:10:04 UTC


README

Build and Test

将滚动平均功能添加到集合中

此包向Laravel的Collection外观添加了滚动平均功能。滚动平均(也称为移动平均)是一种统计方法,用于捕捉数据范围随时间变化的平均值。例如,查看每日温度图或股市走势图,图可能看起来非常嘈杂和波动。可以通过用前N天的平均值替换每个每日数据点来平滑图表,以显示更长期的趋势。

Rolling Average graph

以下是一个示例,其中我们想要过去5天的滚动平均

这是集合中所有值的滚动平均。虽然在这个例子中我们想要最新的5个值的滚动平均,但在有少于5个条目时,平均将是可用条目的平均值。

可以强制此函数更加严格,只有在获得我们想要的最小条目数(在这种情况下为5)时才开始计算平均值。这意味着结果数据会有所变化

安装

通过Composer

$ composer require square1/laravel-collection-rolling-average

包将被自动注册。

用法

滚动平均

这将显示到目前日期为止的平均值。每个返回值应是在集合中该点的所有值的平均值。这意味着早期值在平均值真正开始之前会保留一些“嘈杂性”。

    $data = new Collection([1, 2, 3, 4, 5]);

    $averages = $data->rollingAverage();
    /**
     *   1,      // 1
     *   1.5,    // 1+2 / 2 (only 2 entries seen so far)
     *   2,      // 1+2+3 / 3
     *   2.5,    // 1+2+3+4 / 4
     *   3       // 1+2+3+4+5 / 5
     */

带有限制的滚动平均

根据每个数据点的N个之前的条目计算滚动平均。返回的集合将与提供的集合大小相同。这意味着在集合中的N个值之前的位置,滚动平均是到目前日期为止看到的所有值的平均值。如果您想排除所有N个条目之前的价值,请参阅带有限制的回溯滚动平均部分。

    $data = new Collection([1, 2, 3, 4, 5, 6]);
    // How many entries should we consider in our average?
    $lookback = 2;
    $averages = $data->rollingAverage($lookback);
    /**
     * Looking back over last 2 entries, averages should be:
     *   1,      // 1
     *   1.5,    // 1+2 / 2
     *   2.5,    // 2+3 / 2
     *   3.5,    // 3+4 / 2
     *   4.5,    // 4+5 / 2
     *   5.5     // 5+6 / 2
     */

带有限制的回溯滚动平均

默认情况下,包将返回一个与提供给它的值数量相同的集合。这可能导致集合开头的一些嘈杂性。例如,如果我们有一个包含30个条目的数据集,并想要过去5个值的滚动平均,则前4个值将是前N个值的平均值,其中N < 5。为了避免这种情况,可以将参数$includeAll设置为false。这将返回一个比原始值少的集合。这将消除集合开头的一些嘈杂性,但将导致返回值数量的不匹配。

    $data = new Collection([1, 2, 3, 4, 5, 6]);
    $averages = $data->rollingAverage(4, $enforceLimitedLookback = true);

    /**
     * 2.5,
     * 3.5,
     * 4.5
     */

应用权重

添加权重以增加或减少最新条目的相关性。

    $data = new Collection([1, 2, 2, 4, 5, 6]);
    // Weights will be applied in the order of current data point N, then N-1, and so on.
    // Where no weighting exists, a default of 1 is used.
    $weights = new Collection([5, 2]);

    $averages = $data->rollingAverage(4, $enforceLimitedLookback = false, $weights);

    /**
      * collect([
      *   5,      // 1 * 5
      *   6,      // (2 * 5) + (1 * 2) / 2
      *   5,      // (2 * 5) + (2 * 2) + 1 / 3
      *   6.75,   // (4 * 5) + (2 * 2) + 2 + 1 / 4
      *   9.25,   // (5 * 5) + (4 * 2) + 2 + 2 / 4
      *   11.5,   // (6 * 5) + (5 * 2) + 4 + 2 / 4
      * ]);
      */

测试

$ composer test

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件