Я пытаюсь получить 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 поможет. Мне действительно нужно расширить это на все годы в наборе данных. Буду признателен за любую помощь?? Большое спасибо