2016-08-05 106 views
1

我想计算这两家公司的年度业绩(作为市场价值的变化),这两家公司的数据存储在下面的数据框中。计算大熊猫的股票收益DataFrame

df = pd.DataFrame({'tic'  : ['AAPL', 'AAPL', 'AAPL', 'GOOGL','GOOGL','GOOGL'], 
        'mktvalue' : [20,25,30,50,55,60], 
        'fyear' : [2014,2015,2016,2014,2015,2016]}) 

我已经看到类似的解决方案lambda函数,但直到现在我无法适应它我的数据。我想到这样一个解决方案来计算基于年度业绩:

df['performance'] = df.fyear.apply(lambda x: (df.mktvalue[(df['fyear'] == 2014)])/
        (df.mktvalue[(df['fyear'] == 2013)]) if x == 2014 
        else (df.mktvalue[(df['fyear'] == 2013)])/    
        (df.mktvalue[(df['fyear'] == 2013)]) 

我的一个主要问题是,在调用

(df.mktvalue[(df['fyear'] == 2013)]) 

我收到的所有市场价值时,在执行2013年,而不是只有相应的这家公司。

我将不胜感激任何帮助!

+0

不管你的问题的,在'else'分支,'(df.mktvalue [(DF [ 'fyear'] == 2013)])/(df.mktvalue [(DF [ 'fyear'] == 2013)])'将始终返回1.是你想要的吗? – IanS

回答

0

是你想要的吗?

In [129]: df['performance'] = df.groupby('tic').mktvalue.pct_change().fillna(0) 

In [130]: df 
Out[130]: 
    fyear mktvalue tic performance 
0 2014  20 AAPL  0.000000 
1 2015  25 AAPL  0.250000 
2 2016  30 AAPL  0.200000 
3 2014  50 GOOGL  0.000000 
4 2015  55 GOOGL  0.100000 
5 2016  60 GOOGL  0.090909 
+0

并不完全一样,因为我希望三年内只能针对AAPL的百分比变化,以及三年期间只针对GOOGL的百分比变化。所以对于AAPL,我需要0(20/20-1),0.25(25/20-1),0.2(30/25-1)和GOOGL 0(50/50-1),0.1(55/1),0.09(60/55-1) – DaveL

+0

@DaveL,请检查更新的答案 – MaxU

+0

这正是我正在寻找的,非常感谢你! – DaveL