Pandas:将函数成对应用于数据框和面板
Pandas: apply function pairwise to a dataframe and a panel
在金融领域,假设有一个资产权重数据框和一个每日协方差矩阵面板:
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)
和return日方差是否如上"out"?
选项 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)]
在金融领域,假设有一个资产权重数据框和一个每日协方差矩阵面板:
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)
和return日方差是否如上"out"?
选项 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)]