0Pricing
AI Agents · Ders

Aracılarda Zaman Serisi Verisi İşleme

Akış hâlindeki sensör verilerinde kayan pencereler, toplulaştırma ve anomali algılama.

Aracılarda Zaman Serisi Verisi İşleme, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.

IoT Ajanlarında Zaman Serileri

Sensör verileri bir zaman serisi olarak gelir: (zaman damgası, değer) çiftlerinden oluşan bir dizi. Ham sensör okumalarında gürültü, boşluklar ve ara sıra oluşan sıçramalar bulunur. İşlenmemiş ham verilerle çalışan ajanlar çoğu zaman yanlış uyarılar verir veya gerçek olayları kaçırır.

Zaman serisi işleme, ham sinyalleri eyleme dönüştürülebilir içgörülere çevirir.

Kayan Pencere Tamponu Oluşturma

Kayan pencere bellekte yalnızca son N okumayı tutar. Pencere dolduğunda, en yeni okuma geldiğinde en eski okuma çıkarılır. Bu, ajanlardaki tüm zaman serisi analizlerinin temelidir.

from collections import deque
from datetime import datetime

class SensorBuffer:
    def __init__(self, window_size: int = 60):
        self.window_size = window_size
        self._data = deque(maxlen=window_size)

    def add(self, value: float, timestamp: datetime = None):
        ts = timestamp or datetime.utcnow()
        self._data.append({'ts': ts, 'value': value})

    def values(self) -> list:
        return [d['value'] for d in self._data]

    def timestamps(self) -> list:
        return [d['ts'] for d in self._data]

    def is_full(self) -> bool:
        return len(self._data) == self.window_size

buf = SensorBuffer(window_size=60)
buf.add(22.5)
buf.add(22.8)
buf.add(23.1)
print(f'Buffer: {len(buf._data)} readings, values: {buf.values()}')

Hareketli Ortalama

Basit hareketli ortalama (SMA), son N değerin ortalamasını alarak gürültüyü yumuşatır. Tek tek sensör hatalarının etkisini azaltır ve temel eğilimi ortaya çıkarır. Bunu anomali algılama için temel değer olarak kullanın.

import statistics

def simple_moving_average(values: list, window: int = 10) -> list:
    if len(values) < window:
        return []
    return [
        statistics.mean(values[i - window:i])
        for i in range(window, len(values) + 1)
    ]

def exponential_moving_average(values: list, alpha: float = 0.2) -> list:
    """EMA weights recent values more heavily."""
    if not values:
        return []
    ema = [values[0]]
    for v in values[1:]:
        ema.append(alpha * v + (1 - alpha) * ema[-1])
    return ema

readings = [22.1, 22.3, 22.0, 35.0, 22.2, 22.4, 22.1, 22.3, 22.5, 22.2, 22.4]
sma = simple_moving_average(readings, window=5)
ema = exponential_moving_average(readings, alpha=0.2)
print(f'SMA (last 3): {[round(v,2) for v in sma[-3:]]}')
print(f'EMA (last 3): {[round(v,2) for v in ema[-3:]]}')

Sıçrama Algılama

Sıçrama, son eğilimden N standart sapmadan daha fazla sapan bir okumadır (z-skoru yöntemi). Bu, sensör verileri için en yaygın anomali algılama yaklaşımıdır.

import statistics

def detect_spikes(
    values: list,
    window: int = 20,
    z_threshold: float = 3.0
) -> list:
    """Returns list of (index, value, z_score) for detected spikes."""
    if len(values) < window:
        return []

    spikes = []
    for i in range(window, len(values)):
        window_vals = values[i - window:i]
        mean = statistics.mean(window_vals)
        stdev = statistics.stdev(window_vals)
        if stdev == 0:
            continue
        z_score = abs(values[i] - mean) / stdev
        if z_score > z_threshold:
            spikes.append({
                'index': i,
                'value': values[i],
                'z_score': round(z_score, 2),
                'mean': round(mean, 2)
            })
    return spikes

data = [22.1, 22.3, 22.0, 22.2, 22.4] * 5 + [55.0] + [22.2, 22.3] * 3
spikes = detect_spikes(data, window=10, z_threshold=3.0)
print('Spikes detected:', spikes)

Zaman Serisi Analizi için Pandas

Daha gelişmiş analizler için sensör verilerini DatetimeIndex içeren bir pandas DataFrame'e yükleyin. Pandas, elle yazılan döngülere kıyasla çok daha hızlı yazılabilen yerleşik kayan pencere, yeniden örnekleme ve aradeğerleme işlemleri sağlar.

import pandas as pd
from datetime import datetime, timedelta

# Create a sample time series DataFrame
base_time = datetime(2024, 1, 1, 12, 0, 0)
times = [base_time + timedelta(seconds=i*10) for i in range(20)]
values = [22.1, 22.3, None, 22.0, 22.4, 22.2, 35.0, 22.1,
          22.3, 22.2, 22.5, 22.1, None, 22.4, 22.2, 22.3,
          22.0, 22.1, 22.4, 22.2]

