1

有没有人遇到滚动标准偏差不能只处理熊猫数据框中的一列的问题?

我有一个带有日期时间索引和相关财务数据的数据框。当我运行 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)
4

1 回答 1

0

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

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

于 2017-10-01T01:13:30.543 回答