초기 커밋

This commit is contained in:
2026-03-01 07:44:19 +09:00
commit 09359f30be
146 changed files with 6120 additions and 0 deletions

View File

View File

@@ -0,0 +1,26 @@
from __future__ import annotations
from datetime import datetime
import polars as pl
def filter_time_range(
df: pl.DataFrame, column: str, start: datetime, end: datetime
) -> pl.DataFrame:
return df.filter(
(pl.col(column) >= start) & (pl.col(column) <= end)
)
def resample(df: pl.DataFrame, time_column: str, interval: str) -> pl.DataFrame:
numeric_cols = [
c for c in df.columns if c != time_column and df[c].dtype.is_numeric()
]
return df.sort(time_column).group_by_dynamic(time_column, every=interval).agg(
[pl.col(c).mean().alias(c) for c in numeric_cols]
)
def to_records(df: pl.DataFrame) -> list[dict]:
return df.to_dicts()

View File

@@ -0,0 +1,39 @@
from __future__ import annotations
import numpy as np
def moving_average(values: list[float], window: int = 5) -> list[float]:
if len(values) < window:
return values
arr = np.array(values, dtype=float)
return np.convolve(arr, np.ones(window) / window, mode="valid").tolist()
def detect_anomalies(
values: list[float], threshold: float = 2.0
) -> list[dict]:
"""Detect anomalies using Z-score method."""
arr = np.array(values, dtype=float)
mean = np.mean(arr)
std = np.std(arr)
if std == 0:
return []
z_scores = np.abs((arr - mean) / std)
anomalies = []
for i, (val, z) in enumerate(zip(values, z_scores)):
if z > threshold:
anomalies.append({"index": i, "value": val, "z_score": float(z)})
return anomalies
def percentile_stats(values: list[float]) -> dict:
arr = np.array(values, dtype=float)
return {
"p50": float(np.percentile(arr, 50)),
"p90": float(np.percentile(arr, 90)),
"p95": float(np.percentile(arr, 95)),
"p99": float(np.percentile(arr, 99)),
}