簡體   English   中英

python索引越界錯誤

[英]python index out of bounds error

試試這段代碼:

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 結果收益_vola(symbol) 函數示例:

earnings_vola(symbol='MSFT')
0.080011249349832989**

我需要迭代符號列表(上面的示例)並在列表中獲取所有結果

問題來自這一行:

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本身,或dh等,直到找到出錯的第一個地方。

在某些時候,您會發現第一步返回的值與您預期的不同。 您可能仍然不知道為什么它會返回不同的值——但此時,您有一個更容易讓 StackOverflow 回答的問題。

更改此代碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM