Как заставить bokeh пропускать отсутствующие даты при использовании datetime как оси x

Я рассматриваю пример подсвечника в документах bokeh, которые можно найти здесь:

https://github.com/ContinuumIO/bokeh/blob/master/examples/plotting/file/candlestick.py

и я пытаюсь найти хороший способ устранить «пробелы» по оси х, где нет данных.

В частности, для финансовых данных, таких как MSFT, используемых в примере, нет данных для выходных и праздничных дней. Есть ли способ сказать bokeh не оставлять пустое место на диаграмме, когда нет данных для даты?

Ниже приведена вставка примера кода, найденного по приведенной выше ссылке:

from math import pi import pandas as pd from bokeh.sampledata.stocks import MSFT from bokeh.plotting import * df = pd.DataFrame(MSFT)[:50] df['date'] = pd.to_datetime(df['date']) mids = (df.open + df.close)/2 spans = abs(df.close-df.open) inc = df.close > df.open dec = df.open > df.close w = 12*60*60*1000 # half day in ms output_file("candlestick.html", title="candlestick.py example") figure(x_axis_type = "datetime", tools="pan,wheel_zoom,box_zoom,reset,previewsave", width=1000, name="candlestick") hold() segment(df.date, df.high, df.date, df.low, color='black') rect(df.date[inc], mids[inc], w, spans[inc], fill_color="#D5E1DD", line_color="black") rect(df.date[dec], mids[dec], w, spans[dec], fill_color="#F2583E", line_color="black") curplot().title = "MSFT Candlestick" xaxis().major_label_orientation = pi/4 grid().grid_line_alpha=0.3 show() # open a browser 

  • Приложение Python Flask с интерактивными графиками Bokeh
  • и {} vs list () и dict (), что лучше?
  • Изучение Python из PHP
  • Python argparse: как вставить новую строку в текст справки в подпараллеле?
  • Сгенерировать все возможные комбинации из списка int под лимитом
  • Статические файлы в OpenShift Django
  • Создание динамического / времени выполнения (генерация кода) в Python
  • Одновременное выполнение двух функций
  • 2 Solutions collect form web for “Как заставить bokeh пропускать отсутствующие даты при использовании datetime как оси x”

    ОБНОВЛЕНИЕ: Начиная с Bokeh 0.12.6 вы можете указать переопределения для основных меток на осях.

     import pandas as pd from bokeh.io import show, output_file from bokeh.plotting import figure from bokeh.sampledata.stocks import MSFT df = pd.DataFrame(MSFT)[:50] inc = df.close > df.open dec = df.open > df.close p = figure(plot_width=1000, title="MSFT Candlestick with Custom X-Axis") # map dataframe indices to date strings and use as label overrides p.xaxis.major_label_overrides = { i: date.strftime('%b %d') for i, date in enumerate(pd.to_datetime(df["date"])) } # use the *indices* for x-axis coordinates, overrides will print better labels p.segment(df.index, df.high, df.index, df.low, color="black") p.vbar(df.index[inc], 0.5, df.open[inc], df.close[inc], fill_color="#D5E1DD", line_color="black") p.vbar(df.index[dec], 0.5, df.open[dec], df.close[dec], fill_color="#F2583E", line_color="black") output_file("custom_datetime_axis.html", title="custom_datetime_axis.py example") show(p) 

    введите описание изображения здесь

    Если у вас очень большое количество дат, этот подход может стать громоздким, и пользовательское расширение может стать необходимым.

    ОБНОВЛЕНИЕ 2016-05-26:

    некоторые детали интерфейса BokehJS изменились. Для Bokeh 0.11 и новее __implementation__ теперь должно быть:

     __implementation__ = """ _ = require "underscore" Model = require "model" p = require "core/properties" class DateGapTickFormatter extends Model type: 'DateGapTickFormatter' doFormat: (ticks) -> date_labels = @get("date_labels") return (date_labels[tick] ? "" for tick in ticks) @define { date_labels: [ p.Any ] } module.exports = Model: DateGapTickFormatter """ 

    Ожидается, что это не изменится.

    2016-02-09

    Запрос на растяжение 3314 был составлен для примера, который работает в 2015-12-05 годах. Исходный код здесь . Документация для примера подсвечника по-прежнему показывает тот же код, что и OP в вопросе.

    Включено ниже для справки.

     from math import pi import pandas as pd from bokeh.sampledata.stocks import MSFT from bokeh.plotting import figure, show, output_file from bokeh.models.formatters import TickFormatter, String, List # In this custom TickFormatter, xaxis labels are taken from an array of date # Strings (eg ['Sep 01', 'Sep 02', ...]) passed to the date_labels property. class DateGapTickFormatter(TickFormatter): date_labels = List(String) __implementation__ = """ _ = require "underscore" HasProperties = require "common/has_properties" class DateGapTickFormatter extends HasProperties type: 'DateGapTickFormatter' format: (ticks) -> date_labels = @get("date_labels") return (date_labels[tick] ? "" for tick in ticks) module.exports = Model: DateGapTickFormatter """ df = pd.DataFrame(MSFT)[:50] # xaxis date labels used in the custom TickFormatter date_labels = [date.strftime('%b %d') for date in pd.to_datetime(df["date"])] mids = (df.open + df.close)/2 spans = abs(df.close-df.open) inc = df.close > df.open dec = df.open > df.close w = 0.5 output_file("custom_datetime_axis.html", title="custom_datetime_axis.py example") TOOLS = "pan,wheel_zoom,box_zoom,reset,save" p = figure(tools=TOOLS, plot_width=1000, toolbar_location="left") # Using the custom TickFormatter. You must always define date_labels p.xaxis[0].formatter = DateGapTickFormatter(date_labels = date_labels) # x coordinates must be integers. If for example df.index are # datetimes, you should replace them with a integer sequence p.segment(df.index, df.high, df.index, df.low, color="black") p.rect(df.index[inc], mids[inc], w, spans[inc], fill_color="#D5E1DD", line_color="black") p.rect(df.index[dec], mids[dec], w, spans[dec], fill_color="#F2583E", line_color="black") p.title = "MSFT Candlestick with custom x axis" p.xaxis.major_label_orientation = pi/4 p.grid[0].ticker.desired_num_ticks = 6 show(p) # open a browser 

    Из-за кода, использующего индекс dataframe , ваши данные должны быть отсортированы в порядке возрастания даты. Если у вас есть временной ряд в порядке убывания даты, он может быть отменен для использования вышеуказанным кодом с:

     df.sort_values(by='date', inplace=True) df.reset_index(drop=True, inplace=True) 
    Python - лучший язык программирования в мире.