[英]Python Pandas mean and weighted Average
我是python熊貓的新手。 任何幫助都感激不盡
這是我的原始數據:
Feed Close Sector Market_Cap
Date
2015-09-18 A 5.60 Property 50
2015-09-21 A 5.60 Property 20
2015-09-23 A 5.60 Property 30
2015-09-18 ABC 0.67 Property 50
2015-09-21 ABC 0.66 Property 80
2015-09-18 DA 0.67 Mining 65
2015-09-21 KK 1.66 Mining 80
我想得到的是:
1創建一個新的列調用均值以計算每個提要的平均市值。
2查找加權平均值。
This is what I want:
Feed Close Sector Market_Cap Mean Sector_WeightedAvg
Date
2015-09-18 A 5.60 Property 50 33.33 33.33/(33.33+65)
2015-09-21 A 5.60 Property 20 33.33 33.33/(33.33+65)
2015-09-23 A 5.60 Property 30 33.33 33.33/(33.33+65)
2015-09-18 ABC 0.67 Property 50 65 65/(33.33+65)
2015-09-21 ABC 0.66 Property 80 65 65/(33.33+65)
2015-09-18 DA 0.67 Mining 65 62 62/(62+80)
2015-09-21 KK 1.66 Mining 80 80 80/(62+80)
這是我目前獲得的NaN均值代碼:
df3= pd.DataFrame(df3)
df3['Mean'] = df3.groupby(by=['Sector'])[ Market_Cap].mean()
Feed Close Sector Market_Cap Mean
Date
2015-09-18 A 5.60 Property 50 NaN
2015-09-21 A 5.60 Property 20 NaN
2015-09-23 A 5.60 Property 30 NaN
2015-09-18 ABC 0.67 Property 50 NaN
對於加權平均代碼:
df2['WeightedAverage'] =df3[ Market_Cap].value /df3['Mean'].value
我得到了錯誤:
AttributeError:“系列”對象沒有屬性“值”
IIUC可以使用transform
和mean
。
Weighted Average
是柱Mean
通過柱的唯一值的總和除以Mean
和df3
是由列組Sector
。
print df3
Feed Close Sector Market_Cap
Date
2015-09-18 A 5.60 Property 50
2015-09-21 A 5.60 Property 20
2015-09-23 A 5.60 Property 30
2015-09-18 ABC 0.67 Property 50
2015-09-21 ABC 0.66 Property 80
2015-09-18 DA 0.67 Mining 65
2015-09-21 KK 1.66 Mining 80
df3['Mean'] = df3.groupby(by=['Feed'])['Market_Cap'].transform('mean')
df3['WeightedAverage'] = df3['Mean'] / df3.groupby(by=['Sector'])[ 'Mean'].transform(lambda x: sum(x.unique()))
print df3
Feed Close Sector Market_Cap Mean WeightedAverage
Date
2015-09-18 A 5.60 Property 50 33.333333 0.338983
2015-09-21 A 5.60 Property 20 33.333333 0.338983
2015-09-23 A 5.60 Property 30 33.333333 0.338983
2015-09-18 ABC 0.67 Property 50 65.000000 0.661017
2015-09-21 ABC 0.66 Property 80 65.000000 0.661017
2015-09-18 DA 0.67 Mining 65 65.000000 0.448276
2015-09-21 KK 1.66 Mining 80 80.000000 0.551724
嘗試組合transform('sum'),表示
In [5]: df
Out[5]:
Close Feed Market_Cap Sector
0 5.60 A 50 Property
1 5.60 A 20 Property
2 5.60 A 30 Property
3 0.67 ABC 50 Property
4 0.66 ABC 80 Property
5 0.67 DA 65 Mining
6 1.66 KK 80 Mining
In [6]: g = df.groupby(['Sector', 'Feed'])
..
In [7]: c = g.Market_Cap.mean()
In [8]: c
Out[8]:
Sector Feed
Mining DA 65.000000
KK 80.000000
Property A 33.333333
ABC 65.000000
Name: Market_Cap, dtype: float64
In [9]: d = c.groupby(level=0).transform('sum')
In [10]: d
Out[10]:
Sector Feed
Mining DA 145.000000
KK 145.000000
Property A 98.333333
ABC 98.333333
dtype: float64
..
In [11]: df['Mean'] = df.apply(lambda x: c[x.Sector, x.Feed], axis=1)
In [12]: df['Weighted_Avg'] = df.apply(lambda x: c[x.Sector, x.Feed] / d[x.Sector, x.Feed], axis=1)
In [13]: df
Out[13]:
Close Feed Market_Cap Sector Mean Weighted_Avg
0 5.60 A 50 Property 33.333333 0.338983
1 5.60 A 20 Property 33.333333 0.338983
2 5.60 A 30 Property 33.333333 0.338983
3 0.67 ABC 50 Property 65.000000 0.661017
4 0.66 ABC 80 Property 65.000000 0.661017
5 0.67 DA 65 Mining 65.000000 0.448276
6 1.66 KK 80 Mining 80.000000 0.551724
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.