按等级分配递减金额



我有一组排名的数据。

df = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
'VOD': [3, 2.3, 2, 1.8, 2, 4, 5, 4, 3, 1],
'BBY': [0.9, 1, 1.2, 1, 1, 2.3, 2.4, 2.5, 3, 2.9],
'STJ': [4, 4.2, 4.3, 4.4, 3.5, 3, 2, 1, 1.2, 2],
'RBS': [0.5, 0.6, 0.7, 0.6, 1, 1.2, 1.3, 1.4, 1.5, 2]})
df1 = df.rank(1, ascending=False, method='first')

我有一个 1000 的数字,我正在尝试将其分配给 4 列。但是,每列的最大分配是 1000 列的 40%。从排名第一的列中填满。

例如,第一行如下所示:

available = 1000
max_allocation = 0.4
result = pd.DataFrame({'Date': ['02/01/2019'],
'VOD': 400
'BBY': 200
'STJ': 400
'RBS': 0})

在这种情况下,每列可以具有的最大值为 400 (1000*0.4(。作为排名最高的列,"STJ"首先填充 400。还剩下 600 个要分配,因为这比最多 400 个还要分配 400 个。这次是VOD排名第二的栏目。然后只剩下 200 个 - 少于 400 的最大分配。剩下的200个将被分配到排名第三的列 - "BBY"。没有剩余的内容可以分配给 RBS 列。

我已经考虑过使用一个类然后调整要分配的数量,但随着添加额外的行,它变得非常复杂。Numpy 哪里是另一个选择,但我无法让它处理可供分配的金额下降。

def allocation(rank):
return min(available * max_allocation, max(0, available - (rank - 1)* available * max_allocation))
pd.concat([df.Date, df1.applymap(allocation)], axis=1)

结果:

Date    VOD    BBY    STJ    RBS
0  02/01/2019  400.0  200.0  400.0    0.0
1  03/01/2019  400.0  200.0  400.0    0.0
2  04/01/2019  400.0  200.0  400.0    0.0
3  07/01/2019  400.0  200.0  400.0    0.0
4  08/01/2019  400.0  200.0  400.0    0.0
5  09/01/2019  400.0  200.0  400.0    0.0
6  10/01/2019  400.0  400.0  200.0    0.0
7  11/01/2019  400.0  400.0    0.0  200.0
8  14/01/2019  400.0  400.0    0.0  200.0
9  15/01/2019    0.0  400.0  400.0  200.0

最新更新