Метод pandas.series.rolling.apply, по-видимому, неявно преобразует Series в массив numpy. - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу вычислить скользящую волатильность кривой чистой стоимости.

# demo
import pandas as pd

def get_rolling_vol(s: pd.Series) -> float:
    return s.pct_change().iloc[1:].std()

s = pd.Series([1, 1.2, 1.15, 1.19, 1.23, 1.3])
rolling = s.rolling(window=2)
stds = rolling.apply(lambda s: get_rolling_vol(s))

Выдает ошибку:

FutureWarning: Currently, 'apply' passes the values as ndarrays to the applied function. In the future, this will change to passing it as Series objects. You need to specify 'raw=True' to keep the current behaviour, and you can pass 'raw=False' to silence this warning
  stds = rolling.apply(lambda s: get_rolling_vol(s))
... (omits intermediate tracebacks)
AttributeError: 'numpy.ndarray' object has no attribute 'pct_change'

Можно ли передать аргумент как Series вместо ndarrays в apply?FutureWarning говорит, что это произойдет в будущем, что если я захочу это сейчас?(Не хочу изменять функцию get_rolling_vol, поскольку есть много других функций, которые также предполагают, что аргумент равен Series, и изменение всех из них будет утомительным.) Спасибо.

1 Ответ

0 голосов
/ 20 февраля 2019

Да, это возможно, как указано в предупреждающем сообщении: используйте raw=False в качестве аргумента в rolling.apply

Это работает как минимум в пандах 0.24.1

...