Извлечение тренда с использованием запущенной медианы в декомпозиции временных рядов в Python?

#python

Вопрос:

У меня есть много различных временных рядов, которые являются сезонными и включают большие выбросы.

При использовании текущей средней для извлечения тренда (как в реализации STL) это может привести к повреждению извлеченного тренда и сезонной составляющей и появлению ложных выбросов в остатках.

введите описание изображения здесь

Один из способов борьбы с этим-извлечь тренд, используя вместо этого скользящую медиану, есть ли какой-либо пакет python, который делает это аналогично decmedian (https://rdrr.io/cran/pastecs/man/decmedian.html) в R?

Другим решением может быть попытка перевести приведенный ниже фрагмент кода на Python, но я не уверен, как перевести эту xts часть.

 decompose.median <- function(m, period) {
   trend <- rollapply(m, width = period, fill = NA, align = "center",
                 FUN = median, na.rm = TRUE)
   season <- m - trend
   figure <- numeric(period)
   l   <- length(m)
   index <- seq.int(1, l, by = period) - 1
   for (i in 1:period) figure[i] <- median(season[index   i], na.rm = TRUE)
   seasonal=xts(rep(figure, l %/% period   1)[seq_len(l)], order.by = index(m))
   list(observed = m,
   trend = trend,
   seasonal = seasonal,
   remainder = m - trend - seasonal)
}
 

Попробуйте Python

 def decompose_median(df,col,period):
    m = df[col]
    trend = df[col].rolling(period).median()
    season = m - trend
    figure = np.zeros(period)
    l = len(m)
    index = np.array(range(1,100,10)) - 1
    for i in range(1,period):
        figure[i] = np.median(season.dropna()[index   i])

    
  #### Not sure how to translate this part
   seasonal=xts(rep(figure, l %/% period   1)[seq_len(l)], order.by = 
   index(m))
   list(observed = m,
   trend = trend,
   seasonal = seasonal,
   remainder = m - trend - seasonal)
    }