┌─offset─┬─── RecvHour ─┬─ IpAddr ─┬─── AVG(column) ┬────exponentailMovingAverageEMA(5, column) ─┬
│ 0 │ 2023-03-02 23:00:00 │ 172.30.56.214 │ [137.6612992781788] │ │
│ 1 │ 2023-03-02 22:00:00 │ 172.30.56.214 │ [127.08613804905876] │ │
│ 2 │ 2023-03-02 21:00:00 │ 172.30.56.214 │ [170.75601821730643] │ │
│ 3 │ 2023-03-02 20:00:00 │ 172.30.56.214 │ [145.4665304036791] │ │
│ 4 │ 2023-03-02 19:00:00 │ 172.30.56.214 │ [157.1682892906815] │ │
│ 5 │ 2023-03-02 18:00:00 │ 172.30.56.214 │ [133.7664298401421] │ │
│ 6 │ 2023-03-02 17:00:00 │ 172.30.56.214 │ [116.70383451059536] │ │
│ 7 │ 2023-03-02 16:00:00 │ 172.30.56.214 │ [141.6947754353804] │ │
│ 8 │ 2023-03-02 15:00:00 │ 172.30.56.214 │ [161.09584450402144] │ │
│ 9 │ 2023-03-02 14:00:00 │ 172.30.56.214 │ [122.21212121212122] │ │
│ 10 │ 2023-03-02 13:00:00 │ 172.30.56.214 │ [124.50695825049702] │ │
│ 11 │ 2023-03-02 12:00:00 │ 172.30.56.214 │ [129.23307086614173] │ │
│ 12 │ 2023-03-02 11:00:00 │ 172.30.56.214 │ [128.10786739238] │ │
│ 13 │ 2023-03-02 10:00:00 │ 172.30.56.214 │ [112.29431721798134] │ │
│ 14 │ 2023-03-02 09:00:00 │ 172.30.56.214 │ [129.2812363952982] │ │
└────────┴─────────────────────┴───────────────┴────────────────────────┴──────────────────────────────────────────────┴
我正在尝试使用接受半衰期衰减、列和时间戳的 Clickhouse 内置函数来计算 EMA。我有一个返回上述数据集的 SQL 查询。谁能解释一下 clickhouse 中的 EMA 功能是如何工作的?我试过像 exponentialMovingAverage(half-life decay)(
AVG(column)
, RecvHour)) OVER (PARTITION BY IpAddr ORDER BY RecvHour ASC Rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS EMA(column).
使用公式 t1/2 = (ln 2) / λ 计算的半衰期衰减 其中 t1/2 是半衰期,ln 2 是 2 的自然对数(约 0.693),λ 是衰减常数。衰变常数是物质发生衰变的特性,与单位时间内衰变的概率有关。 λ 为 2/(N+1),其中 N 是请求 EMA 的窗口大小。
请不要在这里检查语法。我刚刚举了一个例子。我试图了解它在 clickhouse 中的工作原理。我们如何划分数据集以获得 EMA?
非常感谢任何帮助。
intDiv(toUInt32(time),3600))
-- 需要将DateTime调整为时间单位(/ 3600
),否则就是3599个零+1个非零。
CREATE TABLE slava_ukraini
ENGINE = Memory AS
SELECT
10 AS value,
toDateTime('2020-01-01') + (3600 * number) AS time
FROM numbers_mt(10);
SELECT
value,
time,
exponentialMovingAverage(1)(value, intDiv(toUInt32(time),3600)) OVER (ORDER BY time ASC) res
FROM slava_ukraini
ORDER BY time;
┌─value─┬────────────────time─┬─────────res─┐
│ 10 │ 2020-01-01 00:00:00 │ 5 │
│ 10 │ 2020-01-01 01:00:00 │ 7.5 │
│ 10 │ 2020-01-01 02:00:00 │ 8.75 │
│ 10 │ 2020-01-01 03:00:00 │ 9.375 │
│ 10 │ 2020-01-01 04:00:00 │ 9.6875 │
│ 10 │ 2020-01-01 05:00:00 │ 9.84375 │
│ 10 │ 2020-01-01 06:00:00 │ 9.921875 │
│ 10 │ 2020-01-01 07:00:00 │ 9.9609375 │
│ 10 │ 2020-01-01 08:00:00 │ 9.98046875 │
│ 10 │ 2020-01-01 09:00:00 │ 9.990234375 │
└───────┴─────────────────────┴─────────────┘
intDiv(toUInt32(time),3600))
-- 需要将DateTime调整为时间单位(/ 3600
)