beakerx icon indicating copy to clipboard operation
beakerx copied to clipboard

Table setFontColorProvider is off by one

Open tobiaslocker opened this issue 5 years ago • 6 comments
trafficstars

Hello,

I needed to fiddle around with the function to avoid being off by one when returning a Color for a cell like this

table = TableDisplay(df)
table.setStringFormatForTimes(TimeUnit.DAYS)

def color_provider(row, column, table):
    row = table.values[row]
    if column < len(row) - 1:
        val = row[column + 1]
        if val is 3:
            return Color.GREEN
        return Color.BLACK

table.setFontColorProvider(color_provider)

table

is there another attribute than table.values that is meant to be used for that or is it just off by one?

tobiaslocker avatar Dec 02 '19 23:12 tobiaslocker

ping

tobiaslocker avatar Dec 09 '19 08:12 tobiaslocker

Hi @tobiaslocker it looks like you missed else statement for if column < len(row) - 1:

table = TableDisplay(df)
table.setStringFormatForTimes(TimeUnit.DAYS)

def color_provider(row, column, table):
    row = table.values[row]
    if column < len(row) - 1:
        val = row[column + 1]
        if val is 3:
            return Color.GREEN
        return Color.BLACK
    else:
        return Color.BLUE
table.setFontColorProvider(color_provider)

table

jaroslawmalekcodete avatar Dec 10 '19 12:12 jaroslawmalekcodete

Hello @jaroslawmalekcodete

Actually, the if column < len(row) - 1: is needed to avoid an IndexError when accessing row[column + 1] (the actual off by one problem) so the else case is never needed.

To put the problem more clear:

If i want to access a cell with func(row, column, table), this cell is not accessed via table.values[row][column] but with table.values[row][column + 1]

tobiaslocker avatar Dec 10 '19 12:12 tobiaslocker

do you mean sth like that doesn't work for you? Screenshot from 2019-12-10 15-33-48

can you send your example ?

jaroslawmalekcodete avatar Dec 10 '19 14:12 jaroslawmalekcodete

Nope, it doesn't

from beakerx import *
from beakerx.object import beakerx

import pandas as pd

s1 = pd.Series([0, 1, 2], index=pd.date_range('2000', freq='D', periods=3))
s2 = pd.Series([3, 4, 5], index=pd.date_range('2000', freq='D', periods=3))
s3 = pd.Series([6, 7, 8], index=pd.date_range('2000', freq='D', periods=3))

df = pd.concat([s1, s2, s3], axis=1)

def color_provider(row, column, table):
    row = table.values[row]
    val = row[column]
    if val == 3:
        return Color.GREEN
    return Color.BLACK
    
table = TableDisplay(df)
table.setStringFormatForTimes(TimeUnit.DAYS)
table.setFontColorProvider(color_provider)

table

results in:

table1

def color_provider(row, column, table):
    row = table.values[row]
    if column < len(row) - 1:
        val = row[column + 1]
        if val == 3:
            return Color.GREEN
    return Color.BLACK
    
table = TableDisplay(df)
table.setStringFormatForTimes(TimeUnit.DAYS)
table.setFontColorProvider(color_provider)

table

gets it right

table2

tobiaslocker avatar Dec 10 '19 16:12 tobiaslocker

The problem is related with the #7994

jaroslawmalekcodete avatar Dec 12 '19 12:12 jaroslawmalekcodete