Pandas data.frame,索引不正确

时间:2014-11-28 17:15:51

标签: python pandas dataframe

我从雅虎财经中提取数据,但我创建的data.frame将无法加载,因为我的索引不正确。

我知道我需要修理什么,我只是不知道如何:/

这是我的代码和错误:

from scipy import stats
import scipy as sp
import numpy as np
import pandas as pd
import datetime as datetime
from matplotlib.finance import quotes_historical_yahoo

ticker = 'IBM'
begdate = (1962,1,1)
enddate = (2013,11,22)

x = quotes_historical_yahoo(ticker, begdate, enddate, asobject = True, adjusted = True)

logret = np.log(x.aclose[1:] / x.aclose[:-1])
date = []
d0 = x.date

print len(logret)

for i in range(0, len(logret)):

    t1 = ''.join([d0[i].strftime("%Y"), d0[i].strftime("%m"), "01"])
    date.append(datetime.datetime.strptime(t1, "%Y%m%d"))
    y = pd.DataFrame(logret, date)
    retM = y.groupby(y.index).sum()

ret_Jan = retM[retM.index.month == 1]
ret_others = retM[retM.index.month != 1]
print sp.stats.bartlett(ret_Jan.values, ret_others.values)

错误来自这一行:

y = pd.DataFrame(logret, date)

并产生这个:

ValueError: Shape of passed values is (1, 13064), indices imply (1, 1)

我相信我需要将logret更改为列表? ......还是一个元组?

但是我使用元组(logret)或创建一个空列表进行转换并填充它的努力到目前为止还没有成功。

建议?

2 个答案:

答案 0 :(得分:2)

ValueError: Shape of passed values is (1, 13064), indices imply (1, 1)

表示您已经为pd.DataFrame提供了一系列长度为13064且索引长度为1,并要求它按索引索引该系列。实际上,这就是你所做的:date[]开始,然后你向它追加一个值,所以你传递给数据帧的索引只是一个单例列表。 / p>

我想你可能并不想在循环中创建DataFrame。

答案 1 :(得分:1)

我认为你进出Pandas对象会让你变得更加困难。如果你只是留在熊猫,这很简单。我想你需要做的就是:

import pandas.io.data as web
import datetime 

start = datetime.datetime(1962, 1, 1)
end = datetime.datetime(2013, 11, 22) 
f=web.DataReader("IBM", 'yahoo', start, end)
f['returns']    = log(f.Close/f.Close.shift(1)) 

ret_Jan = f.returns[f.index.month == 1]
ret_others = f.returns[f.index.month != 1]

print sp.stats.bartlett(ret_Jan, ret_others)

(122.77708966467267, 1.5602965581388475e-28)