def test_multi_index_df_to_jinja_table(): # Create multi-index table idx = np.array([['super1', 'super1', 'super1', 'super1', 'super2', 'super2', 'super2'], ['a', 'a', 'b', 'b', 'c', 'c', 'c'], ['aa', 'aa', 'ba', 'bb', 'ca', 'cb', 'cc']]) idx_tuples = list(zip(*idx)) multi_index = pd.MultiIndex.from_tuples(idx_tuples, names=['super-level', 'a-level', 'aa-level']) columns = ['This is an incredibly long column name', 'column2', 'column3', 'column4', 'column5'] data = pd.DataFrame(np.random.rand(7, 5) * 2 - 1, index=multi_index, columns=columns) fmt_expand_multi_index = tf.FmtExpandMultiIndex(operator=tf.OP_SUM, bold=True, hline_color=colors.DARK_BLUE) fmt_nDecimal = tf.FmtDecimals(n=2) fmt_align_cells = tf.FmtAlignCellContents(alignment='right') fmt_heatmap_1 = tf.FmtHeatmap(columns=['column2', 'column3'], rows=['aa', 'ac'], threshold=0., axis=0) fmt_heatmap_2 = tf.FmtHeatmap(columns=['column4', 'column5'], rows=['ca', 'cc'], threshold=0.3, min_color=colors.PURPLE, max_color=colors.ORANGE) fmt_stripes_bg = tf.FmtStripeBackground(first_color=colors.LIGHT_GREY) fmt_rotate_header = tf.FmtHeader(fixed_width='500px', top_padding='200px') formatters = [fmt_expand_multi_index, fmt_align_cells, fmt_stripes_bg, fmt_heatmap_1, fmt_heatmap_2, fmt_rotate_header, fmt_nDecimal] # Create table table = Block(data, formatters=formatters) filename = 'Multi_index_table.pdf' table.save(filename) # And clean up file afterwards os.remove(filename)
def test_formatters_with_operator_on_df_with_nans_replaces(): df = pd.DataFrame(np.arange(8, dtype=float).reshape(2, 4), index=['a', 'b'], columns=['aa', 'bb', 'cc', 'dd']) df.iloc[0, 0] = np.nan fmt_nan_replace = tf.FmtReplaceNaN() fmt_sum_rows = tf.FmtAppendTotalsRow() fmt_sum_columns = tf.FmtAppendTotalsColumn() b_no_replace = Block(df, formatters=[fmt_sum_rows, fmt_sum_columns], use_default_formatters=False) b_replace = Block(df, formatters=[fmt_nan_replace, fmt_sum_rows, fmt_sum_columns], use_default_formatters=False) assert_series_equal(b_replace.df.iloc[:, -1], b_no_replace.df.iloc[:, -1], check_dtype=False) assert_series_equal(b_replace.df.iloc[-1, :], b_no_replace.df.iloc[-1, :], check_dtype=False)
def test_column_multi_index_df_to_jinja_table(): # Create column multi-index table df = pd.DataFrame(np.arange(12, dtype=float).reshape(3, 4), index=['a', 'b', 'c'], columns=['aa', 'bb', 'cc', 'aa']) df['grouping'] = 'g' df = df.reset_index() df = df.groupby(['grouping', 'index']).sum().unstack() # Create formatters row_css = ['text-align:center', 'text-align:right'] index_col_css = ['background-color: #00FFFF'] * 2 fmt_mi_header = tf.FmtColumnMultiIndexRows(row_css=row_css, index_col_css=index_col_css) # Create table table = Block(df, formatters=[fmt_mi_header]) filename = 'Column_multi_index_table.pdf' table.save(filename) # And clean up file afterwards os.remove(filename)
def test_df_to_jinja_table_add_extra_formatters(): fmt_heatmap = blformat.FmtHeatmap(threshold=0., axis=0) fmt_add_totals_mean = blformat.FmtAppendTotalsRow(row_name='Sum', operator=blformat.OP_SUM, bold=True) fmt_fontsize_20 = blformat.FmtFontsize(fontsize=20) formatters = [fmt_fontsize_20, fmt_heatmap, fmt_add_totals_mean] return Block(FLAT_DATA, formatters=formatters, use_default_formatters=False)
def get_weights_html(self): fmt_pct = tf.FmtPercent(1, apply_to_header_and_index=False) fmt_align = tf.FmtAlignTable("left") fmt_background = tf.FmtStripeBackground( first_color=tf.colors.LIGHT_GREY, second_color=tf.colors.WHITE, header_color=tf.colors.BLACK) targetweights = Block(self.InputList[3], formatters=[fmt_pct, fmt_align, fmt_background], use_default_formatters=False)._repr_html_() targetweights = {'targetweights_table': targetweights} effectiveweights = Block( self.InputList[4], formatters=[fmt_pct, fmt_align, fmt_background], use_default_formatters=False)._repr_html_() effectiveweights = {'effectiveweights_table': effectiveweights} return targetweights, effectiveweights
def test_multi_index_df_to_jinja_table(): # Create multi-index table idx = np.array([['super1', 'super1', 'super1', 'super1', 'super2', 'super2', 'super2'], ['a', 'a', 'b', 'b', 'c', 'c', 'c'], ['aa', 'ab', 'ba', 'bb', 'ca', 'cb', 'cc']]) idx_tuples = list(zip(*idx)) multi_index = pd.MultiIndex.from_tuples(idx_tuples, names=['super-level', 'a-level', 'aa-level']) columns = ['This is an incredibly long column name', 'column2', 'column3', 'column4', 'column5'] data = pd.DataFrame(TABLE_DATA, index=multi_index, columns=columns) fmt_expand_multi_index = blformat.FmtExpandMultiIndex(operator=blformat.OP_SUM, bold=True, hline_color=colors.DARK_BLUE) fmt_ndecimal = blformat.FmtDecimals(n=2) fmt_align_cells = blformat.FmtAlignCellContents(alignment='right') fmt_heatmap_1 = blformat.FmtHeatmap(columns=['column2', 'column3'], rows=['aa', 'ab', 'ac'], threshold=0., axis=0) fmt_heatmap_2 = blformat.FmtHeatmap(columns=['column4', 'column5'], rows=['ca', 'cb', 'cc'], threshold=0.3, min_color=colors.PURPLE, max_color=colors.ORANGE) fmt_rotate_header = blformat.FmtHeader(fixed_width='500px', top_padding='200px') formatters = [fmt_expand_multi_index, fmt_align_cells, fmt_heatmap_1, fmt_heatmap_2, fmt_rotate_header, fmt_ndecimal] return Block(data, formatters=formatters, use_default_formatters=False)
def get_performance_stats_html(self): pct_rows = [('P&L', 'Total return'), ('P&L', 'Annual return'), ('P&L', 'Annual return (asset mode)'), ('Risk-adjusted return based on Drawdown', 'Max percentage drawdown')] dec_rows = [ ('P&L', 'Starting cash'), ('P&L', 'End value'), ('Risk-adjusted return based on Drawdown', 'Max money drawdown'), # Distribution ('Distribution moments', 'Returns volatility'), ('Distribution moments', 'Returns skewness'), ('Distribution moments', 'Returns kurtosis'), # Risk-adjusted return based on Volatility ('Risk-adjusted return based on Volatility', 'Treynor ratio'), ('Risk-adjusted return based on Volatility', 'Sharpe ratio'), ('Risk-adjusted return based on Volatility', 'Information ratio'), # Risk-adjusted return based on Value at Risk ('Risk-adjusted return based on Value at Risk', 'VaR'), ('Risk-adjusted return based on Value at Risk', 'Expected Shortfall'), ('Risk-adjusted return based on Value at Risk', 'Excess var'), ('Risk-adjusted return based on Value at Risk', 'Conditional sharpe ratio'), # Risk-adjusted return based on Lower Partial Moments ('Risk-adjusted return based on Lower Partial Moments', 'Omega ratio'), ('Risk-adjusted return based on Lower Partial Moments', 'Sortino ratio'), ('Risk-adjusted return based on Lower Partial Moments', 'Kappa three ratio'), ('Risk-adjusted return based on Lower Partial Moments', 'Gain loss ratio'), ('Risk-adjusted return based on Lower Partial Moments', 'Upside potential ratio'), # Risk-adjusted return based on Drawdown ('Risk-adjusted return based on Drawdown', 'Calmar ratio') ] fmt_pct = tf.FmtPercent(1, rows=pct_rows, apply_to_header_and_index=False) fmt_dec = tf.FmtDecimals(2, rows=dec_rows, apply_to_header_and_index=False) fmt_align = tf.FmtAlignTable("left") fmt_background = tf.FmtStripeBackground( first_color=tf.colors.LIGHT_GREY, second_color=tf.colors.WHITE, header_color=tf.colors.BLACK) fmt_multiindex = tf.FmtExpandMultiIndex(operator=tf.OP_NONE) perf_data = Block(self.InputList[2], formatters=[ fmt_multiindex, fmt_pct, fmt_dec, fmt_align, fmt_background ], use_default_formatters=False)._repr_html_() perf_data = {'performance_table': perf_data} return perf_data
def test_df_to_jinja_table_extra_formatters_only(): return Block(FLAT_DATA, formatters=[blformat.FmtHeatmap(threshold=0., axis=0)], use_default_formatters=False)
def test_df_to_jinja_table_default(): return Block(FLAT_DATA, use_default_formatters=False)