Вот то, что, я думаю, вы пытаетесь выполнить.
Однако мне нужно было пройти через логику дважды, так как после того, как вы добавите «вещи выше 15», это вытолкнет одно из меньших значений выше 15Если размер ваших данных является проблемой, вы можете просто поместить несколько строк кода в цикл while
, который остановится, когда все станет 15 или меньше.
import pandas as pd
import numpy as np
ticker = ['XXX US Equity', 'YYY US Equity', 'QQQ US Equity', 'EEE US Equity', 'RRR US Equity', 'YYYY US Equity', 'RRRR US Equity', 'WSDE CN Equity', 'SDE US Equity', 'AWE US Equity']
weights_percent = [1.185202, 1.449595, 2.582312, 3.900307, 10.467625, 11.200174, 14.001746, 18.021638, 18.479187, 18.712215]
dat = pd.DataFrame({'ticker': ticker, 'weights_percent': weights_percent})
# Create new column to see what rows need to change
dat['new_weights_percent'] = dat.weights_percent - 15
dat['new_weights_percent'] = np.where(dat.new_weights_percent < 0, 0, dat.new_weights_percent)
# Get amount to add to remaining
all_weights = dat.new_weights_percent.sum()
avg_to_apply_to_remaining = all_weights/sum(dat.new_weights_percent == 0)
# Add this amount to reminaing and "floor" the others at 15
dat['weights_percent'] = np.where(dat.weights_percent < 15, dat.weights_percent + avg_to_apply_to_remaining, 15)
# Need to do the whole thing twice, since there's a value that gets to be above 15 after you add the remainder
dat['new_weights_percent'] = dat.weights_percent - 15
dat['new_weights_percent'] = np.where(dat.new_weights_percent < 0, 0, dat.new_weights_percent)
# Get amount to add to remaining
all_weights = dat.new_weights_percent.sum()
avg_to_apply_to_remaining = all_weights/sum(dat.new_weights_percent == 0)
# Add this amount to reminaing and "floor" the others at 15
dat['weights_percent'] = np.where(dat.weights_percent < 15, dat.weights_percent + avg_to_apply_to_remaining, 15)
dat.drop(columns=['new_weights_percent'], inplace=True)
print(dat)
Вывод:
ticker weights_percent
0 XXX US Equity 2.695402
1 YYY US Equity 2.959795
2 QQQ US Equity 4.092512
3 EEE US Equity 5.410507
4 RRR US Equity 11.977825
5 YYYY US Equity 12.710374
6 RRRR US Equity 15.000000
7 WSDE CN Equity 15.000000
8 SDE US Equity 15.000000
9 AWE US Equity 15.000000