【问题标题】:Compute product of all combinations of a dataframe column with two conditions计算具有两个条件的数据框列的所有组合的乘积
【发布时间】:2021-05-20 20:16:22
【问题描述】:

我的 pandas 数据框由 3 列组成,其中包含有关贷款的信息:

LoanKey  ProbOfDefault    EL(expected loss)
1          100%             546
2          90%              102
3.         92%              1009
.           .                .
.           .                .
.           .                .
303        13%              68

我需要找到具有最高累积EL 值的贷款组合,其违约概率在0.9%-1%. 之间

例如,一个组合可以包含 3 笔贷款:

loan1 - PD=30%; EL=372
loan2 - PD=10%; EL=1792
loan3 - PD=3%;  EL=123

cummulative EL=372+1792+123=2287
cummulative PD = 30%*10%*3%=0.9%

我尝试将我的 pandas 列转换为列表并使用 itertools.combinations 查找所有可能的贷款组合并计算每个组合的 PD 和 EL,选择一个使用 0.9%<=PD<=1% 和最大值的组合。 EL,但我的解决方案计算时间太长,因为可能的组合数量非常多。

有没有更聪明的方法来解决这个问题?

【问题讨论】:

  • 不知道你的数据集有多大或你想要达到的最优值有多接近,但这是一种贪婪的启发式方法,按 PD 排序并取走所有贷款,直到累计超过 1%可能会产生相当好的结果。
  • 感谢您的回答,兰迪。我的数据集包含 310 个观察结果,所以它不是太大。你有一个贪心启发式算法的例子吗?或者我将如何按 PD 进行排序?会是降序吗?

标签: python pandas algorithm numpy


【解决方案1】:

为了扩展我的评论,这里有一个例子。

首先,我创建一个随机数据框并按 PD 列排序:

In [178]: df = pd.DataFrame(np.random.random([20000, 2]), columns=['pd', 'lgd'])
In [179]: df.sort_values("pd", inplace=True)

然后你可以计算两列的累积值:

In [180]: df['cumul_pd'] = df['pd'].expanding().mean()
In [181]: df['cumul_lgd'] = df['lgd'].cumsum()

从那里,您可以选择cumul_pd < 0.1 的最后一个值:

In [182]: df[df['cumul_pd'] <= 0.01].tail(1)[['cumul_pd', 'cumul_lgd']]
Out[182]:
       cumul_pd   cumul_lgd
16553  0.009997  203.962193

正如我所提到的,不能保证这是一个最佳解决方案,但假设损失列中没有巨大的波动,它应该很接近。

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 2019-10-28
    • 1970-01-01
    • 2016-10-19
    • 2014-08-05
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多