import panel as pn from sidebar import SideNavBar from sqlalchemy import create_engine import appComponents import db_operation as db pn.extension('mathjax') pn.extension('plotly') pn.extension('tabulator') db_url = 'sqlite:///instance/local.db' engine = create_engine(db_url) analytic_p = db.get_portfolio_analytic_df() analytic_b = db.get_benchmark_analytic_df() if len(analytic_p) == 0: app = [ pn.pane.Str('No portfolio data found, please update portfolio first')] else: stock_overview = appComponents.BestAndWorstStocks( analytic_df=analytic_p) composation_card = appComponents.PortfolioComposationCard( analytic_p) monthly_return_card = appComponents.HistReturnCard( calculated_p_stock=analytic_p, calculated_b_stock=analytic_b) total_return_card = appComponents.TotalReturnCard(name='Range', b_stock_df=analytic_b, p_stock_df=analytic_p, value=(0, 20)) drawdown_card = appComponents.DrawDownCard( calculated_p_stock=analytic_p) top_header = appComponents.TopHeader( eval_df=analytic_p, ) app = [pn.Row(top_header), pn.Row( pn.Column(monthly_return_card, stock_overview, width=500, margin=(10, 10, 10, 10)), pn.Column(total_return_card, drawdown_card, margin=(10, 10, 10, 10)), pn.Column(composation_card, margin=(10, 10, 10, 10)), )] template = pn.template.FastListTemplate( title="Portfolio一览", # sidebar=[freq, phase], ) template.sidebar.append(SideNavBar()) # template.main.extend([drawdown_card, stock_overview, composation_card, monthly_return_card, total_return_card]) template.main.extend(app) template.servable()