【问题标题】:Pandas: apply function pairwise to a dataframe and a panelPandas:将函数成对应用于数据框和面板
【发布时间】:2017-05-23 04:38:12
【问题描述】:

在金融的背景下,假设有一个资产权重数据框和一个每日协方差矩阵面板:

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”一样返回每日方差?

【问题讨论】:

    标签: pandas covariance finance portfolio


    【解决方案1】:

    选项 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 我已经更新了我的帖子。希望这很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2012-10-31
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多