У меня есть данные, которые показывают, какой вес ETF содержится в стране.Проблема в том, что источник данных имеет незначительные расхождения во взвешивании.Например, для ETF VTI сумма всех процентов (США + Канада) равна 1,026, что означает, что общая сумма составляет приблизительно 102%.
Небольшие процентные расхождения являются проблемой, когда я строю график или отображаю данные, это косметическая / визуальная проблема, когда на графиках отображаются итоговые значения> или <затем 100% </p>
Это то, чтоданные выглядят так:
d = {'Name': [US, US, US, CA], 'Weight': [1, 1, 1.0197, 0.0009], 'ETF': [SPY, IVV, VTI, VTI]}
df = pd.DataFrame(data=d)
df
Name Weight ETF
0 US 1 SPY
1 US 1 IVV
2 US 1.0197 VTI
3 CA 0.0009 VTI
Ниже я написал код, который пытается это исправить, но столкнулся с другой проблемой.Код, который я написал, рассматривает разницу между реальной суммой и 100%, а затем добавляет или вычитает эту разницу по всем значениям в списке, как показано ниже.Проблема в том, что, когда нужно вычесть процент, я получаю небольшие, но, тем не менее, отрицательные значения, что нежелательно.
def re_weight(df):
etfs= df['ETF'].unique()
for etf in etfs:
l = (df[df['ETF']==etf].shape)[0]
total = float(df[df['ETF']==etf]['Weight'].sum())
diff = 1-total
filler = diff/l
df.loc[df['ETF']==etf, 'Weight'] = df[df['ETF']==etf]['Weight']+filler
return df
countries = pd.read_csv('output\\countries.csv')
countries[['Weight','ETF']] = re_weight(countries[['Weight','ETF']])
Это результат вышеприведенного кода, теперь все равно 1, ноЯ застрял в определенных местах с отрицательными процентными значениями.
df = pd.DataFrame(data=d)
df
Name Weight ETF
0 US 1 SPY
1 US 1 IVV
2 US 1.0094 VTI
3 CA -0.0094 VTI
Как я могу отформатировать проценты так, чтобы они всегда составляли 100% и чтобы не было отрицательных значений?