2016-01-24 24 views
7

Sto cercando di utilizzare Bokeh per tracciare un dataframe Pandas con una colonna DateTime contenente anni e uno numerico. Se DateTime è specificato come x, il comportamento è il previsto (anni nell'asse x). Tuttavia, se io uso set_index per trasformare la colonna DateTime nell'indice del dataframe e quindi specificare solo il nel TimeSeries ottengo il tempo in millisecondi nell'asse x. Un esempio minimoTimeSeries in Bokeh utilizzando un dataframe con indice

import pandas as pd 
import numpy as np 
from bokeh.charts import TimeSeries, output_file, show 

output_file('fig.html') 
test = pd.DataFrame({'datetime':pd.date_range('1/1/1880', periods=2000),'foo':np.arange(2000)}) 
fig = TimeSeries(test,x='datetime',y='foo') 
show(fig) 

output_file('fig2.html') 
test = test.set_index('datetime') 
fig2 = TimeSeries(test,y='foo') 
show(fig2) 

È questo il comportamento previsto o un bug? Mi aspetterei la stessa immagine con entrambi gli approcci.

Saluti !!

+0

Questo sembra incoerente anche a me. È interessante notare che, dopo la riga 'fig2 = TimeSeries (test, y = 'foo')', 'test' è stata modificata per includere sia un indice con i dati' datetime' sia una nuova colonna chiamata 'index'. È un po 'sorprendente che il semplice tracciamento di un frame di dati altererebbe i dati. – Jake

+0

Buona presa, non l'avevo notato. Ho appena segnalato questo come [un problema] (https://github.com/bokeh/bokeh/issues/3763). – manu

risposta

0

Bokeh utilizzato per aggiungere un indice per motivi interni ma a partire da versioni non recenti (> = 0,12.x) non lo fa più. Inoltre vale la pena notare che l'API bokeh.charts è stata deprecata e rimossa. Il codice equivalente utilizzando la stalla bokeh.plotting API produce il risultato atteso:

import pandas as pd 
import numpy as np 
from bokeh.plotting import figure, output_file, show 
from bokeh.layouts import row 

output_file('fig.html') 

test = pd.DataFrame({'datetime':pd.date_range('1/1/1880', periods=2000),'foo':np.arange(2000)}) 

fig = figure(x_axis_type="datetime") 
fig.line(x='datetime',y='foo', source=test) 

test = test.set_index('datetime') 

fig2 = figure(x_axis_type="datetime") 
fig2.line(x='datetime', y='foo', source=test) 
show(row(fig, fig2)) 

enter image description here

Problemi correlati