beakerx
beakerx copied to clipboard
Table setFontColorProvider is off by one
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?
ping
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
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]
do you mean sth like that doesn't work for you?

can you send your example ?
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:

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

The problem is related with the #7994