大熊猫中的条件滚动计算

时间:2018-03-06 17:42:44

标签: python pandas dataframe conditional rolling-computation

我想计算一个名为“下行测试版”的数量。 假设我有一个数据帧df:

df = pd.DataFrame({'A': [-0.1,0.3,-0.4, 0.8,-0.5],'B': [-0.2,0.5,0.3,-0.5,0.1]},index=[0, 1, 2, 3,4])

我想添加一个列,'C'计算这个下行测试版,定义为A列和B列之间的协方差,只考虑A列的负值和相应的B值。然后应该划分这个协方差。通过A列的方差仅考虑负值。

在上面的例子中,它应该等于计算两个系列之间的协方差:[ - 0.1,-0.4,-0.5]和[-0.2,0.3,0.1]。除以系列的方差[-0.1,-0.4,-0.5]。

下一步是将此指标推广到初始大型数据帧df。

的索引上

有没有一种有效的方法呢?以矢量化的方式。我想结合pd.rolling_cov和np.where?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是你正在寻找的吗?您可以过滤掉正值,然后相应地调用pandas covvar函数:

v = df[df.A.lt(0)]
v.cov() / v.A.var()

          A         B
A  1.000000 -0.961538
B -0.961538  1.461538

如果您只想要对角线上的值,

np.diag(v.cov() / v.A.var(), k=-1)
array([-0.96153846])

对于滚动窗口,您可能需要跳过一些箍,但这应该是可行的;

v = df[df.A.lt(0)]  
i = v.rolling(3).cov().A.groupby(level=0).last()
j = v.rolling(3).A.var()

i / j

0         NaN
2         NaN
4   -0.961538
Name: A, dtype: float64