如何在python中获得数据帧中的函数(def)输出并合并多个数据帧
我有这段代码,它使用股票价格计算最大提款如何在python中获得数据帧中的函数(def)输出并合并多个数据帧,python,Python,我有这段代码,它使用股票价格计算最大提款 #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
#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
如果你想看到股票价格主管的话,那就是
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
如何将所有这些数据框合并为一个,以便从ticker值开始导出到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
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
你可能有不同的号码
不确定您是否希望在股票价格中使用该功能-如果需要,请按以下方式操作:
最简单的方法是创建一个新列
stocks_prices[ 'NOW mdd' ] = float('NaN')
并获取数据框中的最后一天:
last_day = stocks_prices.index[-1]
Sharpe Ticker
0 8.061887 NOW
1 7.174034 BBY
Ticker Var
0 NOW -0.1
1 BBY 0.2
这对我来说是2013-10-04
,但我认为你有更多的行。无论如何,请将其粘贴到列的最后一行NOW mdd
:
stocks_prices.loc[ last_day, 'NOW mdd' ] = mdd[ 'NOW' ]
因此,我的股票价格看起来像:
Ticker
NOW -0.008855
BBY -0.007642
dtype: float64
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
合并
将数据帧放在一起通常是在一个公共键上完成的,如Ticker
所以一个sharpe
数据帧:
last_day = stocks_prices.index[-1]
Sharpe Ticker
0 8.061887 NOW
1 7.174034 BBY
Ticker Var
0 NOW -0.1
1 BBY 0.2
和var
数据帧:
last_day = stocks_prices.index[-1]
Sharpe Ticker
0 8.061887 NOW
1 7.174034 BBY
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
Sharpe Ticker Var mdd
0 8.061887 NOW -0.1 -0.008855
1 7.174034 BBY 0.2 -0.007642
如果我们想将mdd
合并到其中,我们可以首先将mdd
转换为数据帧:
result2 = result.merge( mdd.to_frame('mdd'), on='Ticker', suffixes=('','') )
给予
Sharpe Ticker Var
0 8.061887 NOW -0.1
1 7.174034 BBY 0.2
Sharpe Ticker Var mdd
0 8.061887 NOW -0.1 -0.008855
1 7.174034 BBY 0.2 -0.007642
连续最大降深
顺便说一句,你可以改变你的max\u dradown
功能,输出一个列表,例如
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') ] )
请注意,.loc[:,('NOW','close')]
正在使用:
获取所有日期,然后('NOW','close')
通过股票行情
获取股票信息
可以使用相同的(Ticker,close)
语法来添加子列:
stocks_prices[ ('NOW', 'mdd' ) ] = max_drawdown2( stocks_prices.loc[ :, ('NOW','close') ] )
感谢您将数据帧连接在一起-您看到了吗?谢谢jamesj629。我来看看。其他部分有指针吗?还不清楚你的max_drawdown函数在做什么-你能调整格式吗?嗨,詹姆斯,谢谢你指出格式错误。请让我知道,如果你可以给任何关于创建数据帧(类似于其他我已经创建)的下拉功能感谢詹姆斯,工作良好的指针。也能够计算每日的水位下降。你知道如何计算复合年增长率吗?因此,基本上每个股票的收盘价=应该是(最后一个/开始)^(365/列长)-1我可以晚一点看,但股票价格。指数[-1]是最后一个指数,股票价格。指数[0]将是第一个指数-试试看-你所需要的就是上面的股票价格.xs(key='close',axis=1,level='stock Info')。应用(lambda s:(s.iloc[-1]/s.iloc[0])**(365.0/len))