Skip to content

ウィンドウ関数(23関数)

全行スキャン型のウィンドウ関数。各行に対して1つの値を返す。GROUP BY は使用せず、ウィンドウフレーム内で計算を行う。

関数リファレンス に戻る


ローリング統計量

注意: 本カテゴリの関数はすべてウィンドウ関数(全行スキャン型)として実装されている。各行に対して1つの値を返す。GROUP BY は使用しない。

stat_rolling_mean

ローリング平均(移動平均)を計算する。指定したウィンドウサイズの直近 n 件の平均値を各行に返す。

構文: stat_rolling_mean(column, window_size)

パラメータ 説明
window_size ウィンドウサイズ(整数)

ウィンドウ未満の先頭行は NULL を返す。

-- 3日間のローリング平均
SELECT date, price,
       stat_rolling_mean(price, 3) AS rolling_avg
FROM stock_prices;

-- 7日間移動平均で平滑化
SELECT timestamp, value,
       stat_rolling_mean(value, 7) AS smoothed
FROM sensor_data;

stat_rolling_std

ローリング標準偏差を計算する。

構文: stat_rolling_std(column, window_size)

SELECT date, price,
       stat_rolling_std(price, 5) AS rolling_volatility
FROM stock_prices;

stat_rolling_min

ローリング最小値を計算する。

構文: stat_rolling_min(column, window_size)

SELECT date, price,
       stat_rolling_min(price, 20) AS min_20d
FROM stock_prices;

stat_rolling_max

ローリング最大値を計算する。

構文: stat_rolling_max(column, window_size)

SELECT date, price,
       stat_rolling_max(price, 20) AS max_20d
FROM stock_prices;

stat_rolling_sum

ローリング合計を計算する。

構文: stat_rolling_sum(column, window_size)

-- 7日間の累計売上
SELECT date, sales,
       stat_rolling_sum(sales, 7) AS weekly_total
FROM daily_sales;

移動平均

stat_moving_avg

単純移動平均 (SMA) を計算する。stat_rolling_mean と同等。

構文: stat_moving_avg(column, window_size)

SELECT date, close_price,
       stat_moving_avg(close_price, 20) AS sma_20
FROM stocks;

stat_ema

指数移動平均 (EMA) を計算する。最近のデータにより大きな重みを置く移動平均。

$$\text{EMA}t = \alpha \cdot x_t + (1-\alpha) \cdot \text{EMA}{t-1}, \quad \alpha = \frac{2}{\text{span}+1}$$

構文: stat_ema(column, span)

パラメータ 説明
span スパン(整数)。pandas の ewm(span=N) と同じ慣例
-- 12日間 EMA(α = 2/13 ≈ 0.154)
SELECT date, close_price,
       stat_ema(close_price, 12) AS ema_12
FROM stocks;

-- SMA と EMA の比較
SELECT date, close_price,
       stat_moving_avg(close_price, 20) AS sma_20,
       stat_ema(close_price, 20) AS ema_20
FROM stocks;

ランク

stat_rank

順位変換を行う。各行の値に対してその順位を返す。同順位は平均順位。NULL 行は NULL を返す。

構文: stat_rank(column)

-- 成績の順位付け
SELECT name, score,
       stat_rank(score) AS rank
FROM students;

欠損値補完

stat_fillna_mean

NULL 値を非 NULL 値の平均で補完する。

構文: stat_fillna_mean(column)

SELECT id, value,
       stat_fillna_mean(value) AS filled
FROM measurements;

stat_fillna_median

NULL 値を非 NULL 値の中央値で補完する。

構文: stat_fillna_median(column)

SELECT id, value,
       stat_fillna_median(value) AS filled
FROM measurements;

stat_fillna_ffill

NULL 値を直前の非 NULL 値で補完する(前方補完)。先頭が NULL の場合は NULL のまま。

構文: stat_fillna_ffill(column)

-- 時系列データの前方補完
SELECT timestamp, sensor_value,
       stat_fillna_ffill(sensor_value) AS filled
FROM sensor_data;

stat_fillna_bfill

NULL 値を直後の非 NULL 値で補完する(後方補完)。末尾が NULL の場合は NULL のまま。

構文: stat_fillna_bfill(column)

SELECT timestamp, sensor_value,
       stat_fillna_bfill(sensor_value) AS filled
FROM sensor_data;

stat_fillna_interp

NULL 値を線形補間で補完する。前後の非 NULL 値の間を線形に内挿する。

構文: stat_fillna_interp(column)

-- 時系列の欠損値を線形補間
SELECT timestamp, temperature,
       stat_fillna_interp(temperature) AS interpolated
FROM hourly_data;

