2016-11-04 1 views
1

J'ai une trame de données qui stocke les valeurs de séries chronologiques dans un large tableau:Poids transversal dans une série chronologique dataframe

market_value = pd.DataFrame({'AAPL':[100,200,400], 'IBM':[50,100,200],'MSFT':[50,200,400]}, 
          index = ['2013-12-31', '2014-12-31', '2015-12-31']) 

In [1]: market_value 
Out [1]: 
      AAPL IBM MSFT 
2013-12-31 100  50  50 
2014-12-31 200 100  200 
2015-12-31 400 200  400 

Je veux calculer le poids transversal pour chaque stock à tout donné point de temps. Par exemple sur 2013-12-31, le poids de AAPL est:

100/(100+50+50) = 0.50 

Ainsi, le résultat devrait ressembler à ceci:

In [2]: weight 
Out [2]: 
      AAPL IBM MSFT 
2013-12-31 0.50 0.25 0.25 
2014-12-31 0.40 0.20 0.40 
2015-12-31 0.40 0.20 0.40 

En Matlab cela se fait par:

weight = market_value ./ repmat(sum(market_value,2), 1, 3) 

Quelle est la manière la plus élégante de faire cela en Python?

Répondre

1

Vous devez diviser par divsum par des rangées:

print (market_value.sum(axis=1)) 
2013-12-31  200 
2014-12-31  500 
2015-12-31 1000 
dtype: int64 

print (market_value.div(market_value.sum(axis=1), axis=0)) 
      AAPL IBM MSFT 
2013-12-31 0.5 0.25 0.25 
2014-12-31 0.4 0.20 0.40 
2015-12-31 0.4 0.20 0.40