Применить функцию (MinCovDet) к скользящему окну Pandas Dataframe (массив n x m) - PullRequest
0 голосов
/ 05 июля 2018

Я хочу рассчитать устойчивую ковариацию, используя sklearn.covariance MinCovDet. У меня есть датафрейм с 3000 строк и 20 столбцов содержат даты в индексе. Для каждой строки рассчитать робастную ковариацию за, скажем, последние 200 дней. Я пробовал с

df.apply(lambda x: MinCovDet().fit(df[x-400:x].values))

Я получаю ошибку TypeError: ("Невозможно преобразовать ввод [дата \ n2004-01-02 и т. Д. *

Есть идеи? Более общий вопрос будет состоять в том, как применить функцию к массиву n x m панд данных.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 30 июля 2018

Если ваши даты действительно являются индексом, то они не должны быть замечены df.values. Если даты в первом столбце, то

df1 = df.loc[:, 1:]
df1.apply(lambda x: MinCovDet().fit(df[x-400:x].values))

должно работать нормально.

0 голосов
/ 06 июля 2018

Ответ на «более общий вопрос».

Существует метод pandas.DataFrame.rolling() специально для таких случаев: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html

Тогда вы можете использовать .apply() как обычно, или использовать скользящий объект в качестве аргумента. Так что в вашем случае код будет следующим:

MinCovDet.fit(df.rolling(window = 400).values)
...