df = pd.DataFrame({'value': values}, index=pd.DatetimeIndex(times))
df.index.name = 'timestamp'

print('Shape:', df.shape)
print('Missing values:', df['value'].isna().sum())
print(df.head())

Eksik Zaman Damgalarını Ele Alma

Sensör ağlarında bağlantı sorunları nedeniyle okumalar sık sık kaçırılır. Pandas boşlukları algılayıp doldurabilir: resample düzenli bir ızgara oluşturur, interpolate eksik değerleri doğrusal olarak veya ileri doldurma yöntemiyle doldurur. Atanan değerlerin sayısını her zaman günlüğe kaydedin.

import pandas as pd

def fill_missing_readings(df: pd.DataFrame, freq: str = '10S') -> pd.DataFrame:
    """
    df: DataFrame with DatetimeIndex and 'value' column
    freq: expected sampling frequency ('10S' = 10 seconds, '1T' = 1 minute)
    """
    original_count = df['value'].notna().sum()

    # Resample to regular grid (introduces NaN for missing periods)
    df_regular = df.resample(freq).mean()

    missing_count = df_regular['value'].isna().sum()
    print(f'Missing readings before fill: {missing_count}')

    # Forward fill then linear interpolate
    df_regular['value'] = df_regular['value'].interpolate(
        method='linear', limit=5  # don't fill gaps longer than 5 periods
    )

    filled_count = df_regular['value'].notna().sum()
    print(f'Filled {filled_count - original_count} missing values')
    return df_regular

Yeniden Örnekleme: 1 Dakikadan 5 Dakikalık Toplulaştırmaya

Yeniden örnekleme, yüksek frekanslı veriyi daha kaba bir çözünürlüğe indirger. Bu işlem gürültüyü ve depolama gereksinimlerini azaltır. Her 5 dakikalık pencere için minimum, maksimum, mean ve standart sapmayı hesaplamak üzere resample('5T').agg() kullanın.

import pandas as pd

def resample_to_5min(df: pd.DataFrame) -> pd.DataFrame:
    return df.resample('5min').agg({
        'value': ['mean', 'min', 'max', 'std', 'count']
    }).round(3)

# Example with 1-minute data:
times = pd.date_range('2024-01-01 12:00', periods=30, freq='1min')
import random
random.seed(42)
vals = [22.0 + random.gauss(0, 0.5) for _ in range(30)]
df_1min = pd.DataFrame({'value': vals}, index=times)

df_5min = resample_to_5min(df_1min)
print(df_5min)

Doğrusal Regresyonla Eğilim Algılama

Sıcaklık düzenli olarak mı yükseliyor, yoksa yalnızca gürültülü mü? Kayan pencere üzerinde doğrusal regresyon uygulayın. Pozitif eğim, yükselen bir eğilime işaret eder; eşik aşılmadan önce eğimin bir eşiği aşması uyarıyı tetikler.

def detect_trend(
    values: list,
    slope_threshold: float = 0.1  # units per second
) -> dict:
    import statistics
    n = len(values)
    if n < 2:
        return {'trend': 'insufficient_data'}

    x = list(range(n))
    x_mean = statistics.mean(x)
    y_mean = statistics.mean(values)

    numerator = sum((xi - x_mean) * (yi - y_mean) for xi, yi in zip(x, values))
    denominator = sum((xi - x_mean) ** 2 for xi in x)
    slope = numerator / denominator if denominator != 0 else 0.0

    return {
        'slope': round(slope, 4),
        'trend': 'rising' if slope > slope_threshold
                 else 'falling' if slope < -slope_threshold
                 else 'stable',
        'alert': abs(slope) > slope_threshold * 2
    }

readings = [22.0, 22.5, 23.0, 23.5, 24.0, 24.5, 25.0]
print(detect_trend(readings, slope_threshold=0.3))

Zaman Serisinden Ajan Kararı

Bileşik bir karar vermek için sıçrama algılama, eğilim algılama ve hareketli ortalamayı birleştirin. Ajan bir kural hiyerarşisi kullanır: sıçramalar hemen eylemleri tetikler, eğilimler uyarıları tetikler ve belirsiz durumları LLM ele alır.

def analyze_sensor_window(
    values: list,
    topic: str
) -> dict:
    if len(values) < 10:
        return {'action': 'collecting_data'}

    spikes = detect_spikes(values, window=10, z_threshold=3.0)
    trend_info = detect_trend(values[-20:], slope_threshold=0.2)
    avg = sum(values[-10:]) / 10

    if spikes:
        return {
            'action': 'IMMEDIATE_ALERT',
            'reason': f'Spike detected: {spikes[-1]["value"]} (z={spikes[-1]["z_score"]})',
            'severity': 'high'
        }
    if trend_info['alert']:
        return {
            'action': 'TREND_WARNING',
            'reason': f'Rapid {trend_info["trend"]} trend: slope={trend_info["slope"]}',
            'severity': 'medium'
        }
    return {
        'action': 'NORMAL',
        'avg_last_10': round(avg, 2),
        'trend': trend_info['trend']
    }

