试用这段代码:
f2 = []
for i in symb_list:
f2.append(earnings_vola(i))
使索引超出界限错误。 symb_list的示例:
symb_list
Out[143]:
['MTMC',
'ANCI',
'TPLM',
'BERK',
'DGI',
'QLTY',
'GST',
'AGEN',
'NURO',
earnings_vola(i)返回浮动
UPD。对不起,我的新用户在这里。
def earnings_vola (symbol):
price_b = marketdata.ext.load_metotron('%s'%symbol)
price = price_b.sort()
d = pickle.load(open('/home/mad/Appr/data_%s.pickle'%(symbol), 'rb'))
df = h.to_df(d)
if df['timetype'][2]=='After Close':
price['VOLA'] = (price.shift(-1)['C']-price['C'])/price['C']*100
else:
price['VOLA'] = (price['C']-price.shift(+1)['C'])/price['C']*100
x1 = pa.Series(sorted(df['Date_p']))
px = price.reindex(x1, method='ffill')
avg_vola = np.mean(px['VOLA'])
return avg_vola
UPD2
> IndexError Traceback (most recent call
> last) <ipython-input-144-f3de6042c223> in <module>()
> 1 f2 = []
> 2 for i in symb_list:
> ----> 3 f2.append(earnings_vola(i))
>
> <ipython-input-123-96f164ec1ad9> in earnings_vola(symbol)
> 4 d = pickle.load(open('/home/mad/Appr/data_%s.pickle'%(symbol), 'rb'))
> 5 df = h.to_df(d)
> ----> 6 if df['timetype'][2]=='After Close':
> 7 price['VOLA'] = (price.shift(-1)['C']-price['C'])/price['C']*100
> 8 else:
>
> /usr/local/lib/python2.7/dist-packages/pandas/core/series.pyc in
> __getitem__(self, key)
> 616 def __getitem__(self, key):
> 617 try:
> --> 618 return self.index.get_value(self, key)
> 619 except InvalidIndexError:
> 620 pass
>
> /usr/local/lib/python2.7/dist-packages/pandas/core/index.pyc in
> get_value(self, series, key)
> 728
> 729 try:
> --> 730 return tslib.get_value_box(series, key)
> 731 except IndexError:
> 732 raise
>
> /usr/local/lib/python2.7/dist-packages/pandas/tslib.so in
> pandas.tslib.get_value_box (pandas/tslib.c:8534)()
>
> /usr/local/lib/python2.7/dist-packages/pandas/tslib.so in
> pandas.tslib.get_value_box (pandas/tslib.c:8378)()
>
> IndexError: index out of bounds
** UPD3 结果earnings_vola(符号)函数的示例:
earnings_vola(symbol='MSFT')
0.080011249349832989**
我需要迭代符号列表(上面的示例)并获取列表中的所有结果
答案 0 :(得分:0)
问题来自这一行:
if df['timetype'][2]=='After Close':
而且它抱怨df['timetype']
是一个只包含0,1或2个项目的序列,但是你要求第三个。
这可能是我们所做的那种愚蠢的错字,你不小心写了2
而不是1
,或者忘了Python序列使用从0开始的索引。
但如果没有,如果你真的希望df['timetype']
有3个或更多的值而它没有,我们需要知道你期望它拥有什么值,为什么,以及它的值是什么? >实际上有。
您只需在代码中添加一行并再次运行即可开始调试:
df = h.to_df(d)
print(df['timetype']) # NEW CODE
if df['timetype'][2]=='After Close':
如果结果与预期不符,请尝试打印df
本身,或d
或h
等,直到找到第一个出错的地方。
在某些时候,你会发现第一步返回的值与你预期的不同。你可能仍然不知道为什么它返回一个不同的值 - 但在那时,你有一个更容易的问题让StackOverflow回答。
答案 1 :(得分:0)
更改此代码
if df['timetype'][2]=='After Close':
price['VOLA'] = (price.shift(-1)['C']-price['C'])/price['C']*100
到此代码(显式,正确和可读)
key = 'timetype'
value = df[key] if df and key in df else None
kw = value[2] if value and len(value) > 2 and value[2]=='After Close' else None
if kw:
price['VOLA'] = (price.shift(-1)['C']-price['C'])/price['C']*100