Pandas:对数据框和面板应用成对函数

3
在金融背景下,假设有一个资产权重的数据框和一个每日协方差矩阵的面板:
w = pd.DataFrame({'Date':pd.to_datetime(['2016-01-01','2016-01-02','2016-01-03']),'A1':[0.3,0.1,0.1],'A2':[0.4,0.4,0.4]}).set_index(['Date'])
covar = [[[0.000087,0.000017],[0.000087,0.000017],[0.000087,0.000017]],[[0.000017,0.00019],[0.000017,0.00019],[0.000017,0.00019]]]
covPanel = pd.Panel(covar, items=['A1', 'A2'],  major_axis=pd.to_datetime(['2016-01-01','2016-01-02','2016-01-03']), minor_axis=['A1', 'A2'])

为了计算1天组合的方差,可以使用以下函数:
def portVar(w,sigma):
    return w.dot(sigma.dot(w))

每天可以对协方差矩阵应用最后一行权重,得到每日的方差:

out = covPanel.apply(lambda cov1: portVar(w.iloc[-1,:],cov1),axis = [2,0])

但是,如何将上述函数应用于数据帧和协方差矩阵的每一天(不使用循环)?换句话说,类似于以下内容:
pd.ApplyPairwise(portVar,w,covPanel) 

而且返回每日方差,就像上面的"out"一样?
1个回答

2

选项 1
重写 portVar

将整个面板传递给正在应用的函数,并使用 xs 获取特定日期权重的适当横截面。 日期在 name 属性中。


def portVar(w, sigma):
    s = sigma.xs(w.name, axis='major')
    return w.dot(s.dot(w))

w.apply(portVar, 1, sigma=covPanel)

Date
2016-01-01    0.000042
2016-01-02    0.000033
2016-01-03    0.000033
dtype: float64

选项 2
numpy 广播技术

cv = covPanel.values
wv = w.values

pd.Series(((wv[None, :] * cv).sum(-1).T * wv).sum(1), w.index)

Date
2016-01-01    0.000042
2016-01-02    0.000033
2016-01-03    0.000033
dtype: float64

回应评论

一种通用的Python做事情成对的方式是使用zip
我将使用列表推导式来生成我们正在寻找的列表。请注意,在面板对象上进行转置以确保日期是第一个维度。

def portVar(w,sigma):
    return w.dot(sigma.dot(w))

[portVar(w_, s_) for w_, s_ in zip(w.values, covPanel.transpose(1, 0, 2).values)]

谢谢。在这种情况下,我更喜欢选项1。您是否还知道一些更通用的Python方法,可以对两个“列表”中的元素成对应用函数? - iwbabn
@iwbabn 我已经更新了我的帖子。希望这对你有用。 - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接