[英]How to get a function (def) output in a data frame in python and merge multiple data frames
我有這段代碼可以使用股票價格計算最大跌幅。
#max drawdown function code...
def max_drawdown(X):
mdd = 0
peak = X[0]
for x in X:
if x > peak:
peak = x
dd = (x - peak) / peak
if dd < mdd
mdd = dd
return mdd
我使用以下函數顯示縮編
#shows max drawdown
stocks_prices.xs(key='close',axis=1,level='Stock Info').apply(max_drawdown)
如果你想看到股票價格的頭
Ticker NOW BBY NOW Return BBY Return
Stock Info open high low close volume open high low close volume
date
2013-09-30 52.10 52.34 51.170 51.95 1383145 31.9605 32.3721 31.8061 32.1577 3826963 NaN NaN
2013-10-01 51.60 51.89 50.610 51.49 1288635 32.2092 32.7923 32.1834 32.5436 3607267 -0.008855 0.012000
2013-10-02 51.35 52.42 51.215 52.27 1158196 32.2606 32.4750 31.9005 32.2949 2990664 0.015149 -0.007642
2013-10-03 52.39 52.90 51.560 52.15 1512797 32.4236 32.5093 31.6089 32.3206 3413673 -0.002296 0.000796
2013-10-04 53.09 55.46 52.810 54.43 1688824 32.3206 32.9724 31.9862 32.7151 3311713 0.043720 0.012206
輸出是
Ticker
NOW -0.476164
BBY -0.485378
dtype: float64
由於計算在函數內部,因此如何在數據框中輸入輸出。 我無法使用以下代碼從drawdown函數的輸出中創建數據框
mdd = mdd.to_frame('Maximum Drawdown')
mdd.index.name = 'Ticker'
mdd = mdd.reset_index()
我有一些像
Ticker Sharpe
0 NOW 8.061887
1 BBY 7.174034
Ticker Var
0 NOW -0.1
1 BBY 0.2
我如何將所有這些數據幀合並為一個,以便可以從報價器開始然后導出到excel值
因此,例如,我希望輸出為
Ticker Var Sharpe Ratio
0 NOW -0.1 0.5
1 BBY 0.2 0.3
請在這兩個方面都提供幫助,非常感謝
因此,從您的代碼開始:
mdd = stocks_prices.xs(key='close',axis=1,level='Stock Info').apply(max_drawdown)
mdd
系列看起來像:
Ticker
NOW -0.008855
BBY -0.007642
dtype: float64
您可能有不同的數字。
不確定是否要在stocks_prices
-如果這樣做,可以這樣:
最簡單的方法是創建一個新列
stocks_prices[ 'NOW mdd' ] = float('NaN')
並在DataFrame中獲取最后一天:
last_day = stocks_prices.index[-1]
對我來說是2013-10-04
但我認為您的行數更多。 無論如何,現在將其粘貼到列NOW mdd
的最后一行:
stocks_prices.loc[ last_day, 'NOW mdd' ] = mdd[ 'NOW' ]
所以我的stocks_prices
看起來像:
Ticker NOW BBY NOW Return BBY Return NOW mdd
Stock Info open high low close open high low close
2013-09-30 50.95 NaN NaN 51.95 31.1577 NaN NaN 32.1577 NaN NaN NaN
2013-10-01 50.49 NaN NaN 51.49 31.5436 NaN NaN 32.5436 -0.008855 0.012000 NaN
2013-10-02 51.27 NaN NaN 52.27 31.2949 NaN NaN 32.2949 0.015149 -0.007642 NaN
2013-10-03 51.15 NaN NaN 52.15 31.3206 NaN NaN 32.3206 -0.002296 0.000796 NaN
2013-10-04 53.43 NaN NaN 54.43 31.7151 NaN NaN 32.7151 0.043720 0.012206 -0.008855
將DataFrame放在一起通常是在諸如Ticker
的通用密鑰上完成的。
所以sharpe
數據幀:
Sharpe Ticker
0 8.061887 NOW
1 7.174034 BBY
和var
DataFrame:
Ticker Var
0 NOW -0.1
1 BBY 0.2
可以合並
result = sharpe.merge( var, on='Ticker', suffixes=('','') )
給
Sharpe Ticker Var
0 8.061887 NOW -0.1
1 7.174034 BBY 0.2
如果要將mdd
合並到其中,可以先將mdd
轉換為DataFrame:
result2 = result.merge( mdd.to_frame('mdd'), on='Ticker', suffixes=('','') )
給
Sharpe Ticker Var mdd
0 8.061887 NOW -0.1 -0.008855
1 7.174034 BBY 0.2 -0.007642
順便說一句,您可以更改max_drawdown
函數以輸出列表,例如
def max_drawdown2(X):
mdd = 0
peak = X[0]
values = [] # <-- NEW LINE
for x in X:
if x > peak:
peak = x
dd = (x - peak) / peak
if dd < mdd:
mdd = dd
values.append( mdd ) # <-- NEW LINE
return values # <-- NEW LINE
stocks_prices[ 'NOW mdd' ] = max_drawdown2( stocks_prices.loc[ :, ('NOW','close') ] )
要得到
Ticker NOW BBY NOW Return BBY Return NOW mdd
Stock Info open high low close open high low close
2013-09-30 50.95 NaN NaN 51.95 31.1577 NaN NaN 32.1577 NaN NaN 0.000000
2013-10-01 50.49 NaN NaN 51.49 31.5436 NaN NaN 32.5436 -0.008855 0.012000 -0.008855
2013-10-02 51.27 NaN NaN 52.27 31.2949 NaN NaN 32.2949 0.015149 -0.007642 -0.008855
2013-10-03 51.15 NaN NaN 52.15 31.3206 NaN NaN 32.3206 -0.002296 0.000796 -0.008855
2013-10-04 53.43 NaN NaN 54.43 31.7151 NaN NaN 32.7151 0.043720 0.012206 -0.008855
注意.loc[ :, ('NOW','close') ]
使用:
讓所有的日期,然后('NOW','close')
被越來越Ticker
然后Stock Info
水平
可以使用相同的(Ticker, close)
語法來添加子列:
stocks_prices[ ('NOW', 'mdd' ) ] = max_drawdown2( stocks_prices.loc[ :, ('NOW','close') ] )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.