Скользящее стандартное отклонение в пандах, возвращающее нули для одного столбца

У кого-нибудь были проблемы с скользящими стандартными отклонениями, которые не работали только с одним столбцом в кадре данных pandas?

У меня есть фреймворк с индексом datetime и соответствующими финансовыми данными. Когда я запускаю df.rolling (). Std () (псевдокод, см. Ниже), я получаю правильные данные для всех столбцов, кроме одного. Этот столбец возвращает 0 там, где должны быть значения стандартного отклонения. Я также получаю ту же ошибку при использовании .rolling_std (), и я получаю сообщение об ошибке при попытке запустить df.rolling (). Skew (), все остальные столбцы работают, и этот столбец дает NaN.

Что меня сбивает с толку в этой ошибке, так это то, что другие столбцы работают правильно, и для этого столбца работает df.rolling (). Mean (). Вдобавок в столбце есть dtype float64, что не должно быть проблемой. Я также проверил и не вижу недостающих данных. Я использую скользящее окно в 30 дней, и если я попытаюсь получить последнее значение стандартного отклонения с помощью series [-30:]. Std (), я получу правильный результат. Так что похоже, что что-то конкретно с подвижной частью не работает. Я поигрался с параметрами .rolling (), но ничего не мог изменить.

# combine the return, volume and slope data
raw_factor_data = pd.concat([fut_rets, vol_factors, slope_factors], axis=1)

# create new dataframe for each factor type (mean,
# std dev, skew) and combine
mean_vals = raw_factor_data.rolling(window=past, min_periods=past).mean()
mean_vals.columns = [column + '_mean' for column in list(mean_vals)]

std_vals = raw_factor_data.rolling(window=past, min_periods=past).std()
std_vals.columns = [column + '_std' for column in list(std_vals)]

skew_vals = raw_factor_data.rolling(window=past, min_periods=past).skew()
skew_vals.columns = [column + '_skew' for column in list(skew_vals)]

fact_data = pd.concat([mean_vals, std_vals, skew_vals], axis=1)

Первая строка объединяет три фрейма данных вместе. Затем я создаю отдельные фреймы данных со скользящим средним, стандартным значением и перекосом (прошлое = 30), а затем объединяю их в один фрейм данных.

Имя столбца, с которым у меня возникли проблемы, - «TY1_slope». Итак, я запустил следующий код, чтобы увидеть, где есть ошибка.

print raw_factor_data['TY1_slope'][-30:].std()
print raw_factor_data['TY1_slope'][-30:].mean()

print raw_factor_data['TY1_slope'].rolling(window=30, min_periods=30).std()
print raw_factor_data['TY1_slope'].rolling(window=30, min_periods=30).mean()

Первые две строки кода выводят правильное стандартное отклонение и среднее значение (0,08 и 0,14). Однако третья строка кода производит нули, а четвертая строка дает точные средние значения (окончательные значения в этих сериях - 0,0 и 0,14).

Если кто-нибудь может помочь с тем, как посмотреть исходный код .rolling, это тоже будет полезно. Я новичок в этом и пробовал следующее, но получил несколько строк, которые не казались очень полезными.

import inspect
import pandas as pd
print inspect.getsourcelines(pd.rolling_std)

person airtraxam    schedule 30.09.2017    source источник
comment
Представьте себе легкость, с которой можно отлаживать код без ваших данных!   -  person cs95    schedule 30.09.2017
comment
Я понимаю, но мне не удалось воссоздать проблему со случайными данными / на простом примере (это одна из причин, по которой я спрашивал, видел ли кто-то это раньше или может ли кто-то дать направление при просмотре исходного кода). Я полностью готов отправить полный код с базой данных, из которой он извлекается, если кто-то захочет взглянуть на него. df1 = pd.DataFrame (np.random.randn (30,5), index = pd.date_range ('20170101', периоды = 30), columns = ['ES1_vol', 'TY1_vol', 'JY1_vol', 'EC1_vol' , 'YM1_vol']) - это общий тип фрейма данных.   -  person airtraxam    schedule 30.09.2017
comment
попробуйте сделать это на подмножествах столбца, пока вы не сможете сузить до некоторого (надеюсь, небольшого) подмножества данных и просто показать эти данные. Похоже, это каким-то образом связано с данными. Вы также можете попробовать вычислить std для этого столбца в какой-либо другой программе (excel, r, sas, stata и т. Д.), Чтобы увидеть, что происходит в других программах.   -  person JohnE    schedule 30.09.2017
comment
снят в темноте, но вы можете попробовать rolling(30).apply( lambda x: np.std(x,ddof=1) ), если это какая-то странная синтаксическая ошибка с прокруткой + std   -  person JohnE    schedule 30.09.2017


Ответы (1)


Цитата из комментария JohnE, поскольку он сработал (хотя до сих пор не уверен в основной причине проблемы). JohnE, не стесняйтесь менять ответ, и я буду голосовать за.

выстрелил в темноте, но вы можете попробовать roll (30) .apply (lambda x: np.std (x, ddof = 1)) на случай, если это какая-то странная синтаксическая ошибка с вращением + std - JohnE

person airtraxam    schedule 01.10.2017