win_type="kaiser",
center=True,
).mean(beta=extrema_smoothing_beta),
+ "triang": zero_phase(
+ series=series,
+ window=window,
+ win_type="triang",
+ std=std,
+ beta=extrema_smoothing_beta,
+ )
+ if extrema_smoothing_zero_phase
+ else series.rolling(
+ window=odd_window, win_type="triang", center=True
+ ).mean(),
"smm": series.rolling(window=odd_window, center=True).median(),
"sma": series.rolling(window=odd_window, center=True).mean(),
"ewma": series.ewm(span=window).mean(),
@lru_cache(maxsize=8)
def _calculate_coeffs(
- window: int, win_type: Literal["gaussian", "kaiser"], std: float, beta: float
+ window: int,
+ win_type: Literal["gaussian", "kaiser", "triang"],
+ std: float,
+ beta: float,
) -> np.ndarray:
if win_type == "gaussian":
coeffs = sp.signal.windows.gaussian(M=window, std=std, sym=True)
elif win_type == "kaiser":
coeffs = sp.signal.windows.kaiser(M=window, beta=beta, sym=True)
+ elif win_type == "triang":
+ coeffs = sp.signal.windows.triang(M=window, sym=True)
else:
raise ValueError(f"Unknown window type: {win_type}")
return coeffs / np.sum(coeffs)
def zero_phase(
series: pd.Series,
window: int,
- win_type: Literal["gaussian", "kaiser"],
+ win_type: Literal["gaussian", "kaiser", "triang"],
std: float,
beta: float,
) -> pd.Series: