как применить ограничение в кадре данных, чтобы равномерно распределить проценты, когда предел достигнут - PullRequest
0 голосов
/ 09 июля 2019

У меня есть датафрейм, как показано ниже.Я хочу применить коэффициент покрытия, чтобы при достижении 15% веса избыточный вес распределялся равномерно.Кто-нибудь может мне помочь?Я все еще новичок в Python и борюсь с этим, спасибо!

            Weights %
TICKER  
XXX US Equity   1.185202
YYY US Equity   1.449595
QQQ US Equity   2.582312
EEE US Equity   3.900307
RRR US Equity   10.467625
YYYY US Equity  11.200174
RRRR US Equity  14.001746
WSDE CN Equity  18.021638
SDE US Equity   18.479187
AWE US Equity   18.712215

1 Ответ

0 голосов
/ 09 июля 2019

Вот то, что, я думаю, вы пытаетесь выполнить.

Однако мне нужно было пройти через логику дважды, так как после того, как вы добавите «вещи выше 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...