簡體   English   中英

如何在python的數據框中獲取函數(def)輸出並合並多個數據框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM