Python Dash (Plotly): TypeError: unhashable тип: 'Div' - PullRequest
0 голосов
/ 28 сентября 2018

вот код: он запускается на cmd, но результат, который я вижу в браузере, является ошибкой.

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.graph_objs as go
import datetime

df = pd.read_excel("stats.xlsx",sheet_name=0)

app = dash.Dash()
app.config['suppress_callback_exceptions'] = True
app.css.append_css({
    'external_url': 'https://cdn.rawgit.com/plotly/dash-app-stylesheets/2d266c578d2a6e8850ebce48fdb52759b2aef506/stylesheet-oil-and-gas.css',
})  # noqa: E501

app.layout = html.Div(
    html.Div([
        html.Div([
            html.H1(children='PERFORMANCE REPORT AUGUST',
                style={
                'color':'#36A9DE'
                        }, className='nine columns'),
                html.Img(
                    src="https://media.go2speed.org/brand/files/sevengames/804/asdpree.png",
                    className='three columns',
                    style={
                        'height': '12%',
                        'width': '12%',
                        'float': 'right',
                        'position': 'relative',
                        'padding-top': 0,
                        'padding-right': 0
                        },
                        ),
                html.Div(children='''*Created using Plotly Dash Python framework''',
                        className='nine columns'
                        )
                    ], className="row"
                )
            ]),

        html.Div([
            html.Div([
                dcc.Graph(
                    id='example-graph'
                    )], className='six columns'
                    )
                ], className='row'
                )
                    )

@app.callback(
    dash.dependencies.Output('example-graph', 'figure'))

def update_example_graph():
    data=go.Scatter(
        x=pd.to_datetime(df['date'].apply(lambda x: datetime.datetime.strftime(x,'%Y-%m-%d'))),
        y=round((df['revenue']-df['cost']),2),
        mode = 'markers',
        marker={
            'size': 10,
            'color': '#36A9DE',
            'line': {'width': 0.5, 'color': '#36A9DE'}
                },
        transforms=[
            dict(
                type='aggregate',
                groups=pd.to_datetime(df['date'].apply(lambda x: datetime.datetime.strftime(x,'%Y-%m-%d'))),
                aggregations=[dict(
                target='y',func='sum',enabled=True),]
                )
                    ]
    )

    return {
    'data':[data],
    'layout':go.Layout(
        xaxis=dict(
            title='Date',
            titlefont=dict(
            family='Helvetica, monospace',
            size=15)),
        yaxis=dict(
            title='Gross Profit',
            titlefont=dict(
                family='Helvetica, monospace',
                size=15))
                        )
            }

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

Это ошибка, которую я получаю при запуске кода выше:

Traceback (most recent call last):
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\_compat.py", line 35, in reraise
    raise value
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1808, in full_dispatch_request
    self.try_trigger_before_first_request_functions()
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1855, in try_trigger_before_first_request_functions
    func()
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\dash\dash.py", line 921, in _setup_server
    self._validate_layout()
File "C:\Users\ifrolova\AppData\Local\Programs\Python\Python37\lib\site-packages\dash\dash.py", line 908, in _validate_layout
    component_ids = {layout_id} if layout_id else set()
TypeError: unhashable type: 'Div'

Не могли бы вы помочь мне понять, что может быть не так?Я проверил все скобки Divs и отступ.

Спасибо.

1 Ответ

0 голосов
/ 23 ноября 2018

В main div вашего layout, чтобы использовать более одного div, вы должны установить все остальные ваши погружения в главном div в series этого основного div.

Ваш код должен быть в точности следующим:

html.Div(
   [
    html.Div([
       html.Div([
          html.H1(children='PERFORMANCE REPORT AUGUST',
            style={
            'color':'#36A9DE'
                    }, className='nine columns'),
            html.Img(
                src="https://media.go2speed.org/brand/files/sevengames/804/asdpree.png",
                className='three columns',
                style={
                    'height': '12%',
                    'width': '12%',
                    'float': 'right',
                    'position': 'relative',
                    'padding-top': 0,
                    'padding-right': 0
                    },
                    ),
            html.Div(children='''*Created using Plotly Dash Python framework''',
                    className='nine columns'
                    )
                ], className="row"
            )
        ]),

    html.Div([
        html.Div([
            dcc.Graph(
                id='example-graph'
                )], className='six columns'
                )
            ], className='row'
            )
   ]
)

Извините, это поздний ответ, я думаю, что вы, вероятно, решили проблему.Но в качестве решения для других людей, которые приняли эту ошибку, я добавляю ее сюда.

...