时间序列数据框中的横截面权重

时间:2016-11-04 11:15:16

标签: python pandas dataframe transformation

我有一个数据框,可以在一个宽表格中存储时间序列值:

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

我想在任何给定的时间点计算每种原料的横截面重量。例如,在2013-12-31,AAPL的权重是:

100 / (100+50+50) = 0.50

所以结果应该是这样的:

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

在Matlab中,这是通过以下方式完成的:

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

在Python中执行此操作的最优雅方式是什么?

1 个答案:

答案 0 :(得分:1)

您需要按行div sum除以:

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