大熊猫滚动标准偏差一列返回零点

时间:2017-09-30 14:19:33

标签: python pandas dataframe standard-deviation rolling-computation

是否有人在滚动标准偏差方面遇到问题,这些偏差不仅仅适用于pandas数据框中的一列?

我有一个带有日期时间索引和相关财务数据的数据框。当我运行df.rolling()。std()(伪代码,请参见下面的实际代码)时,我得到除了一列之外的所有列的正确数据。该列返回0,其中应该有标准偏差值。我在使用.rolling_std()时也遇到了同样的错误,我在尝试运行df.rolling()时遇到错误.skew(),所有其他列都工作,此列给出了NaN。

关于这个错误让我失望的是其他列正常工作,对于这个列,df.rolling()。mean()有效。此外,该列具有dtype float64,这不应该是一个问题。我也检查过,看不到丢失的数据。我使用了30天的滚动窗口,如果我尝试使用系列[-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)

第一行将三个数据帧组合在一起。然后我创建了具有滚动均值,std和skew(过去= 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()

前两行代码输出正确的标准偏差和平均值(.08和.14)。但是,第三行代码产生零,但第四行产生准确的平均值(这些系列中的最终值为0.0和.14)。

如果有人可以帮助我们查看有用的.rolling源代码。我是这样做的新手,并尝试了以下内容,但只是得到了一些看起来没有用的帮助。

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

1 个答案:

答案 0 :(得分:0)

引用JohnE的评论,因为它有效(尽管仍不确定问题的根本原因)。 JohnE,随意改变答案,我会投票。

  

在黑暗中拍摄,但你可以尝试滚动(30).apply(lambda x:np.std(x,ddof = 1))以防它是滚动+标准的一些奇怪的语法错误 - JohnE