我从雅虎财经中提取数据,但我创建的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)或创建一个空列表进行转换并填充它的努力到目前为止还没有成功。
建议?
答案 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)