Условное форматирование ячейки Dash dataTable не работает

Я хочу изменить цвет ячейки Dash dataTable на основе значения. Я попробовал минимальный пример:

            html.Div(
            children=[
                dash_table.DataTable(
                    id='table_1',
                    data=df.to_dict('records'),
                    columns=[{"name": i, "id": i} for i in df.columns],
                    #conditional cell formating
                    style_data_conditional=[
                        {
                            'if': {
                                'column_id': 'col1',
                                'filter': 'col1 > num(15)'
                            },
                            'backgroundColor': '#3D9970',
                            'color': 'white',
                        },
                    ],
                    n_fixed_rows=2,
                    filtering=True,
                    sorting=True,
                    sorting_type="multi"
                )],
        )

После добавления style_conditional таблица вообще не отображается, и сообщение об ошибке не выдается. Таблица встроена в компонент html, и, просмотрев форумы и гитхаб, я все еще не уверен, что я что-то здесь пропустил, и нужно ли мне для этого писать обратный вызов. Пример, представленный в упомянутом руководство, не предполагает необходимости обратного вызова.

Обновлять:

Пытался запустить минимальную версию с тем же кодом и другими данными, с теми же результатами, то есть без изменения цвета ячеек. Мои библиотеки обновлены, но что-то в среде может вызывать проблемы.

Полный код:

import dash
import dash_table
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')

# Having trouble with conditional when column name has spaces
df = df.rename({'Number of Solar Plants': 'Plants'}, axis='columns')
app = dash.Dash(__name__)

app.layout = dash_table.DataTable(
    id='table',
    columns=[{"name": i, "id": i} for i in df.columns],
    style_data_conditional=[{
        "if": {'column_id': 'State',
               'filter': 'State eq "Nevada"'
               },
        "backgroundColor": "#3D9970",
        "color": "white"
    }],
    data=df.to_dict('records'),
)

if __name__ == '__main__':
    app.run_server(debug=True)
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
6
0
6 537
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не думаю, что вам понадобится обратный вызов для этого, как сказано в учебнике. Судя по последнему примеру урока, я думаю, что у вас опечатка (один слишком много).

Изменить эту строку

'filter': 'col1' > num(15)' 

к:

'filter': 'col1 > num(15)'

Спасибо, я отредактирую свои вопросы, здесь опечатка, и код был таким, как вы предложили.

TeilaRei 22.05.2019 17:11

У меня была та же проблема, и я обнаружил, что указывать индекс напрямую, а не условие, было намного проще.

style_data_conditional = [{'if': {'column_id': 'col1',"row_index": x},'backgroundColor': '#3D9970','color': 'white'} for x in df[df['col1']>15].index ]

это уродливо, так как это было жестко запрограммировано, но это помогло мне, когда прямой фильтр не сделал этого.

Спасибо за предложение, у меня оно не сработало, так как набор данных динамически заполняется и часто меняется.

TeilaRei 24.05.2019 19:13

ну, каждый раз, когда вы меняете набор данных, он генерирует событие, обратный вызов, обновляющий style_data_conditionnal, был бы исправлением (хоть и неоптимальным). я не нашел никакого способа сделать это иначе на данный момент.

Frayal 24.05.2019 19:21
Ответ принят как подходящий

Не знаю, как было в 2019 году, но с последними релизами Таблицы данных Dash:

  1. Имена столбцов в выражениях фильтра должны быть заключены в фигурные скобки.
  2. filter был переименован в filter_query
style_data_conditional=[{
    "if": {
        'column_id': 'State',
        'filter_query': '{State} eq "Nevada"'
        #                ^     ^ <-- required braces
    },
    "backgroundColor": "#3D9970",
    "color": "white"
}]

Кстати: вы можете выделить всю строку, удалив строку column_id.

если вам интересно, Dash добавил несколько функций в условное форматирование DataTable, поэтому я сделал учебник, чтобы помочь другим понять все функции и синтаксис форматирования.

https://youtu.be/S8ZcErBpfYE

Conditional Formatting DataTable

Другие вопросы по теме