如何使用 ClickHouse 内置函数 exponentialMovingAverage 计算指数移动平均线?

问题描述 投票:0回答:1
┌─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?

非常感谢任何帮助。

sql database clickhouse weighted-average
1个回答
0
投票

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
)

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