Использование стиля Pandas (свойство DataFrame.style) для перебора цен на товары - PullRequest
0 голосов
/ 09 мая 2020

У меня есть Pandas фрейм данных, который содержит данные о ценах на различные продукты, взятые в разные даты, столбцы: «дата», «продукт», «цена».

Моя цель - выделить ценовая ячейка, в которой произошло снижение цены на этот конкретный продукт. Примерно так же, как этот пример .csv, показанный ниже…

Пример .csv, показывающий, чего я хочу достичь с помощью Pandas Styling

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

'' '

integer = 0

for iteration in range(iterations):   

    first_price_pair = one_product.iloc[integer,2] 
    integer=integer+1
    second_price_pair = one_product.iloc[integer,2] 

# one_product is selected by using .drop_duplicates() on 'product'


price_dif = first_price_pair - second_price_pair                                

    if second_price_pair < first_price_pair:
        # highlight cell green - INDICATES PRICE REDUCTION FROM PREV PRICE                                

    elif second_price_pair == first_price_pair:         
        # no change to cell colour  

    elif second_price_pair > first_price_pair:
        # highlight cell RED - INDICATES PRICE INCREASE FROM PREV PRICE

' ''

Моя проблема в том, когда я пытаюсь использовать - DataFrame.style - для применения выделения. Похоже, что после применения стиля к DF, DF затем преобразуется в тип: pandas .io.formats.style.Styler - и это не может быть изменено.

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

Спасибо!

1 Ответ

0 голосов
/ 09 мая 2020

Чтобы применить выделение, вы можете использовать:

Styler.applymap()
Styler.apply()

Разница между ними заключается в том, как вы хотите выбирать элементы, поскольку applymap () работает поэлементно, а apply () работает с столбцом - / row- / table -wise.

Оба метода требуют, чтобы функция генерировала атрибуты CSS, которые вы хотите изменить. В вашем случае, если вы поместите его в оператор if, это может быть примерно так:

import pandas as pd
df = pd.DataFrame(np.random.randint(-4,4, size=(5,5)))
def background_cell(x, row_idx, col_idx, color):
    b_color = 'background-color: green'
    df_styler = pd.DataFrame('', index=x.index, columns=x.columns)
    df_styler.iloc[row_idx, col_idx] = b_color
    return df_styler

df.style.apply(background_cell, row_idx=1, col_idx=1, color='green', axis=None)

Это изменит фон ячейки [1,1]. Вы можете вызвать df.style.apply () с другим цветом и индексом ячейки, которую хотите изменить.

Я думаю, вы переписали Styler в переменной DataFrame, набрав df = df.style.apply (...) вот почему вы его потеряли и больше не могли его модифицировать. Стиль - это метод, который вы можете использовать для отображения DataFrame, поэтому вам следует использовать его всякий раз, когда вы его печатаете, хотя он не будет атрибутом самого DataFrame.

...