簡體   English   中英

獲取等於100的百分比列表

[英]get list of percentages to equal 100

我有數據顯示一個國家持有ETF的權重。 問題在於數據源的權重差異較小。 例如,對於ETF VTI,所有百分比的總和(美國+加拿大)為1.026,這意味着總計約為102%。

當我繪制或顯示數據時,小的百分比差異是一個問題,當圖形顯示總計>或<然后是100%時,數據是一個外觀/視覺問題。

數據如下所示:

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%,並且沒有負值?

您可以在此處使用groupby.transform來獲取每行旁邊的“不正確”總和,然后除以該數量即可得到更正。 就像@ThierrLathuille在評論中建議的那樣:

print(df)
            Name  Weight  ETF
0  United States  1.0000  SPY
1  United States  1.0000  IVV
2  United States  1.0197  VTI
3         Canada  0.0009  VTI

應用上述邏輯

df['weight_recalc'] = df['Weight'] / df.groupby(['ETF']).Weight.transform('sum')
print(df)
            Name  Weight  ETF  weight_recalc
0  United States  1.0000  SPY       1.000000
1  United States  1.0000  IVV       1.000000
2  United States  1.0197  VTI       0.999118
3         Canada  0.0009  VTI       0.000882

顯示重新計算正確

print(df.groupby('ETF').weight_recalc.sum())
ETF
IVV    1.0
SPY    1.0
VTI    1.0
Name: weight_recalc, dtype: float64

您無需添加或減去某些內容,因為您可以通過此方法更改比例。

假設您有3個數據點:

US     40%
Canada 50%
Japan  30%

如您所見,總百分比為40 + 50 + 30 = 120%。

不同值之間的比例為:

US / Canada = 40/50 = 0.8
US / Japan = 40/30 = 1.33333
Canada / Japan = 50/30 = 1.66666

現在,我們得到120-100 = 20,並從每個數據點中減去它的1/3,我們將得到:

US    33.33333
Canada  43.33333
Japan 23.33333

現在的比例是:

US / Canada = 33.3333/43.33333 = 0.769
US / Japan = 33.3333/23.3333 = 1.428
Canada / Japan = 43.33333/23.33333 = 1.857

看到? 蛋白質的變化是無法預測的。

因此,為了使其正確無誤,您只需要調整數據規模即可。

1)匯總所有值:

30 + 40 + 50 = 120

2)將100除以求和結果:100/120 = 0.83333333

3)將每個值乘以先前的結果(在這種情況下為0.8333333):

在此示例中,我們將獲得:

US     33.33333
Canada 41.66666
Japan  25

您可以檢查,但我告訴您,在這種情況下,比例沒有變化,並且總和現在等於100(經過四舍五入)

用偽代碼(我對熊貓數學庫沒有太多經驗):

s = sum(df['ETF'])
df['ETF'] = df['ETF'] * 100 / s

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM