применить пользовательскую функцию к кадру данных pandas в скользящем окне

Предположим, у вас есть фрейм данных с 1000 ценами закрытия. Вы хотите применить функцию расчета риска (скажем, VaR) с именем compute_var() к последним 90 ценам закрытия на скользящей основе. Как бы ты это сделал? Я полагаю с apply():

def compute_var(df):
       return do_calculations_on(df[-90:])

def compute_rolling_var(self):
       self.var = self.closing.apply(compute_var)

Проблема в том, что .apply передает только закрытие 1 дня compute_var, а не фреймворку данных. Значит выдает ошибку.

Единственное рабочее решение, которое я нашел, - это алгоритм итерационного стиля (.iterrow ()): я передаю индекс итерации в compute_var, и он обрезает закрывающий фрейм данных self.closing[:i] перед выполнением вычислений в последних 90 строках, затем он заполняет фрейм данных df.var через .loc(i) = computer_var_value.

Я подозреваю, что есть способ получше.


person comte    schedule 12.06.2015    source источник
comment
Я думаю, вы ищете _1 _ принимает параметр окна   -  person EdChum    schedule 12.06.2015
comment
Похоже, rolling_apply устарел в пользу _ 2_   -  person KT12    schedule 18.03.2019


Ответы (1)


ответ - apply_rolling, как подчеркнуто EdChum + min_periods Adjustment

Проблема возникла из-за нескольких NaN значений во входных данных и min_periods=None по умолчанию, который реагирует так, как будто в вашем окне разрешено нет NaN значения (здесь 90 дней). Мне это кажется очень нелогичным, но установка min_periods=1 решила мою проблему.

person comte    schedule 16.06.2015
comment
Если вы решили свою проблему, дайте ответ и примите его, а не редактируйте решение в вопросе. - person euri10; 30.11.2015