-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Minified React Error #31 #998
Labels
bug
Something isn't working
Milestone
Comments
# TODO: pydoc
import logging
from typing import Tuple, Callable, Any
from deephaven import ui, dtypes
from deephaven.table import Table, PartitionedTable
from deephaven.plot.figure import Figure
# This function is to avoid UI bugs in rendering tables with non-primitive columns
# TODO: https://github.com/deephaven/deephaven-plugins/issues/701
# TODO: https://github.com/deephaven/deephaven-core/issues/5708
def _retain_primitive_cols(name: str, table: Table) -> Table:
"""Return a new table with only primitive columns.
This function is to avoid UI bugs in rendering tables with non-primitive columns.
Args:
name (str): The name of the table.
table (Table): The table to filter.
"""
def retain_col(col):
retain = col.data_type.is_primitive or col.data_type in [dtypes.string, dtypes.bool_, dtypes.Instant]
if not retain:
logging.warning(f"REMOVING COLUMN FOR VISUALIZATION: table={name} column={col.name} type={col.data_type}.")
return retain
return table.view([col.name for col in table.columns if retain_col(col)])
def null_note(t: Table, note: str, func: Callable[[], Any]) -> Any:
""" Return a note if the table is empty; otherwise, return the element from the function. """
return func() if t else ui.text(note)
# TODO: this is commented out because it fails if it is not
# @ui.component
def _symbol_picker(table: PartitionedTable, label: str = "Symbol") -> Tuple[ui.Element, str]:
symbol_table = ui.use_memo(lambda: table.table.view("symbol").select_distinct().sort("symbol"), [])
symbol, set_symbol = ui.use_state("")
pick_table = ui.picker(
symbol_table,
label=label,
on_change=set_symbol,
selected_key=symbol,
)
text = ui.text_field(
value=symbol,
on_change=set_symbol,
label=label,
)
return ui.flex(pick_table, text), symbol
@ui.component
def _tab_table_view(tables: dict[str, PartitionedTable], symbol: str) -> ui.BaseElement:
def make_component(table):
t = table.get_constituent([symbol])
return null_note(t, f"No data for {symbol}", lambda: t)
return ui.stack([ui.panel(make_component(table), title=name) for name, table in tables.items()])
@ui.component
def plot_shares(shares: Table) -> Figure:
p = Figure()
for col in shares.columns:
if "shares_" in col.name and "dilution_factor" not in col.name:
p = p.plot_xy(col.name, shares, x="timestamp", y=col.name)
return p.show()
@ui.component
def plot_prices(prices: Table) -> Figure:
return (
Figure()
.plot_xy("close_split_div_adj", prices, x="timestamp", y="close_split_div_adj")
.y_axis(log=True)
.show()
)
@ui.component
def plot_fundamentals(fundamentals: Table, series: str):
return (
Figure()
.plot_xy(series, fundamentals, x="timestamp", y=series)
.show()
)
@ui.component
def plot_model_preds(model_preds: Table, symbol: str) -> Figure:
if model_preds.size == 0:
return ui.text(f"No model predictions for {symbol}")
model_preds = model_preds.update_view([
"pred_price_sdp = pred_price + pred_price_stdev_uncorr", # TODO: which stdev?
"pred_price_sdm = pred_price - pred_price_stdev_uncorr", # TODO: which stdev?
])
return (
Figure()
.plot_xy("Pred", t=model_preds, x="pred_time", y="pred_price",
y_low="pred_price_sdm", y_high="pred_price_sdp", by=["full_name"])
.y_axis(log=True)
)
@ui.component
def plot_meta_preds(meta_preds: Table, symbol: str) -> Figure:
if meta_preds.size == 0:
return ui.text(f"No meta predictions for {symbol}")
meta = (
meta_preds
.update_view([
"full_name = stdev_calc + `_` + meta_weights_func",
"pred_price_sdp = pred_price + pred_price_stdev",
"pred_price_sdm = pred_price - pred_price_stdev",
])
)
#TODO: DEBUG
mx = meta.select_distinct("full_name")
# print("META FULL NAME", mx)
for v in mx.iter_tuple("full_name"):
print("META FULL NAME", v)
p = Figure()
p = p.plot_xy("Meta", t=meta, x="pred_time", y="pred_price", y_low="pred_price_sdm", y_high="pred_price_sdp", by=["full_name"])
p = p.y_axis(log=True)
return p.show()
@ui.component
def _input_plots(tables: dict[str, PartitionedTable], symbol: str) -> ui.BaseElement:
# TODO: this doesn't work --> need to have calls to the same number of hooks
# if not symbol:
# return ui.panel(ui.text("Select a symbol"))
# TODO: filter on date
shares = tables["shares"].get_constituent([symbol])
prices = tables["prices"].get_constituent([symbol])
fundamentals = tables["fundamentals"].get_constituent([symbol])
model_preds = tables["model_preds"].get_constituent([symbol])
meta_preds = tables["meta_preds"].get_constituent([symbol])
error_msg = f"No data for {symbol}"
outputs = []
outputs.append(ui.panel(null_note(shares, error_msg, lambda: plot_shares(shares)), title="shares"))
outputs.append(ui.panel(null_note(prices, error_msg, lambda: plot_prices(prices)), title="prices"))
for col in tables["fundamentals"].constituent_table_columns:
if col.name in ["date", "timestamp", "symbol"]:
continue
outputs.append(ui.panel(null_note(fundamentals, error_msg, lambda: plot_fundamentals(fundamentals, col.name)), title=col.name))
outputs.append(ui.panel(null_note(model_preds, error_msg, lambda: plot_model_preds(model_preds.where("active"), symbol)), title="model_preds_active"))
outputs.append(ui.panel(null_note(model_preds, error_msg, lambda: plot_model_preds(model_preds.where("!active"), symbol)), title="model_preds_inactive"))
outputs.append(ui.panel(null_note(meta_preds, error_msg, lambda: plot_meta_preds(meta_preds, symbol)), title="meta_preds"))
return ui.stack(
*outputs,
)
@ui.component
def my_panel(tables: dict[str, PartitionedTable]) -> ui.BaseElement:
model_preds = tables["model_preds"]
symbol_picker, symbol = _symbol_picker(model_preds, label="Symbol")
# TODO: thinks this should be fine --> Doesn't work because new stuff is garbage at the bottom
# if not symbol:
# return ui.column(symbol_picker)
ttv = _tab_table_view(tables, symbol)
ip = _input_plots(tables, symbol)
return ui.column(
symbol_picker,
ttv,
ip,
)
def my_dashboard(tables: dict[str, Table]) -> ui.DashboardElement:
part_tables = {name: _retain_primitive_cols(name, table).partition_by("symbol") for name, table in tables.items()}
return ui.dashboard(my_panel(part_tables)) # TODO: Bad type hint or should fail
if __name__ == "__main__":
from cecropia.lynchmunger import cli
globals().update(cli.debug_values)
dashboard = my_dashboard(cli.debug_values) |
|
|
The error seems to be related to these lines. If the lines are commented out, it seems to run without errors. outputs.append(ui.panel(null_note(model_preds, error_msg, lambda: plot_model_preds(model_preds.where("active"), symbol)), title="model_preds_active"))
outputs.append(ui.panel(null_note(model_preds, error_msg, lambda: plot_model_preds(model_preds.where("!active"), symbol)), title="model_preds_inactive")) in # TODO: pydoc
import logging
from typing import Tuple, Callable, Any
from deephaven import ui, dtypes
from deephaven.table import Table, PartitionedTable
from deephaven.plot.figure import Figure
# This function is to avoid UI bugs in rendering tables with non-primitive columns
# TODO: https://github.com/deephaven/deephaven-plugins/issues/701
# TODO: https://github.com/deephaven/deephaven-core/issues/5708
def _retain_primitive_cols(name: str, table: Table) -> Table:
"""Return a new table with only primitive columns.
This function is to avoid UI bugs in rendering tables with non-primitive columns.
Args:
name (str): The name of the table.
table (Table): The table to filter.
"""
def retain_col(col):
retain = col.data_type.is_primitive or col.data_type in [dtypes.string, dtypes.bool_, dtypes.Instant]
if not retain:
logging.warning(f"REMOVING COLUMN FOR VISUALIZATION: table={name} column={col.name} type={col.data_type}.")
return retain
return table.view([col.name for col in table.columns if retain_col(col)])
def null_note(t: Table, note: str, func: Callable[[], Any]) -> Any:
""" Return a note if the table is empty; otherwise, return the element from the function. """
return func() if t else ui.text(note)
# TODO: this is commented out because it fails if it is not
# @ui.component
def _symbol_picker(table: PartitionedTable, label: str = "Symbol") -> Tuple[ui.Element, str]:
symbol_table = ui.use_memo(lambda: table.table.view("symbol").select_distinct().sort("symbol"), [])
symbol, set_symbol = ui.use_state("")
pick_table = ui.picker(
symbol_table,
label=label,
on_change=set_symbol,
selected_key=symbol,
)
text = ui.text_field(
value=symbol,
on_change=set_symbol,
label=label,
)
return ui.flex(pick_table, text), symbol
@ui.component
def _tab_table_view(tables: dict[str, PartitionedTable], symbol: str) -> ui.BaseElement:
def make_component(table):
t = table.get_constituent([symbol])
return null_note(t, f"No data for {symbol}", lambda: t)
return ui.stack([ui.panel(make_component(table), title=name) for name, table in tables.items()])
@ui.component
def plot_shares(shares: Table) -> Figure:
p = Figure()
for col in shares.columns:
if "shares_" in col.name and "dilution_factor" not in col.name:
p = p.plot_xy(col.name, shares, x="timestamp", y=col.name)
return p.show()
@ui.component
def plot_prices(prices: Table) -> Figure:
return (
Figure()
.plot_xy("close_split_div_adj", prices, x="timestamp", y="close_split_div_adj")
.y_axis(log=True)
.show()
)
@ui.component
def plot_fundamentals(fundamentals: Table, series: str):
return (
Figure()
.plot_xy(series, fundamentals, x="timestamp", y=series)
.show()
)
@ui.component
def plot_model_preds(model_preds: Table, symbol: str) -> Figure:
if model_preds.size == 0:
return ui.text(f"No model predictions for {symbol}")
model_preds = model_preds.update_view([
"pred_price_sdp = pred_price + pred_price_stdev_uncorr", # TODO: which stdev?
"pred_price_sdm = pred_price - pred_price_stdev_uncorr", # TODO: which stdev?
])
return (
Figure()
.plot_xy("Pred", t=model_preds, x="pred_time", y="pred_price",
y_low="pred_price_sdm", y_high="pred_price_sdp", by=["full_name"])
.y_axis(log=True)
)
@ui.component
def plot_meta_preds(meta_preds: Table, symbol: str) -> Figure:
if meta_preds.size == 0:
return ui.text(f"No meta predictions for {symbol}")
meta = (
meta_preds
.update_view([
"full_name = stdev_calc + `_` + meta_weights_func",
"pred_price_sdp = pred_price + pred_price_stdev",
"pred_price_sdm = pred_price - pred_price_stdev",
])
)
meta = meta.where("full_name == `uncorr_equal`").select()
#TODO: DEBUG
mx = meta.select_distinct("full_name")
for v in mx.iter_tuple("full_name"):
print("META FULL NAME", v)
for col in meta.columns:
print("META COL", col)
p = Figure()
# p = p.plot_xy("Meta", t=meta, x="pred_time", y="pred_price", y_low="pred_price_sdm", y_high="pred_price_sdp", by=["full_name"])
p = p.plot_xy("Meta", t=meta, x="pred_time", y="pred_price", y_low="pred_price_sdm", y_high="pred_price_sdp")
p = p.y_axis(log=True)
return p.show()
@ui.component
def _input_plots(tables: dict[str, PartitionedTable], symbol: str) -> ui.BaseElement:
# TODO: this doesn't work --> need to have calls to the same number of hooks
# if not symbol:
# return ui.panel(ui.text("Select a symbol"))
# TODO: filter on date
shares = tables["shares"].get_constituent([symbol])
prices = tables["prices"].get_constituent([symbol])
fundamentals = tables["fundamentals"].get_constituent([symbol])
model_preds = tables["model_preds"].get_constituent([symbol])
meta_preds = tables["meta_preds"].get_constituent([symbol])
error_msg = f"No data for {symbol}"
outputs = []
outputs.append(ui.panel(null_note(shares, error_msg, lambda: plot_shares(shares)), title="shares"))
outputs.append(ui.panel(null_note(prices, error_msg, lambda: plot_prices(prices)), title="prices"))
for col in tables["fundamentals"].constituent_table_columns:
if col.name in ["date", "timestamp", "symbol"]:
continue
outputs.append(ui.panel(null_note(fundamentals, error_msg, lambda: plot_fundamentals(fundamentals, col.name)), title=col.name))
outputs.append(ui.panel(null_note(model_preds, error_msg, lambda: plot_model_preds(model_preds.where("active"), symbol)), title="model_preds_active"))
outputs.append(ui.panel(null_note(model_preds, error_msg, lambda: plot_model_preds(model_preds.where("!active"), symbol)), title="model_preds_inactive"))
outputs.append(ui.panel(null_note(meta_preds, error_msg, lambda: plot_meta_preds(meta_preds, symbol)), title="meta_preds"))
return ui.stack(
*outputs,
)
@ui.component
def my_panel(tables: dict[str, PartitionedTable]) -> ui.BaseElement:
model_preds = tables["model_preds"]
symbol_picker, symbol = _symbol_picker(model_preds, label="Symbol")
# TODO: thinks this should be fine --> Doesn't work because new stuff is garbage at the bottom
# if not symbol:
# return ui.column(symbol_picker)
ttv = _tab_table_view(tables, symbol)
ip = _input_plots(tables, symbol)
return ui.column(
symbol_picker,
ttv,
ip,
)
def my_dashboard(tables: dict[str, Table]) -> ui.DashboardElement:
part_tables = {name: _retain_primitive_cols(name, table).partition_by("symbol") for name, table in tables.items()}
return ui.dashboard(my_panel(part_tables)) # TODO: Bad type hint or should fail
if __name__ == "__main__":
from cecropia.lynchmunger import cli
globals().update(cli.debug_values)
dashboard = my_dashboard(cli.debug_values) |
If you set |
I have found the problem. On line 122, the plot generation is missing See #997 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The text was updated successfully, but these errors were encountered: