pandas 中的条件滚动计算
Conditional rolling computation in pandas
我想计算一个名为 "downside beta" 的数量。
假设我有一个数据框 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' 计算这个下行 beta,定义为 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?
谢谢!
这是您要找的吗?您可以过滤掉正值,然后相应地调用 pandas cov
和 var
函数:
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])
对于滚动window,您可能需要跳过几个圈,但这应该是可行的;
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
我想计算一个名为 "downside beta" 的数量。 假设我有一个数据框 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' 计算这个下行 beta,定义为 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?
谢谢!
这是您要找的吗?您可以过滤掉正值,然后相应地调用 pandas cov
和 var
函数:
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])
对于滚动window,您可能需要跳过几个圈,但这应该是可行的;
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