用新的唯一索引重新索引pandas数据帧进行堆叠

2024-10-01 15:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个数据帧,如下所示:

In [2]: skew
Out[2]: 
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 96 entries, 2006-01-31 00:00:00 to 2013-12-31 00:00:00
Freq: BM
Data columns (total 3 columns):
AAPL    96  non-null values
GOOG    96  non-null values
MSFT    96  non-null values
dtypes: float64(3)

In [3]: skew.head()
Out[3]: 
                AAPL      GOOG      MSFT
2006-01-31  0.531769 -0.567731  2.132850
2006-02-28 -0.389711  0.028723  0.724277
2006-03-31  1.184884  1.009587 -0.959136
2006-04-28  1.664745  0.852869 -4.020731
2006-05-31 -0.419757 -0.288422  0.240444

In [5]: skew.index
Out[5]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2006-01-31 00:00:00, ..., 2013-12-31 00:00:00]
Length: 96, Freq: BM, Timezone: None

我想用一个唯一的索引生成它们的一个列,这样以后我就可以将它与其他数据帧中的列合并,看起来有点像这样,但是有一个唯一的索引:

^{pr2}$

例如,类似于:

^{3}$

代码是:

import pandas as pd 
import pandas.io.data as web



#Class parameters
names = ['AAPL','GOOG','MSFT']

# Functions
def get_px(stock, start, end):
    return web.get_data_yahoo(stock, start, end)['Close']

def getWinnerLoser(stock, medRet, retsM):
    return retsM[stock].shift(-1) >= medRet.shift(-1)

def getSkew( stock, rets, period):
return pd.rolling_skew(rets[stock],period).asfreq('BM').fillna(method='pad')

px = pd.DataFrame(data={n: get_px(n,'1/1/2006','1/1/2014') for n in names})
px = px.asfreq('B').fillna(method = 'pad')
rets = px.pct_change()

# Monthly returns and median return
retsM = px.asfreq('BM').fillna(method = 'pad').pct_change()
medRet = retsM.median(axis = 1)

# Dataframes
winLose = pd.DataFrame(data = {n: getWinnerLoser(n,medRet,retsM) for n in names})
skew = pd.DataFrame(data = {n: getSkew(n,rets,20) for n in names})

# Concatenating
retsMCon = pd.concat(retsM[n] for n in names)
winLoseCon = pd.concat(winLose[n] for n in names)
skewCon = pd.concat(skew[n] for n in names)

frame = pd.DataFrame({'Returns':retsMCon, 'Skew':skewCon, 'WinLose':winLoseCon})

我还没有找到一个好的解决办法


Tags: indataframepandasfordatareturnnamesstock

热门问题