2017-01-02 52 views
4

我在這樣的數據框中多天收盤了多個股票的收盤價。一次使用大熊貓的多個股票的收益

In [67]: df 
Out[67]: 
      Date Symbol Close 
0 12/30/2016 AMZN 749.87 
1 12/29/2016 AMZN 765.15 
2 12/28/2016 AMZN 772.13 
3 12/27/2016 AMZN 771.40 
4 12/30/2016 GOOGL 792.45 
5 12/29/2016 GOOGL 802.88 
6 12/28/2016 GOOGL 804.57 
7 12/27/2016 GOOGL 805.80 
8 12/30/2016 NFLX 123.80 
9 12/29/2016 NFLX 125.33 
10 12/28/2016 NFLX 125.89 
11 12/27/2016 NFLX 128.35 

我想用熊貓計算這些股票的每日回報。輸出應該是這樣的:

  Date Symbol  Return 
0 12/27/2016 AMZN  NaN 
1 12/28/2016 AMZN 0.000946 
2 12/29/2016 AMZN -0.009040 
3 12/30/2016 AMZN -0.019970 
4 12/27/2016 GOOGL  NaN 
5 12/28/2016 GOOGL -0.001526 
6 12/29/2016 GOOGL -0.002101 
7 12/30/2016 GOOGL -0.012991 
8 12/27/2016 NFLX  NaN 
9 12/28/2016 NFLX -0.019166 
10 12/29/2016 NFLX -0.004448 
11 12/30/2016 NFLX -0.012208 

我得到了上面的輸出使用下面的代碼,但我覺得這可以進一步簡化。

In [70]: rtn = df.pivot("Date", "Symbol", "Close").pct_change().reset_index() 
In [73]: pd.melt(rtn, id_vars='Date', value_vars=list(rtn.columns[1:]),var_name='Symbol',value_name='Return') 

回答

3

您可以使用sort_valuesgroupbyDataFrameGroupBy.pct_change

df = df.sort_values(['Symbol','Date']).reset_index(drop=True) 
df['Return'] = df.groupby('Symbol')['Close'].pct_change() 
print (df) 
      Date Symbol Close Return 
0 12/27/2016 AMZN 771.40  NaN 
1 12/28/2016 AMZN 772.13 0.000946 
2 12/29/2016 AMZN 765.15 -0.009040 
3 12/30/2016 AMZN 749.87 -0.019970 
4 12/27/2016 GOOGL 805.80  NaN 
5 12/28/2016 GOOGL 804.57 -0.001526 
6 12/29/2016 GOOGL 802.88 -0.002101 
7 12/30/2016 GOOGL 792.45 -0.012991 
8 12/27/2016 NFLX 128.35  NaN 
9 12/28/2016 NFLX 125.89 -0.019166 
10 12/29/2016 NFLX 125.33 -0.004448 
11 12/30/2016 NFLX 123.80 -0.012208 
1

您可以​​和unstack這將整理你的指數你,然後pct_changestack回。

print(
    df.set_index(['Date', 'Symbol']) 
     .Close.unstack().pct_change() 
     .stack(dropna=False).reset_index(name='Return') 
     .sort_values(['Symbol', 'Date']) 
     .reset_index(drop=True) 
) 


     Date Symbol Return 
0 2016-12-27 AMZN  NaN 
1 2016-12-28 AMZN 0.000946 
2 2016-12-29 AMZN -0.009040 
3 2016-12-30 AMZN -0.019970 
4 2016-12-27 GOOGL  NaN 
5 2016-12-28 GOOGL -0.001526 
6 2016-12-29 GOOGL -0.002101 
7 2016-12-30 GOOGL -0.012991 
8 2016-12-27 NFLX  NaN 
9 2016-12-28 NFLX -0.019166 
10 2016-12-29 NFLX -0.004448 
11 2016-12-30 NFLX -0.012208 
+0

'stack(dropna = False)' –

+0

謝謝你的檢查 – piRSquared