Условное форматирование в python для каждого набора данных в списке с добавлением шестнадцатеричных цветов

Я ищу способ условного форматирования на основе чисел/процентов в списке, условное форматирование вывода должно быть шестнадцатеричным цветом.

Например, в приведенных ниже данных есть 3 полностью уникальных "набора данных", которые создаются row[0] + row[1] каждый набором данных будет анализироваться отдельно.

Данные в виде списка (текущий макет)

[['UniqueData1', 'UniqueTest1', '13', '13.39%', '42.7%', 'Data'], ['UniqueData1', 'UniqueTest1', '14', '82%', '41.9%', 'Data'], ['UniqueData1', 'UniqueTest1', '18', '29.39%', '41%', 'Data'], ['UniqueData2', 'UniqueTest2', '22.3', '44.4%', '42.3%', 'Data'], ['UniqueData2', 'UniqueTest2', '4', '44.2%', '43.4%', 'Data'], ['UniqueData2', 'UniqueTest2', '4.1', '49%', '42.7%', 'Data'], ['UniqueData3', 'UniqueTest1', '4.45', '49.5%', '42.42%', 'Data'], ['UniqueData3', 'UniqueTest1', '4.29', '20%', '42.3%', 'Data'], ['UniqueData3', 'UniqueTest1', '4.22', '25%', '41.2%', 'Data']]

Желаемым результатом будет то, что приведенное выше появится с добавленными столбцами в каждой строке данных, например:

['UniqueData3', 'UniqueTest1', '4.22', '25%', '41.2%', 'Data']

Может превратиться в:

['UniqueData3', 'UniqueTest1', '4.22', '25%', '41.2%', 'Data', '#d23f3f', '#db8a2e', '#4ea157']

Где #d23f3f относится к 4.22, а #db8a2e относится к 25%, а #4ea157 относится к 41.2% Обратите внимание, что шестнадцатеричные цвета приведены только для примера

Любые идеи?

РЕДАКТИРОВАТЬ: данные в формате CSV, чтобы их было легко читать :)

UniqueData1,UniqueTest1,13,13.39%,42.7%,Data
UniqueData1,UniqueTest1,14,82%,41.9%,Data
UniqueData1,UniqueTest1,18,29.39%,41%,Data
UniqueData2,UniqueTest2,22.3,44.4%,42.3%,Data
UniqueData2,UniqueTest2,4,44.2%,43.4%,Data
UniqueData2,UniqueTest2,4.1,49%,42.7%,Data
UniqueData3,UniqueTest1,4.45,49.5%,42.42%,Data
UniqueData3,UniqueTest1,4.29,20%,42.3%,Data
UniqueData3,UniqueTest1,4.22,25%,41.2%,Data

Например, в Excel это будет выглядеть так:

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

Что в итоге выглядит так:

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

Ожидаемый результат:

[['UniqueData1', 'UniqueTest1', '13', '13.39%', '42.70%', 'Data', '#F8696B', '#F8696B', '#63BE7B'], ['UniqueData1', 'UniqueTest1', '14', '82%', '41.90%', 'Data', '#FFEB84', '#63BE7B', '#FFEB84'], ['UniqueData1', 'UniqueTest1', '18', '29.39%', '41%', 'Data', '#63BE7B', '#FFEB84', '#F8696B'], ['UniqueData2', 'UniqueTest2', '22.3', '44.40%', '42.30%', 'Data', '#63BE7B', '#FFEB84', '#F8696B'], ['UniqueData2', 'UniqueTest2', '4', '44.20%', '43.40%', 'Data', '#F8696B', '#F8696B', '#63BE7B'], ['UniqueData2', 'UniqueTest2', '4.1', '49%', '42.70%', 'Data', '#FFEB84', '#63BE7B', '#FFEB84'], ['UniqueData3', 'UniqueTest1', '4.45', '49.50%', '42.42%', 'Data', '#63BE7B', '#63BE7B', '#63BE7B'], ['UniqueData3', 'UniqueTest1', '4.29', '20%', '42.30%', 'Data', '#FFEB84', '#F8696B', '#FFEB84'], ['UniqueData3', 'UniqueTest1', '4.22', '25%', '41.20%', 'Data', '#F8696B', '#FFEB84', '#F8696B']]

В визуальном плане (строго для галочки)

UniqueData1,UniqueTest1,13,13.39%,42.70%,Data,#F8696B,#F8696B,#63BE7B
UniqueData1,UniqueTest1,14,82%,41.90%,Data,#FFEB84,#63BE7B,#FFEB84
UniqueData1,UniqueTest1,18,29.39%,41%,Data,#63BE7B,#FFEB84,#F8696B
UniqueData2,UniqueTest2,22.3,44.40%,42.30%,Data,#63BE7B,#FFEB84,#F8696B
UniqueData2,UniqueTest2,4,44.20%,43.40%,Data,#F8696B,#F8696B,#63BE7B
UniqueData2,UniqueTest2,4.1,49%,42.70%,Data,#FFEB84,#63BE7B,#FFEB84
UniqueData3,UniqueTest1,4.45,49.50%,42.42%,Data,#63BE7B,#63BE7B,#63BE7B
UniqueData3,UniqueTest1,4.29,20%,42.30%,Data,#FFEB84,#F8696B,#FFEB84
UniqueData3,UniqueTest1,4.22,25%,41.20%,Data,#F8696B,#FFEB84,#F8696B

