Проблемы зависимости с сюжетом и чертой питона - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь построить панель инструментов в python, используя plotly и dash, которые будут использовать ползунок для изменения диапазона (оси X) графика.Ось X содержит даты.

Я следую примеру ползунка на веб-сайте plotly (https://dash.plot.ly/dash-core-components/rangeslider). Пример ползунка отлично работает в моей среде. Когда я заменяю минимальные, максимальные значения дляползунок с минимальным и максимальным значениями даты в моем фрейме данных выглядит следующим образом:

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div([
    dcc.RangeSlider(
        id='slider',
        min = df['date'].min(),
        max = df['date'].max()
    ),
    html.Div(id='slider-container')
])

мой браузер выдает следующую ошибку: «Ошибка загрузки зависимостей». «date» в моем фрейме данных - это pandas._libs.tslibs.timestamps.Timestamp

Я удалил и переустановил dash, dash-рендерер, dash-html-компоненты, dash-core-компоненты и график в соответствии с https://github.com/plotly/dash/issues/82

Любые предложенияна что идет не так? Полный код для моего примера:

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div([
    dcc.RangeSlider(
        id='slider',
        min = df['date'].min(),
        max = df['date'].max()
    ),
    html.Div(id='slider-container') ])


@app.callback(
    dash.dependencies.Output('slider-container', 'children'),
    [dash.dependencies.Input('slider', 'value')])
def update_output(value):
    return 'You have selected "{}"'.format(value)


if __name__ == '__main__':
    app.run_server(debug=True)

И это прекрасно работает, если значения ползунка установлены на:

    dcc.RangeSlider(
        id='slider',
        min=0,
        max=20,
        step=0.5,
        value=[5, 15]

1 Ответ

0 голосов
/ 17 февраля 2019

Кажется, что RangeSlider не может работать напрямую с Timestamp объектами.Вам нужно преобразовать их в числовые ( POSIX ) временные метки для работы со слайдером и снова преобразовать их в объекты внутри функции обратного вызова.

Для меня сработало следующее:

import dash
import dash_core_components as dcc
import dash_html_components as html
import numpy as np
import pandas as pd

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

# Demo dataframe with a 'date' column
df = pd.DataFrame({'date': pd.to_datetime(np.linspace(1500000000, 1550000000, 9), unit='s')})

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div([
    dcc.RangeSlider(
        id='slider',
        min=df['date'].min().timestamp(),
        max=df['date'].max().timestamp(),
        value=[df['date'].min().timestamp(), df['date'].max().timestamp()],
    ),
    html.Div(id='slider-container')
])


@app.callback(
    dash.dependencies.Output('slider-container', 'children'),
    [dash.dependencies.Input('slider', 'value')])
def update_output(value):
    if value:
        return 'You have selected "{}"'.format(list(pd.to_datetime(value, unit='s')))


if __name__ == '__main__':
    app.run_server(debug=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...