エンコーディング・ビニング

stat_label_encode

値をラベルエンコーディングする。ユニーク値をソートし、0 から順に整数を割り当てる。

構文: stat_label_encode(column)

-- カテゴリ値を数値化
SELECT id, color,
       stat_label_encode(color) AS encoded
FROM products;
-- color=blue → 0, green → 1, red → 2(ソート順)

stat_bin_width

等幅ビニングを行う。値域を等幅の n 個のビンに分割し、各値が属するビン番号(0〜n-1)を返す。

構文: stat_bin_width(column, n_bins)

パラメータ 説明
n_bins ビン数(整数)
-- 年齢を5つのビンに分類
SELECT name, age,
       stat_bin_width(age, 5) AS age_group
FROM customers;

stat_bin_freq

等頻度ビニング(分位点ビニング)を行う。各ビンに同程度の件数が入るように n 個のビンに分割する。

構文: stat_bin_freq(column, n_bins)

パラメータ 説明
n_bins ビン数(整数)
-- 4分位に基づくビニング
SELECT name, income,
       stat_bin_freq(income, 4) AS income_quartile
FROM households;

時系列変換

stat_lag

ラグ(遅延)を適用する。k 行前の値を返す。先頭 k 行は NULL。

構文: stat_lag(column, k)

パラメータ 説明
k ラグ数(整数、正の値)
-- 1期前の値を取得
SELECT date, price,
       stat_lag(price, 1) AS prev_price,
       price - stat_lag(price, 1) AS price_change
FROM stock_prices;

stat_diff

差分を計算する。order 次の差分を適用する。先頭 order 行は NULL。

構文: stat_diff(column, order)

パラメータ 説明
order 差分の次数(整数)
-- 1次差分(前日比)
SELECT date, price,
       stat_diff(price, 1) AS daily_change
FROM stock_prices;

-- 2次差分(加速度)
SELECT date, value,
       stat_diff(value, 2) AS acceleration
FROM time_series;

stat_seasonal_diff

季節差分を計算する。period 期前の値との差を返す。先頭 period 行は NULL。

構文: stat_seasonal_diff(column, period)

パラメータ 説明
period 季節周期(整数)
-- 前年同月比(月次データ、周期12)
SELECT month, sales,
       stat_seasonal_diff(sales, 12) AS yoy_change
FROM monthly_sales;

-- 前週同曜日比(日次データ、周期7)
SELECT date, visitors,
       stat_seasonal_diff(visitors, 7) AS wow_change
FROM daily_traffic;

外れ値検出

stat_outliers_iqr

IQR 法で外れ値を検出する。Q1 - 1.5IQR 未満または Q3 + 1.5IQR 超の値を外れ値(1.0)、それ以外を正常値(0.0)として返す。NULL 行は NULL。

構文: stat_outliers_iqr(column)

-- 外れ値フラグの付与
SELECT id, value,
       stat_outliers_iqr(value) AS is_outlier
FROM measurements;

-- 外れ値を除外した平均
SELECT stat_mean(value) AS mean_without_outliers
FROM (
    SELECT value
    FROM measurements
    WHERE stat_outliers_iqr(value) = 0.0
);

stat_outliers_zscore

Z スコア法で外れ値を検出する。|z| > 3 の値を外れ値(1.0)として返す。

構文: stat_outliers_zscore(column)

SELECT id, value,
       stat_outliers_zscore(value) AS is_outlier
FROM measurements;

stat_outliers_mzscore

修正 Z スコア法で外れ値を検出する。中央値と MAD を使用するロバストな方法。|修正Zスコア| > 3.5 の値を外れ値(1.0)として返す。

構文: stat_outliers_mzscore(column)

-- ロバストな外れ値検出
SELECT id, value,
       stat_outliers_mzscore(value) AS is_outlier
FROM measurements;

-- 3手法の比較
SELECT id, value,
       stat_outliers_iqr(value) AS iqr,
       stat_outliers_zscore(value) AS zscore,
       stat_outliers_mzscore(value) AS mzscore
FROM measurements;

ロバスト処理

stat_winsorize

ウィンザライズ(裾刈り)を行う。指定パーセンタイルで上下の極値をクリップする。

構文: stat_winsorize(column, percentile)

パラメータ 説明
percentile クリップするパーセンタイル(整数、例: 5 → 5%ile と 95%ile でクリップ)
-- 5パーセンタイルでウィンザライズ
SELECT id, value,
       stat_winsorize(value, 5) AS winsorized
FROM measurements;

-- ウィンザライズ後の統計量
SELECT stat_mean(w) AS winsorized_mean
FROM (
    SELECT stat_winsorize(value, 10) AS w FROM measurements
);