Ответ M4tini ниже очень близок к тому, что мне нужно, просто ищу способ игнорировать или принудительно использовать другой цвет для определенных значений.


person Ryflex    schedule 13.12.2013    source источник
comment
Где я могу получить связь между этими числами и шестнадцатеричными значениями?   -  person thefourtheye    schedule 13.12.2013
comment
@thefourtheye В Excel, например: i.imgur.com/PIpqdXx.png, что в конечном итоге выглядит как если разделить: i.imgur.com/nY1EFti.png   -  person Ryflex    schedule 13.12.2013
comment
Есть ли какая-то особая связь между числами\цветами, или они просто используются для визуального группирования похожих значений?   -  person M4rtini    schedule 13.12.2013
comment
@M4rtini Нет никаких особых отношений, они сгруппированы по набору данных, который является уникальной группой, определенной путем слияния строк [0] и строк [1], что в моем примере дает мне 3 уникальные группы, им просто дается визуальная цветовая схема. точно так же, как Excel дает наибольшее число зеленым, наименьшее красным, но по шкале градиента.   -  person Ryflex    schedule 13.12.2013
comment
@M4rtini Я добавил свой ожидаемый вывод и пример вывода csv (я не хочу, чтобы он выводился в csv, я хочу, чтобы он попал в список, как показано)   -  person Ryflex    schedule 13.12.2013


Ответы (2)


Это вроде работает, функцию mapValues ​​нужно изменить, чтобы она соответствовала excel. Я не знаю, какой метод они используют, по крайней мере, этот мне показался логичным. И, безусловно, есть более эффективные\красивые способы сделать это.

def mapValues(values):
    values = [float(i.split('%')[0]) for i in values]
    colorMap = np.array(['#F8696B', '#FFEB84', '#63BE7B'])
    #colorMap = np.array(["low", "mid", "high"])
    values = np.asarray(values)
    _, bins = np.histogram(values, 2)
    mapped = np.digitize(values, bins)
    return list(colorMap[mapped - 1])

def mapAndAdd(finalList, tempList, v1,v2,v3):
    v1 = mapValues(v1)
    v2 = mapValues(v2)
    v3 = mapValues(v3)
    for i,j in enumerate(newList):
        finalList.append(j + [v1[i] , v2[i] , v3[i]])


uniqueDataSet = set()

finalList = []
for index, DataSet in enumerate(lst):
    if (DataSet[0] + DataSet[1]) in uniqueDataSet:
        v1.append(DataSet[2])
        v2.append(DataSet[3])
        v3.append(DataSet[4])
        newList.append(DataSet)
    else:
        if (index != 0):
            mapAndAdd(finalList, newList, v1,v2,v3)

        uniqueDataSet.add(DataSet[0] + DataSet[1])
        newList = [DataSet]
        v1 = [DataSet[2]]
        v2 = [DataSet[3]]
        v3 = [DataSet[4]]

mapAndAdd(finalList, newList, v1,v2,v3)
person M4rtini    schedule 13.12.2013
comment
Это довольно близко к тому, что мне нужно, однако у него только три цвета, я ищу его для автоматического создания градиента на основе чисел, например: i.imgur.com/qvvbC2y.png или, например, преобразование данных моего примера в 1 набор данных выглядит так: i.imgur.com/7JxkWgu.png - person Ryflex; 14.12.2013
comment
Простого добавления дополнительных бинов и цветов в функцию mapValues ​​может быть достаточно. - person M4rtini; 14.12.2013
comment
@ M4tini наборы данных различаются по размеру, будет ли отображаться правильный цвет в зависимости от размера? - person Ryflex; 14.12.2013
comment
Да. Он создает гистограмму значений для каждого уникального набора данных. Затем выясняет, в какую ячейку было помещено каждое значение, и сопоставляет номер ячейки со значением. Так что да, размер набора данных не должен иметь значения. - person M4rtini; 14.12.2013
comment
@ M4tini M4tini, есть ли способ легко создать список цветовых градиентов от 1 до 100 из файла Excel, чтобы мне не приходилось вручную просматривать 100 ячеек и брать шестнадцатеричные цвета? - person Ryflex; 14.12.2013
comment
@ M4tini, я добавил 50 шестнадцатеричных цветов, однако я пытаюсь добавить в него дополнительную опцию, чтобы любая ячейка, которая пуста или имеет в ней NA, устанавливалась как собственный цвет ... игнорируя гистограмму. - person Ryflex; 14.12.2013

Вы можете сделать это в Python с помощью XlsxWriter:

worksheet.conditional_format('A1:A12', {'type': '3_color_scale'})

Условное форматирование

См. раздел документации Работа с условными форматами и этот пример программы, демонстрирующий множество доступных функций условного форматирования.

person jmcnamara    schedule 14.12.2013
comment
Дело в том, что условное форматирование не для файла excel, мне просто нужны шестнадцатеричные цветовые коды в формате excel... - person Ryflex; 14.12.2013