2016-12-01 5 views
1

У меня возникли проблемы с ниже код:Python Pandas Bokeh Indexerror: индекс индекса вне диапазона - почему?

from bokeh.plotting import figure, output_file, show, save 
from bokeh.models import ColumnDataSource 
from bokeh.models import Range1d, LinearAxis 
import pandas as pd 
from pandas import HDFStore 
from bokeh.palettes import Spectral9 

store = pd.HDFStore('<hdf store location>') 
df = pd.DataFrame(store['d1']) 
df = df.rename_axis('Time') 
df.fillna(0) 

#the number of colums is the number of lines that we will make 
numlines = len(df.columns) 

#import colour pallet 
mypalette = Spectral9[0:numlines] 

# remove unwanted columns 
col_list = ['Col1', 'Col2', 'Col3'] 
df = df[col_list] 

# make the figure, 
p = figure(x_axis_type="datetime", title="<title>", width = 800, height = 450) 
p.xaxis.axis_label = 'Date' 
p.yaxis.axis_label = '<y axis label>' 

p.line(df.index, df['Col1'], legend = 'Col1', color = mypalette[0]) 
p.line(df.index, df['Col2'], legend = 'Col2', color = mypalette[1]) 

# add extra y axis 
p.extra_y_ranges = {'Col3': Range1d(start=0, end=1)} 
p.circle(df.index, df['Col3'], legend = 'Col3', color = mypalette[8], 
    y_range_name='Col3') 
p.add_layout(LinearAxis(y_range_name='Col3'), 'right') 


# creates an output file 
output_file('<output file location>') 

#save the plot 
save(p) 

Это то, что мой dataframe выглядит следующим образом:

Time    Col1  Col2  Col3  Col4 
29/11/2016 00:00 4  41  41  55 
29/11/2016 01:00 55  15  61  81 
29/11/2016 02:00 51  75  2   4 
29/11/2016 03:00 21  21  51  9 
etc. 

Когда я пытаюсь запустить код, приведенный выше, я получаю следующее сообщение об ошибке:

IndexError        Traceback (most recent call last) 
<ipython-input-20-9d2c8911130d> in <module>() 
38 
39 # add extra y axis 
---> 40 p.circle(df.index, df['Col3'], legend = 'Col3', color = mypalette[8], y_range_name='Col3') 
41 p.add_layout(LinearAxis(y_range_name='Col3'), 'right') 
42 

IndexError: list index out of range 

Я не могу понять, что я делаю неправильно. Может ли кто-нибудь помочь?

ответ

2

Следующие строки отображаются в верхней части вашего кода.

#the number of colums is the number of lines that we will make 
numlines = len(df.columns) 

#import colour pallet 
mypalette = Spectral9[0:numlines] 

В первой строке вы устанавливаете числовые линии, равные количеству столбцов, которые у вас есть. У вас всего 4 столбца в вашем кадре данных. Во второй строке вы устанавливаете mypalette равным первым N элементам Spectral9, где n - количество строк, которые у вас есть. Таким образом, ваша палитра ограничена первыми четырьмя элементами Spectral9.

Позже в вашем коде вы попытаетесь захватить девятый элемент mypalette (который будет [8] с нулевым индексированием в python).

p.circle(df.index, df['Col3'], legend = 'Col3', color = mypalette[8], 
    y_range_name='Col3') 

Вы ограничены mypalette иметь только 4 элементов, так mypalette [8] находится вне диапазона. Если вы хотите использовать этот конкретный цвет, вы можете использовать color = Spectral9[8] вместо color = mypalette[8].

+0

Perfect. Спасибо. – pottolom

 Смежные вопросы

  • Нет связанных вопросов^_^