Панды получают 30-дневное скользящее окно в течение n лет - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь получить 30-дневное окно, идущее назад от всех дат в кадре данных, а также посмотреть на одно и то же 30-дневное окно для всех лет в наборе данных. Даты с 2000-2019. Например, начиная с 1 февраля 2000 года, я хотел бы взять предыдущие 30 дней и 30 дней до 1 февраля во всех остальных годах.

Я могу заставить скользящее окно работать в течение n дней для z-счета:

dt= pd.date_range(start='2000-01-01', end='2019-03-01')
x=[randint(0,100) for x in range(len(dt))]
DTX = pd.DataFrame({'X': x}, index=dt)

def zscore(x, window):
    """ calculate z-score across a window (assumes normal distribution) """
    r = x.rolling(window=window)
    m = r.mean().shift(1)
    s = r.std(ddof=0).shift(1)
    z = (x-m)/s
    return z

DTX['Z'] = zscore(DTX['X'], 30)

Или звание за окно:

def ranked_percent(col, window):
    """ rank values in a window as a decimal (highest=1)"""
    pctrank = lambda x: pd.Series(x).rank(pct=True).iloc[-1]
    rollingrank=col.rolling(window=window,raw=False).apply(pctrank)
    return rollingrank

DTX['Rank'] = ranked_percent(DTX['X'], 30)

Мне было интересно, возможно, использовать groupby и grouper, но не представляете, как это реализовать? - Не привязываясь к этому, любое (довольно векторизованное / быстрое) решение на Python поможет. Мне действительно нужно расширить это на все годы в наборе данных. Буду признателен за любую помощь?? Большое спасибо

...