result = analyze_sensor_window([22.0]*15 + [55.0], 'sensors/temp')
print(result)

Zaman Serisini Veritabanında Kalıcı Hale Getirme

Uzun vadeli analiz için sensör okumalarını bir zaman serisi veritabanında kalıcı olarak saklayın. TimescaleDB (PostgreSQL uzantısı) ve InfluxDB yaygın seçeneklerdir. TimescaleDB ile psycopg2 kullanmak, verileri standart SQL ve zamana özgü işlevlerle sorgulamanızı sağlar.

import psycopg2
from datetime import datetime

# TimescaleDB connection (standard PostgreSQL connection)
conn = psycopg2.connect(
    host='localhost', port=5432, dbname='iot',
    user='agent', password='YOUR_DB_PASSWORD'
)

def insert_reading(topic: str, value: float, ts: datetime = None):
    ts = ts or datetime.utcnow()
    with conn.cursor() as cur:
        cur.execute(
            'INSERT INTO sensor_readings (time, topic, value) VALUES (%s, %s, %s)',
            (ts, topic, value)
        )
    conn.commit()

def query_last_hour(topic: str) -> list:
    with conn.cursor() as cur:
        cur.execute(
            'SELECT time, value FROM sensor_readings '
            'WHERE topic=%s AND time > NOW() - INTERVAL \'1 hour\' '
            'ORDER BY time ASC',
            (topic,)
        )
        return cur.fetchall()

Uyarı Soğuma Süresi

Soğuma süresi olmadan sürekli devam eden bir anomali, dakikada yüzlerce uyarıyı tetikler. Konu başına bir soğuma süresi uygulayın: bir konu için uyarı gönderildikten sonra o konuyla ilgili diğer uyarıları N saniye boyunca bastırın.

from datetime import datetime, timedelta

class AlertCooldownManager:
    def __init__(self, cooldown_seconds: int = 300):
        self.cooldown_seconds = cooldown_seconds
        self._last_alert: dict = {}  # topic -> last alert datetime

    def should_alert(self, topic: str) -> bool:
        last = self._last_alert.get(topic)
        if last is None:
            return True
        return (datetime.utcnow() - last).seconds >= self.cooldown_seconds

    def mark_alerted(self, topic: str):
        self._last_alert[topic] = datetime.utcnow()

    def cooldown_remaining(self, topic: str) -> int:
        last = self._last_alert.get(topic)
        if last is None:
            return 0
        elapsed = (datetime.utcnow() - last).seconds
        return max(0, self.cooldown_seconds - elapsed)

cooldown = AlertCooldownManager(cooldown_seconds=300)
if cooldown.should_alert('sensors/temperature'):
    print('Sending alert')
    cooldown.mark_alerted('sensors/temperature')
else:
    print(f'Cooldown: {cooldown.cooldown_remaining("sensors/temperature")}s remaining')

Bilgi Kontrolü

Sıçrama algılamada kullanılan 3,0'ın üzerindeki bir z-skoru neyi gösterir?

Özet: Zaman Serisi Verilerini İşleme

Ajanlar için eksiksiz zaman serisi işleme araç setini ele aldınız:

  • Kayan pencere tamponu: belleği verimli kullanan akış işlemesi için azami uzunluk özelliğine sahip çift uçlu kuyruk
  • Hareketli ortalama: gürültü azaltma için SMA ve EMA
  • Sıçrama algılama: kayan pencere istatistiklerine göre z-skoru yöntemi
  • Pandas: DatetimeIndex ile yeniden örnekleme, aradeğerleme ve toplulaştırma
  • Eğilim algılama: erken uyarı için doğrusal regresyon eğimi
  • Uyarı soğuma süresi: sürekli anormalliklerde yinelenen uyarıları bastırma

Sırada: eylem kuyrukları, tekilleştirme ve eylem ilkeleriyle sensör olaylarına otomatik ajan yanıtları.

Sıkça Sorulan Sorular

“Aracılarda Zaman Serisi Verisi İşleme” dersi ücretsiz mi?

Evet — “Aracılarda Zaman Serisi Verisi İşleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.

“Aracılarda Zaman Serisi Verisi İşleme” dersinde ne öğreneceğim?

Akış hâlindeki sensör verilerinde kayan pencereler, toplulaştırma ve anomali algılama. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Agents öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Aracılarda Zaman Serisi Verisi İşleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Aracı Entegrasyonu İçin MQTT Protokolü
  2. Aracılarda Zaman Serisi Verisi İşleme
  3. Sensör Olaylarına Otomatik Yanıt
  4. Hafif Aracıların Uçta Dağıtımı
← AI Agents Sayfasına Dön