4  4 Glättung & Rauschreduktion

5 4 Glättung & Rauschreduktion

Glättung ist eine der wichtigsten Standardmethoden in der Zeitreihenanalyse. Sie hilft dabei,

  • Rauschen zu reduzieren,
  • Trend/Saison besser sichtbar zu machen,
  • eine Baseline zu definieren (z. B. für Anomalien).
Merke

Die Fensterbreite ist eine methodische Entscheidung: Sie sollte zur Zeitskala der Fragestellung passen.

5.1 4.1 Beispielsignal

Wir nutzen eine Zeitreihe mit Tagesmuster, Rauschen und einzelnen Ausreißern.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

rng = np.random.default_rng(42)

t = pd.date_range("2025-01-01", periods=24*10, freq="H")  # 10 Tage stündlich
trend = np.linspace(0, 2, len(t))
season = 0.9 * np.sin(2*np.pi*(t.hour)/24)
noise = 0.35 * rng.normal(size=len(t))

s = pd.Series(10 + trend + season + noise, index=t, name="signal")

# Ausreißer
s.iloc[30] += 3.0
s.iloc[120] -= 2.5

s.plot(title="Beispielsignal (roh)")
plt.show()
/var/folders/p_/ks3trxjx0jd839_g4g0vm4nc0000gn/T/ipykernel_19328/3372949856.py:7: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  t = pd.date_range("2025-01-01", periods=24*10, freq="H")  # 10 Tage stündlich

5.2 4.2 Rolling Mean (gleitender Mittelwert)

Rolling Mean ist die klassische Glättung: Mittelwert über ein Fenster.

roll_6h = s.rolling("6H").mean()
roll_24h = s.rolling("24H").mean()

ax = s.plot(alpha=0.45, label="Signal")
roll_6h.plot(ax=ax, label="Rolling 6H")
roll_24h.plot(ax=ax, label="Rolling 24H")
plt.legend()
plt.title("Rolling Mean (Pandas)")
plt.show()
/var/folders/p_/ks3trxjx0jd839_g4g0vm4nc0000gn/T/ipykernel_19328/1470441625.py:1: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  roll_6h = s.rolling("6H").mean()
/var/folders/p_/ks3trxjx0jd839_g4g0vm4nc0000gn/T/ipykernel_19328/1470441625.py:2: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  roll_24h = s.rolling("24H").mean()

Entscheidungshilfe
  • 6H: reduziert kurzfristiges Rauschen, Ereignisse bleiben sichtbar
  • 24H: zeigt eher Grundniveau/Trend, dämpft Tagesmuster stark

NumPy-Variante: Moving Average als Faltung (convolve).

import numpy as np
import matplotlib.pyplot as plt

y = s.to_numpy()

def moving_average(y, window):
    kernel = np.ones(window) / window
    return np.convolve(y, kernel, mode="same")

ma_6 = moving_average(y, 6)
ma_24 = moving_average(y, 24)

plt.plot(y, alpha=0.45, label="Signal")
plt.plot(ma_6, label="MA 6 Samples")
plt.plot(ma_24, label="MA 24 Samples")
plt.legend()
plt.title("Moving Average (NumPy)")
plt.xlabel("Sample")
plt.ylabel("Wert")
plt.show()

Achtung

Bei der Faltung müssen Sie Randbehandlung bewusst akzeptieren (hier: mode="same"). Pandas behandelt Randbereiche konsistent mit min_periods und NaNs.

5.3 4.3 EWMA (Exponentially Weighted Moving Average)

EWMA glättet, gewichtet aber neuere Werte stärker.

ewm_fast = s.ewm(span=6, adjust=False).mean()
ewm_slow = s.ewm(span=24, adjust=False).mean()

ax = s.plot(alpha=0.45, label="Signal")
ewm_fast.plot(ax=ax, label="EWMA span=6")
ewm_slow.plot(ax=ax, label="EWMA span=24")
plt.legend()
plt.title("EWMA (Pandas)")
plt.show()

Merke

EWMA reagiert schneller auf Änderungen als Rolling Mean, weil ältere Werte exponentiell weniger Einfluss haben.

EWMA kann rekursiv berechnet werden:

[ m_t = y_t + (1-)m_{t-1} ]

import numpy as np
import matplotlib.pyplot as plt

y = s.to_numpy()

def ewma(y, alpha):
    m = np.empty_like(y, dtype=float)
    m[0] = y[0]
    for i in range(1, len(y)):
        m[i] = alpha * y[i] + (1 - alpha) * m[i-1]
    return m

m_fast = ewma(y, alpha=0.30)
m_slow = ewma(y, alpha=0.08)

plt.plot(y, alpha=0.45, label="Signal")
plt.plot(m_fast, label="EWMA alpha=0.30")
plt.plot(m_slow, label="EWMA alpha=0.08")
plt.legend()
plt.title("EWMA (NumPy)")
plt.xlabel("Sample")
plt.ylabel("Wert")
plt.show()

5.4 4.4 Methodische Wahl: welches Verfahren wann?

Entscheidungshilfe

Rolling Mean eignet sich gut, wenn…
- Sie ein klar definiertes Zeitfenster mitteln wollen (z. B. „letzte 24h“).

EWMA eignet sich gut, wenn…
- Sie eine smoothe Baseline wollen, die schneller auf Änderungen reagiert.
- Sie Anomalien als Abweichung von einer dynamischen Baseline erkennen möchten.

5.5 4.5 Mini-Aufgaben

  1. Fensterwahl: Testen Sie Rolling-Fenster von 3H, 12H, 48H.
    • Welche Strukturen werden jeweils sichtbar bzw. verschwinden?
  2. Anomalien & Glättung: Erhöhen Sie die Ausreißer-Amplitude.
    • Ab welcher Glättungsstärke „verschwindet“ der Ausreißer im geglätteten Signal?
  3. EWMA-Empfindlichkeit: Variieren Sie span (Pandas) bzw. alpha (NumPy).
    • Welche Parameter reagieren „schnell“, welche „träge“? Begründen Sie.